Compare commits
2878 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
19675068ea | ||
|
|
c3e41140e0 | ||
|
|
bce379d40d | ||
|
|
8fde8695d0 | ||
|
|
8c1c54d49a | ||
|
|
01e3912827 | ||
|
|
e22f853a31 | ||
|
|
1ae20553ff | ||
|
|
c68eaade94 | ||
|
|
1461b5b357 | ||
|
|
f0dd3b3a39 | ||
|
|
61d724ee2b | ||
|
|
d60c2c5b63 | ||
|
|
7e696cadaf | ||
|
|
0f23bf9d08 | ||
|
|
202d79817a | ||
|
|
a29ce3b0b9 | ||
|
|
fed4842222 | ||
|
|
fbed11e927 | ||
|
|
45ce4013d0 | ||
|
|
6f3d585118 | ||
|
|
962ce7bfa6 | ||
|
|
b6ee157adb | ||
|
|
a45a632726 | ||
|
|
675e15ddca | ||
|
|
f6b9830f82 | ||
|
|
324f6351ea | ||
|
|
aeb6e6498e | ||
|
|
f4ee67c08b | ||
|
|
a2382965f6 | ||
|
|
09dbee1401 | ||
|
|
b74696b312 | ||
|
|
da849085ec | ||
|
|
83a3195e34 | ||
|
|
8148f2a0f7 | ||
|
|
2a03ef0c43 | ||
|
|
0078a8cb8e | ||
|
|
177cea5c5d | ||
|
|
74dc31b10a | ||
|
|
9e07b95223 | ||
|
|
2554433f8d | ||
|
|
e06d61dcc9 | ||
|
|
1aca302518 | ||
|
|
a7d37b7e6c | ||
|
|
9f29898713 | ||
|
|
803719b216 | ||
|
|
6588fc6581 | ||
|
|
9f4d44f0f3 | ||
|
|
07fb5aa88e | ||
|
|
b3e1436074 | ||
|
|
98a083abdd | ||
|
|
86df70a839 | ||
|
|
fd202421b1 | ||
|
|
268f3cc3c2 | ||
|
|
477ebc91bf | ||
|
|
fd6abaff62 | ||
|
|
ccca26d98f | ||
|
|
5ca01bf234 | ||
|
|
d3747f0d4c | ||
|
|
d81b36d897 | ||
|
|
07598e3f2f | ||
|
|
dd5e3b2aba | ||
|
|
06abc43aea | ||
|
|
8b80a42886 | ||
|
|
93fd6c5bd6 | ||
|
|
96aa3ccee0 | ||
|
|
f3a5798a7f | ||
|
|
2b49c300f8 | ||
|
|
50a6071cfc | ||
|
|
044dac6a9e | ||
|
|
7f3f27a91e | ||
|
|
ef24e5ecad | ||
|
|
6f146c6cad | ||
|
|
db5bd7eea8 | ||
|
|
2e315e5516 | ||
|
|
7dd7ccf698 | ||
|
|
a087df0771 | ||
|
|
ba982a73b8 | ||
|
|
c85847567d | ||
|
|
c08aa1f3d6 | ||
|
|
1e3bfba31a | ||
|
|
5788c27aaa | ||
|
|
5c30f4bc9c | ||
|
|
5a9957c578 | ||
|
|
42687fb47e | ||
|
|
9cb55b9745 | ||
|
|
e66ecb6c90 | ||
|
|
04d3c40baa | ||
|
|
0e7c403bd8 | ||
|
|
77e0e46a17 | ||
|
|
b6915a0483 | ||
|
|
1db444b070 | ||
|
|
ae981053b2 | ||
|
|
23f90fcaf4 | ||
|
|
d5b50c038c | ||
|
|
765d9703f5 | ||
|
|
b21c25bccf | ||
|
|
ceae04aa5b | ||
|
|
3abcdf2063 | ||
|
|
f784e893dd | ||
|
|
7e993c15dc | ||
|
|
5411ae777e | ||
|
|
e733b4be1b | ||
|
|
57f9aeee86 | ||
|
|
eabbd2fa32 | ||
|
|
d9aa9b6278 | ||
|
|
1e1b84a201 | ||
|
|
e6753ace87 | ||
|
|
932c32ad8f | ||
|
|
a5fbc07561 | ||
|
|
2631c4f7af | ||
|
|
01304bf734 | ||
|
|
c2c5836752 | ||
|
|
6a15328854 | ||
|
|
dabdd094f9 | ||
|
|
0dd8267e21 | ||
|
|
7b69310f1b | ||
|
|
6f48e7a5ed | ||
|
|
98bca1740c | ||
|
|
51842a61a8 | ||
|
|
78fefdacca | ||
|
|
a1fb3e27ab | ||
|
|
686b892ea9 | ||
|
|
ffcfaf1610 | ||
|
|
80c46bb5a2 | ||
|
|
cb29bee8f5 | ||
|
|
2d42704062 | ||
|
|
2136ae03a5 | ||
|
|
fbe58bec04 | ||
|
|
5f81a0c7f3 | ||
|
|
38804462a9 | ||
|
|
f28eb4027c | ||
|
|
c324dce034 | ||
|
|
0efced4fd8 | ||
|
|
6d6fac00d7 | ||
|
|
d0803ef45c | ||
|
|
0122fb4028 | ||
|
|
2c61fcdfa6 | ||
|
|
18b6c37a89 | ||
|
|
31c294e972 | ||
|
|
b8e3b70fcc | ||
|
|
289e4f29ef | ||
|
|
1482695f6e | ||
|
|
5e51b43367 | ||
|
|
10376ee59d | ||
|
|
f162d815fe | ||
|
|
7f2a529c08 | ||
|
|
968f3ace33 | ||
|
|
2a8fca33ea | ||
|
|
8be948300e | ||
|
|
f2c9c2e5fb | ||
|
|
6ec0ff9442 | ||
|
|
0693480633 | ||
|
|
33842aca14 | ||
|
|
3ddb9d166f | ||
|
|
d17b37cb39 | ||
|
|
c82473ba47 | ||
|
|
b99a0ff618 | ||
|
|
c7000b29a6 | ||
|
|
fac217a836 | ||
|
|
c4c19a204f | ||
|
|
496677725e | ||
|
|
a6523c670f | ||
|
|
879f90ebf4 | ||
|
|
ff2d9c34fd | ||
|
|
8daaea3536 | ||
|
|
cc7aaae52c | ||
|
|
4ce494cc22 | ||
|
|
9461d7a360 | ||
|
|
50854a55f0 | ||
|
|
d03ec3122c | ||
|
|
dd13c305e7 | ||
|
|
48911005aa | ||
|
|
7955b82b1e | ||
|
|
9ff53dd87d | ||
|
|
4487d01a38 | ||
|
|
fd6c6b2aab | ||
|
|
44fdda09c6 | ||
|
|
9bfaecf760 | ||
|
|
39939f8a51 | ||
|
|
7e5c276e7f | ||
|
|
7e8503cde7 | ||
|
|
134fea445c | ||
|
|
3a3548dd63 | ||
|
|
0ef27354be | ||
|
|
ad25cd8074 | ||
|
|
6bc98bbe67 | ||
|
|
5e2dd89d3b | ||
|
|
7830372477 | ||
|
|
425f63c673 | ||
|
|
7523f20d85 | ||
|
|
13cc136fe2 | ||
|
|
c41cbc8bea | ||
|
|
d232d249e9 | ||
|
|
e0a52f4779 | ||
|
|
8d431e5b40 | ||
|
|
dcb1f0b00a | ||
|
|
9b732017a9 | ||
|
|
fd94f8f24b | ||
|
|
814b7458ec | ||
|
|
dc1b073882 | ||
|
|
fad6fe9a2a | ||
|
|
c8eee3b825 | ||
|
|
73b6cc73ff | ||
|
|
2593e96999 | ||
|
|
629999a1cd | ||
|
|
4d3e268972 | ||
|
|
84968c9f73 | ||
|
|
d73b99945f | ||
|
|
1d15316cbb | ||
|
|
913a703d41 | ||
|
|
5d949f6bc0 | ||
|
|
faf64f11f2 | ||
|
|
430c4fa1d0 | ||
|
|
a90f2545d9 | ||
|
|
eba0a96b6d | ||
|
|
f9ffb78b33 | ||
|
|
083f2e38d4 | ||
|
|
7feed8828c | ||
|
|
1f6ef9d9ae | ||
|
|
e6afe584e5 | ||
|
|
76c63443af | ||
|
|
cafd95859f | ||
|
|
b795d97d0e | ||
|
|
ec7379cc86 | ||
|
|
43fe6be13e | ||
|
|
75d4b5b663 | ||
|
|
a7fc1a42ce | ||
|
|
16eef2dd92 | ||
|
|
016823d446 | ||
|
|
0cf9ef66fa | ||
|
|
1f583dc7a2 | ||
|
|
74212771dc | ||
|
|
6bcea7af66 | ||
|
|
3ec7e40213 | ||
|
|
836e72119c | ||
|
|
f81f7e1d2a | ||
|
|
618a050414 | ||
|
|
ec7f49c94b | ||
|
|
30ea285ca0 | ||
|
|
32a5c7b769 | ||
|
|
581749a29f | ||
|
|
d83d26598c | ||
|
|
d653f1441d | ||
|
|
a9b822089f | ||
|
|
c5a4d7331f | ||
|
|
230428f2e0 | ||
|
|
1a26a1bf63 | ||
|
|
77001324e9 | ||
|
|
0fd6207689 | ||
|
|
dd175747ab | ||
|
|
3106389f6a | ||
|
|
d8c997b355 | ||
|
|
103f655fa4 | ||
|
|
1dfaf3897c | ||
|
|
f7bdd4efe1 | ||
|
|
8a089ba3c9 | ||
|
|
56917483d6 | ||
|
|
f5c1eb74af | ||
|
|
785afaa281 | ||
|
|
dcdec7f55f | ||
|
|
8d19c8b7af | ||
|
|
29025a45e8 | ||
|
|
a73491bb9b | ||
|
|
eee06da6b4 | ||
|
|
231ce28f74 | ||
|
|
0e8abca5d9 | ||
|
|
2cf628305a | ||
|
|
001294a94c | ||
|
|
fa0e9727ae | ||
|
|
b8aa3c8b21 | ||
|
|
f2f5fde3a5 | ||
|
|
d6822c9c7d | ||
|
|
52f592a357 | ||
|
|
39a0dde1f4 | ||
|
|
fbb1f012e2 | ||
|
|
6141b135fe | ||
|
|
e827bb17e7 | ||
|
|
4c0607aba8 | ||
|
|
2af13a31dc | ||
|
|
2dec6af231 | ||
|
|
c70fb5940f | ||
|
|
2c15ae178d | ||
|
|
4a987677ac | ||
|
|
ee88cd33b1 | ||
|
|
fb15c44383 | ||
|
|
4f4113d3d1 | ||
|
|
52355de1c0 | ||
|
|
ebee4fa5da | ||
|
|
796241b40a | ||
|
|
505f802e20 | ||
|
|
e9f9194f73 | ||
|
|
effd4e959a | ||
|
|
f58eb75639 | ||
|
|
32e207d047 | ||
|
|
8b2934c60e | ||
|
|
d05f56c5b1 | ||
|
|
d1196f8e85 | ||
|
|
c71b5d6f87 | ||
|
|
8a6d39d5d0 | ||
|
|
0ac7059812 | ||
|
|
1e7c21c1ae | ||
|
|
c9c1c57c9d | ||
|
|
82ae378edc | ||
|
|
01ef9c4fea | ||
|
|
dbb64f1d87 | ||
|
|
ccac67ced6 | ||
|
|
ce6f3ddb5a | ||
|
|
4c4e93c88a | ||
|
|
d86997e388 | ||
|
|
60717bdaad | ||
|
|
4454b6f29d | ||
|
|
0738a7dbf0 | ||
|
|
a539bb8e57 | ||
|
|
b2d417f207 | ||
|
|
4352ab92f1 | ||
|
|
5c522069b1 | ||
|
|
49d12f36b9 | ||
|
|
e4697bae27 | ||
|
|
3691ab7f8f | ||
|
|
a47e03de0a | ||
|
|
21b7016fb5 | ||
|
|
33da381892 | ||
|
|
69f2a77779 | ||
|
|
2bfa304d97 | ||
|
|
4dde48d18e | ||
|
|
c2e450add0 | ||
|
|
8f9a9ec3e5 | ||
|
|
e04b756d36 | ||
|
|
e066034e9f | ||
|
|
a48baa1356 | ||
|
|
c6a75891d3 | ||
|
|
7d7eb53cd6 | ||
|
|
8e2c12848c | ||
|
|
521da56e70 | ||
|
|
3e43f5577e | ||
|
|
f1f8130718 | ||
|
|
f38bf9262d | ||
|
|
be6af55616 | ||
|
|
53d004d91e | ||
|
|
6153764c0d | ||
|
|
a6fd244be2 | ||
|
|
a54d72d00c | ||
|
|
b3eacd841f | ||
|
|
08b730a349 | ||
|
|
08d0a7ada7 | ||
|
|
381d19634f | ||
|
|
b542b6651e | ||
|
|
c249485a4f | ||
|
|
988c424e45 | ||
|
|
48c062f7af | ||
|
|
cf6d2c7593 | ||
|
|
3392138972 | ||
|
|
abd76fe89f | ||
|
|
258670e0b5 | ||
|
|
71d67b9d8f | ||
|
|
240f924faf | ||
|
|
7ca8ac64a3 | ||
|
|
230f98fbb4 | ||
|
|
9122fbe141 | ||
|
|
6f9811498a | ||
|
|
a72d95e6d7 | ||
|
|
19796092e5 | ||
|
|
2209968963 | ||
|
|
06cfe9a9cc | ||
|
|
173518356d | ||
|
|
326b1e9f62 | ||
|
|
b8ea0f3aa6 | ||
|
|
51d08c6f42 | ||
|
|
49adf1fae7 | ||
|
|
6c85a4dd29 | ||
|
|
4dd84fbfa4 | ||
|
|
6a58347872 | ||
|
|
ea9e23f924 | ||
|
|
b78e04a2de | ||
|
|
98c51db226 | ||
|
|
52764be2b6 | ||
|
|
bf27c14946 | ||
|
|
6148a931d3 | ||
|
|
59401ab5f5 | ||
|
|
ad23cbc03c | ||
|
|
4743434e9c | ||
|
|
2c59288969 | ||
|
|
0c2f8f879e | ||
|
|
b6d72044a0 | ||
|
|
a97ae7ad34 | ||
|
|
6d6fe41bc5 | ||
|
|
733566d606 | ||
|
|
6f19685255 | ||
|
|
91dc25f69d | ||
|
|
3be3253a08 | ||
|
|
53248f6e00 | ||
|
|
d1d7b08619 | ||
|
|
1c10fec242 | ||
|
|
3467b62cc4 | ||
|
|
6746732e49 | ||
|
|
52af596eb4 | ||
|
|
08eb683e8a | ||
|
|
6f1f21a127 | ||
|
|
cea15bebab | ||
|
|
06e7b94b60 | ||
|
|
c9bbae1c5c | ||
|
|
8616a82efc | ||
|
|
ee5d229f51 | ||
|
|
42bf1df424 | ||
|
|
3df5504fde | ||
|
|
8bf8b6075a | ||
|
|
b3a09226ca | ||
|
|
fcbcdfc5d9 | ||
|
|
6fa16ab130 | ||
|
|
996a86f351 | ||
|
|
a76ccb72c2 | ||
|
|
0559595ac6 | ||
|
|
77dbeed890 | ||
|
|
d1b4f8c5b7 | ||
|
|
7316f74917 | ||
|
|
f1519f7aba | ||
|
|
b86218b75a | ||
|
|
0722ad2f4c | ||
|
|
f0fa643930 | ||
|
|
d1dcce31a5 | ||
|
|
ac593eb8cf | ||
|
|
f07239d8c2 | ||
|
|
485fc3ea2a | ||
|
|
7b3a27f1e2 | ||
|
|
c540f8e5f5 | ||
|
|
b7d91310cc | ||
|
|
32d0cc6dd0 | ||
|
|
9caee67606 | ||
|
|
bde78dcc19 | ||
|
|
28a5fb537d | ||
|
|
cd7bac1e2c | ||
|
|
f682b86f9a | ||
|
|
ff14f819c4 | ||
|
|
8b5ce2ab33 | ||
|
|
b1f2faa988 | ||
|
|
d342c2c081 | ||
|
|
a5cec84be1 | ||
|
|
a299c39d7b | ||
|
|
685c41ebf5 | ||
|
|
1ec09a4679 | ||
|
|
9e4e58baf9 | ||
|
|
bd5c98cc0d | ||
|
|
ef2817513a | ||
|
|
d28ae1b304 | ||
|
|
101f5351bd | ||
|
|
e103d62b75 | ||
|
|
d969741f90 | ||
|
|
8a1ea7fd19 | ||
|
|
34db321577 | ||
|
|
cc57f0b19b | ||
|
|
4e946ae52b | ||
|
|
236ed74cae | ||
|
|
cd07d3b13d | ||
|
|
b582c79593 | ||
|
|
df0d81db7c | ||
|
|
a628134a89 | ||
|
|
708acdfe95 | ||
|
|
f84a7e7661 | ||
|
|
5fde533bcc | ||
|
|
16e57f6f24 | ||
|
|
44dc250a2b | ||
|
|
742fb3dece | ||
|
|
bd0a6636e6 | ||
|
|
ad5cdebca8 | ||
|
|
ff794d485a | ||
|
|
65a7a5afe2 | ||
|
|
2fcae6d27c | ||
|
|
6023b312e3 | ||
|
|
c4cbb85e03 | ||
|
|
3280bceaa1 | ||
|
|
87a3f23f51 | ||
|
|
b7e788d529 | ||
|
|
71d423cac3 | ||
|
|
b083f5d8f9 | ||
|
|
6c9917fc2a | ||
|
|
f6b814588e | ||
|
|
9be72c81eb | ||
|
|
4b91d07f11 | ||
|
|
15cbc5fe42 | ||
|
|
70d80bb32e | ||
|
|
6d878e33fd | ||
|
|
e865d17fd1 | ||
|
|
f971061ef4 | ||
|
|
5d7f14c21f | ||
|
|
955dc5f48d | ||
|
|
345c696db9 | ||
|
|
7130902979 | ||
|
|
f50d5bd23c | ||
|
|
cbfcb5de2c | ||
|
|
eaaf3a9e60 | ||
|
|
ab199633f8 | ||
|
|
80ccc0eee0 | ||
|
|
7179b147b2 | ||
|
|
74366f10e9 | ||
|
|
b94834fb20 | ||
|
|
9ae98a4353 | ||
|
|
f1a423f8fb | ||
|
|
b7c1660b07 | ||
|
|
b0409b31d8 | ||
|
|
e33c0a4309 | ||
|
|
151dca6fb9 | ||
|
|
56e5705ed6 | ||
|
|
1f5e639fb2 | ||
|
|
b98b9a98e3 | ||
|
|
ae4ec55abe | ||
|
|
17e219f142 | ||
|
|
216e999a71 | ||
|
|
3b9980c01e | ||
|
|
e08eec42ac | ||
|
|
39a6d1c58d | ||
|
|
6f4f686c04 | ||
|
|
a2f430418a | ||
|
|
d39ceb1f5e | ||
|
|
ceec999922 | ||
|
|
d7ebbbf2b6 | ||
|
|
7e5be6793e | ||
|
|
bb593af463 | ||
|
|
4ae4456c43 | ||
|
|
d2fda57f2c | ||
|
|
7e1b95216b | ||
|
|
adb8930816 | ||
|
|
c483a00865 | ||
|
|
9c8b3b6cc7 | ||
|
|
c062492def | ||
|
|
4f6bd5b684 | ||
|
|
181c418cea | ||
|
|
01f6fff823 | ||
|
|
3bb787c575 | ||
|
|
39972c4c2b | ||
|
|
486a45ad14 | ||
|
|
ad5cb37ed5 | ||
|
|
eb1d3c27c5 | ||
|
|
ec59396035 | ||
|
|
c5a550bf78 | ||
|
|
83b3bd9a2e | ||
|
|
a2ff516112 | ||
|
|
513e5b4019 | ||
|
|
fe4783dc63 | ||
|
|
ffa6894e56 | ||
|
|
982483f178 | ||
|
|
898956d833 | ||
|
|
b1d9be707d | ||
|
|
907f1e7dfd | ||
|
|
2e0e351228 | ||
|
|
e4b267d757 | ||
|
|
a238d7278f | ||
|
|
4b428c6636 | ||
|
|
b5e9f280e6 | ||
|
|
3c65e366e8 | ||
|
|
e9efe4169c | ||
|
|
4be22822d4 | ||
|
|
00054e2c61 | ||
|
|
cc105e5029 | ||
|
|
f6899cf3c3 | ||
|
|
a2a4c8c43d | ||
|
|
0faae5d5ca | ||
|
|
2586c53f0d | ||
|
|
7fdbd27ebb | ||
|
|
d0dc21a52c | ||
|
|
f7be953bb5 | ||
|
|
08a51d8f1b | ||
|
|
32edf58f75 | ||
|
|
88e1770f2e | ||
|
|
142e93f3e9 | ||
|
|
db9eb36c8c | ||
|
|
6a12effd6a | ||
|
|
f7d98591c9 | ||
|
|
30bcfb6d5e | ||
|
|
61d15782d0 | ||
|
|
dec6a1296b | ||
|
|
44c8b07eb1 | ||
|
|
0095d89543 | ||
|
|
4977f598fd | ||
|
|
25cacbb28d | ||
|
|
a0c93ea7d3 | ||
|
|
1921bc87a2 | ||
|
|
6437e6b878 | ||
|
|
41284ac3bc | ||
|
|
8cf0df7ac5 | ||
|
|
b804f7fa6e | ||
|
|
95cda0d9ab | ||
|
|
2dae3c4b4a | ||
|
|
fd12027873 | ||
|
|
ff4c7e4302 | ||
|
|
3939d1855d | ||
|
|
596d58b539 | ||
|
|
565bc6d4c2 | ||
|
|
af3067c08b | ||
|
|
d0006eaa26 | ||
|
|
52b2731a42 | ||
|
|
08f3368766 | ||
|
|
86474484ae | ||
|
|
e31fb13378 | ||
|
|
c147389d25 | ||
|
|
0581f500cc | ||
|
|
e5335e9a97 | ||
|
|
5c0a338e6b | ||
|
|
73329ccaf2 | ||
|
|
8b5b7cf5fc | ||
|
|
799cdc716b | ||
|
|
6c4853a847 | ||
|
|
bfe57b309a | ||
|
|
6715c43fc3 | ||
|
|
f68348bde6 | ||
|
|
121e27906c | ||
|
|
a1826763f5 | ||
|
|
5a3e4f7fb6 | ||
|
|
f17766c8ce | ||
|
|
8556b7eef7 | ||
|
|
8e9b84f4f9 | ||
|
|
6b1fd152e5 | ||
|
|
fab3fcb112 | ||
|
|
a4b6b88b76 | ||
|
|
b1e99f07a2 | ||
|
|
6bceb7311a | ||
|
|
cbfc766e55 | ||
|
|
d19c3daa67 | ||
|
|
86eb832446 | ||
|
|
ebb859238c | ||
|
|
eb21d5ab67 | ||
|
|
edfd402ccd | ||
|
|
3d8547d7dd | ||
|
|
3ffa768cfc | ||
|
|
53e9d4a3e3 | ||
|
|
657686cab3 | ||
|
|
a45fc2c030 | ||
|
|
78471c1860 | ||
|
|
7eb3e5c0ea | ||
|
|
adc7c2bdb6 | ||
|
|
bef8b905de | ||
|
|
4d91c8f8b7 | ||
|
|
53c842492a | ||
|
|
3d624f7eaf | ||
|
|
92dacf18cd | ||
|
|
6743bd144f | ||
|
|
b074c047f4 | ||
|
|
a33fd5fbad | ||
|
|
597b58253c | ||
|
|
8ac844c839 | ||
|
|
dd3665be16 | ||
|
|
a01a888e47 | ||
|
|
6348652b0d | ||
|
|
96ff599c2d | ||
|
|
a09320cb4a | ||
|
|
c6173e70eb | ||
|
|
9ef31201b6 | ||
|
|
e7a5f0a6e6 | ||
|
|
0509c28576 | ||
|
|
dd3fd97b43 | ||
|
|
d973283039 | ||
|
|
b5bec065fe | ||
|
|
01e3bd703e | ||
|
|
d9f98323c7 | ||
|
|
d7ca2a33c8 | ||
|
|
243862804a | ||
|
|
bd03e666da | ||
|
|
23b7176d5a | ||
|
|
120457916a | ||
|
|
bd3463c824 | ||
|
|
4e0d1b2746 | ||
|
|
b927c2df1a | ||
|
|
3f3a03c227 | ||
|
|
36cec98082 | ||
|
|
4f7561d66c | ||
|
|
a05ee8bbb8 | ||
|
|
21b7a0235b | ||
|
|
f01e486edb | ||
|
|
204332a76a | ||
|
|
80a4e67ddf | ||
|
|
6e7baf42b1 | ||
|
|
36a21e2443 | ||
|
|
720f7c0b0f | ||
|
|
42d96fa356 | ||
|
|
534f770314 | ||
|
|
16eb069717 | ||
|
|
d65f54c27b | ||
|
|
4a78a04168 | ||
|
|
3a3c5e2304 | ||
|
|
31e4b2752f | ||
|
|
b43db6035f | ||
|
|
295c922f0a | ||
|
|
a11ffbce66 | ||
|
|
0ffa7bd0f5 | ||
|
|
eebfc2d6c5 | ||
|
|
a2dfa6368d | ||
|
|
3805497d71 | ||
|
|
a4ea062a83 | ||
|
|
e46daeed97 | ||
|
|
9fdc4a2c45 | ||
|
|
71fc20d971 | ||
|
|
9aec61020d | ||
|
|
c4cab3ed03 | ||
|
|
4bcd907f5b | ||
|
|
989e0d8fd1 | ||
|
|
ddf31e82f6 | ||
|
|
5a749ac106 | ||
|
|
5831576d21 | ||
|
|
df9ea97863 | ||
|
|
4315cb41f2 | ||
|
|
335c1779ef | ||
|
|
20462b91d4 | ||
|
|
e372821cea | ||
|
|
778859d7d7 | ||
|
|
19afb81bf6 | ||
|
|
a049b4faa6 | ||
|
|
c554d791bb | ||
|
|
01519e75a0 | ||
|
|
0eb61e601b | ||
|
|
b6396990ba | ||
|
|
bdd74bfcc3 | ||
|
|
aaadca8287 | ||
|
|
8873b2368f | ||
|
|
c95fa25b60 | ||
|
|
9e2ad3c642 | ||
|
|
a51216d7a6 | ||
|
|
a24321ae56 | ||
|
|
4b99f7c819 | ||
|
|
ae6925ccce | ||
|
|
94a2ab23ba | ||
|
|
b8c4f46630 | ||
|
|
e5c7d5dd2f | ||
|
|
c1ff7812d8 | ||
|
|
66925bfc7f | ||
|
|
e8c7bd1d32 | ||
|
|
1b93da20f4 | ||
|
|
edb0ece03b | ||
|
|
12164098a6 | ||
|
|
48145e4e77 | ||
|
|
df3f23731b | ||
|
|
912a40c9cd | ||
|
|
8cd013d2ab | ||
|
|
f7b6cea21b | ||
|
|
8f0eefa97e | ||
|
|
bc02d178ce | ||
|
|
3fb1f5f54a | ||
|
|
335bfab746 | ||
|
|
2d4d943b61 | ||
|
|
f06e5ed87f | ||
|
|
bd777e610f | ||
|
|
bdcccb0344 | ||
|
|
35ede418eb | ||
|
|
46f118db13 | ||
|
|
6d2a4d4d2b | ||
|
|
7491366658 | ||
|
|
8e0979020d | ||
|
|
7e11cd29e1 | ||
|
|
6dc1a21cf0 | ||
|
|
92d7efeea2 | ||
|
|
f5ce5d0a78 | ||
|
|
cce0040eaf | ||
|
|
3369de6bf7 | ||
|
|
532926a9e3 | ||
|
|
9e9d2496ed | ||
|
|
89db08f4ed | ||
|
|
ffd4297b17 | ||
|
|
ec29bd3682 | ||
|
|
76dbc1cca3 | ||
|
|
f5b6e13a1c | ||
|
|
b5d2566ffd | ||
|
|
a6dcd725cb | ||
|
|
e0ec9a047c | ||
|
|
7dfe2116fe | ||
|
|
525360f284 | ||
|
|
2db3060a03 | ||
|
|
d9b8335e0e | ||
|
|
948170e46b | ||
|
|
5b8c237a1e | ||
|
|
4c6f2f018f | ||
|
|
8ccdba5be2 | ||
|
|
cb929a7239 | ||
|
|
251b8deb25 | ||
|
|
9145ade617 | ||
|
|
4b83569b43 | ||
|
|
56cc806d01 | ||
|
|
ae6d5ae476 | ||
|
|
4bc37ab065 | ||
|
|
c9e969c7b4 | ||
|
|
65290dc2bf | ||
|
|
8c3f8f9b01 | ||
|
|
985918b870 | ||
|
|
62ad78ace9 | ||
|
|
af37c58bc1 | ||
|
|
5eba4a360d | ||
|
|
7bfdbaabe7 | ||
|
|
4f2bfb2406 | ||
|
|
3b5dd7567a | ||
|
|
94733515e4 | ||
|
|
d64872d9ae | ||
|
|
a2474e71cc | ||
|
|
c361f692df | ||
|
|
758670eb51 | ||
|
|
c8b12837a4 | ||
|
|
f7f854f0d3 | ||
|
|
8c27108b0a | ||
|
|
7cd220fe8c | ||
|
|
7fccd18910 | ||
|
|
73e9f55e55 | ||
|
|
002a052371 | ||
|
|
0049a0004e | ||
|
|
b0503d9930 | ||
|
|
429bb6ac13 | ||
|
|
f1b0ba039c | ||
|
|
33416aadef | ||
|
|
f17e46015a | ||
|
|
2b8878e724 | ||
|
|
63744c0a3a | ||
|
|
9c175ac893 | ||
|
|
c6bc398950 | ||
|
|
4210070d07 | ||
|
|
c05fb7ebf1 | ||
|
|
d35fbb8383 | ||
|
|
d9abee3adf | ||
|
|
fe3f75f141 | ||
|
|
79554bf8e9 | ||
|
|
4f9ed73a59 | ||
|
|
3d1b6e9fc5 | ||
|
|
2019196f65 | ||
|
|
a815763833 | ||
|
|
92a3f150bb | ||
|
|
000b23d703 | ||
|
|
438b3d9752 | ||
|
|
a9edee1550 | ||
|
|
b63de8b7d6 | ||
|
|
5e0e3f4522 | ||
|
|
a74722aea5 | ||
|
|
4e55cbbfe8 | ||
|
|
5f8b9f301a | ||
|
|
c387817157 | ||
|
|
138a9ffae7 | ||
|
|
b3666ed2a8 | ||
|
|
3b8fd10f70 | ||
|
|
7c0106e62f | ||
|
|
8609400d76 | ||
|
|
0b0aa36aab | ||
|
|
70ab102d8c | ||
|
|
1f24d936d8 | ||
|
|
f925ec8cbe | ||
|
|
b603481cf6 | ||
|
|
7dbce6037a | ||
|
|
b7f6ed4a74 | ||
|
|
67bea7ab55 | ||
|
|
346e90f62d | ||
|
|
53d4f44178 | ||
|
|
f3ab8f34ed | ||
|
|
276b79a748 | ||
|
|
ecff04424d | ||
|
|
b02a563519 | ||
|
|
54990868c3 | ||
|
|
6a29fb2bf9 | ||
|
|
7b3d65feca | ||
|
|
9230be87d4 | ||
|
|
3f87d64e54 | ||
|
|
10ddb5f361 | ||
|
|
6bde30ceb7 | ||
|
|
e15b6e7cff | ||
|
|
85dc6385cd | ||
|
|
94d245246c | ||
|
|
d79ec83817 | ||
|
|
f19dfe9d70 | ||
|
|
b47f40eb07 | ||
|
|
e38d2a8380 | ||
|
|
2220af3ac4 | ||
|
|
fd69241de9 | ||
|
|
47e723c557 | ||
|
|
48bf88f99d | ||
|
|
289ab44ed5 | ||
|
|
8ec465319b | ||
|
|
53f66308d4 | ||
|
|
2658c1f52e | ||
|
|
f92a988612 | ||
|
|
fc015f0bee | ||
|
|
29bf181a08 | ||
|
|
4c244e836b | ||
|
|
5ac7fa5eca | ||
|
|
7683fdb9cb | ||
|
|
d621b5a77e | ||
|
|
49b9d1ec82 | ||
|
|
04cfec3213 | ||
|
|
4b4623fea1 | ||
|
|
1b7f4deeac | ||
|
|
1462402519 | ||
|
|
5edf70103f | ||
|
|
9ba11e2474 | ||
|
|
02cb07f170 | ||
|
|
8d72ca84cc | ||
|
|
8e63016f45 | ||
|
|
ab952d7002 | ||
|
|
b24671c2b9 | ||
|
|
12a93fea24 | ||
|
|
609bf18be8 | ||
|
|
5de22ae9ae | ||
|
|
9f4110a3d5 | ||
|
|
a1da82a173 | ||
|
|
f1456190b5 | ||
|
|
03bb94da23 | ||
|
|
5aa574bc71 | ||
|
|
99c0291b0e | ||
|
|
89c195d96b | ||
|
|
86f3fffa91 | ||
|
|
e191362c4f | ||
|
|
8c0cff0c65 | ||
|
|
db31238b00 | ||
|
|
c18b730d7c | ||
|
|
7ad85f6ffb | ||
|
|
45a79624b1 | ||
|
|
65dde8bc97 | ||
|
|
83dce4d8d2 | ||
|
|
6680326392 | ||
|
|
cc222034cb | ||
|
|
5b0250ee74 | ||
|
|
eb52f3b902 | ||
|
|
9add64ae8d | ||
|
|
20c5aadefe | ||
|
|
34896a805e | ||
|
|
722b488795 | ||
|
|
228a3f67e1 | ||
|
|
fe5457ef30 | ||
|
|
b747bb217a | ||
|
|
4fc0a93a1f | ||
|
|
ecd73dcc2c | ||
|
|
7f43c4377c | ||
|
|
ab998e87f8 | ||
|
|
6c53aaf67f | ||
|
|
adcc922b80 | ||
|
|
9400984d22 | ||
|
|
93bef0d16a | ||
|
|
db97d48f9d | ||
|
|
63d5520c0b | ||
|
|
4cddf6ab78 | ||
|
|
b6e97c4261 | ||
|
|
a2750c8aff | ||
|
|
2c0372f680 | ||
|
|
2dceb8927c | ||
|
|
e5cf2161d4 | ||
|
|
b2bae64215 | ||
|
|
552dc254da | ||
|
|
dc51afdc60 | ||
|
|
3f293190cf | ||
|
|
7f299869c5 | ||
|
|
c45805e703 | ||
|
|
d062d8081a | ||
|
|
5955ecefd3 | ||
|
|
0d25d83651 | ||
|
|
1957b6aa12 | ||
|
|
4fa173f0f5 | ||
|
|
fed3bcd79d | ||
|
|
dda1f18f67 | ||
|
|
025386af53 | ||
|
|
bd1ea41c0d | ||
|
|
5d729c1e8d | ||
|
|
1fac4c59a3 | ||
|
|
0e9296913c | ||
|
|
4307b99dd4 | ||
|
|
aedbc4bf1d | ||
|
|
50d379d94d | ||
|
|
d6a4149175 | ||
|
|
60151e4bca | ||
|
|
32340efa52 | ||
|
|
5182dea970 | ||
|
|
b4a050a986 | ||
|
|
e3be5e4173 | ||
|
|
5a0669d437 | ||
|
|
0d29d94800 | ||
|
|
1e667946b3 | ||
|
|
c6a4bf69ee | ||
|
|
5d0cfc3599 | ||
|
|
2424afa1fb | ||
|
|
69944a2b63 | ||
|
|
0ceb58a105 | ||
|
|
5e8da856e7 | ||
|
|
ee412e1994 | ||
|
|
02736524bd | ||
|
|
772343ae5f | ||
|
|
c357b97b3b | ||
|
|
dbe7251c6b | ||
|
|
7ae90f655c | ||
|
|
669ce6dfbb | ||
|
|
4dc55e5594 | ||
|
|
4b824f7a4c | ||
|
|
5063d94b1c | ||
|
|
4b9db2538c | ||
|
|
326f225777 | ||
|
|
3435132e87 | ||
|
|
d49b15b2a0 | ||
|
|
0c59553b3d | ||
|
|
4a50192937 | ||
|
|
f65ab00250 | ||
|
|
f71c3af2e1 | ||
|
|
77fb9e3d3e | ||
|
|
c1d6674797 | ||
|
|
659aaba0b9 | ||
|
|
a3816f6355 | ||
|
|
4829f040c2 | ||
|
|
59826f5189 | ||
|
|
a6fac9e56a | ||
|
|
8c4b628e06 | ||
|
|
68f0ef1bd2 | ||
|
|
d53882a086 | ||
|
|
7c7306d37b | ||
|
|
d5a9938354 | ||
|
|
3fad378b69 | ||
|
|
afb47344c6 | ||
|
|
5ba7e1d08b | ||
|
|
681347e933 | ||
|
|
f1bf8a0f1a | ||
|
|
874b41cb46 | ||
|
|
d3876b6376 | ||
|
|
f72f2bdf5d | ||
|
|
af91e17b13 | ||
|
|
69bfd8f54d | ||
|
|
369c3b569c | ||
|
|
8480e656b9 | ||
|
|
fb29324905 | ||
|
|
ed88633712 | ||
|
|
cd456f80a4 | ||
|
|
6d61515e28 | ||
|
|
38af936e3f | ||
|
|
d59f5ddc59 | ||
|
|
15cadaba1d | ||
|
|
cd658db38a | ||
|
|
b145a34400 | ||
|
|
08c2861457 | ||
|
|
6c07c5006a | ||
|
|
b39c366a06 | ||
|
|
bb73e87a2a | ||
|
|
43a46784f2 | ||
|
|
9baf5f8cea | ||
|
|
b78d492eb6 | ||
|
|
ed04322aef | ||
|
|
c995cba022 | ||
|
|
4ab7014e01 | ||
|
|
e9ec24dd80 | ||
|
|
fc818bc0bb | ||
|
|
450d95566a | ||
|
|
d4d060a500 | ||
|
|
55e43761e9 | ||
|
|
b1edaa1408 | ||
|
|
d8d9762998 | ||
|
|
dd93284062 | ||
|
|
19c76fc741 | ||
|
|
0e3410c23e | ||
|
|
1013455b0f | ||
|
|
066e4380e1 | ||
|
|
55da9df2a1 | ||
|
|
4b26c57a20 | ||
|
|
d0491dd68a | ||
|
|
cd8cc34c31 | ||
|
|
0249ebf718 | ||
|
|
7fb4eeb998 | ||
|
|
0cd7313523 | ||
|
|
5c3fc2a6ba | ||
|
|
19f888061f | ||
|
|
4e8a02be7d | ||
|
|
2231062c19 | ||
|
|
94ea502b23 | ||
|
|
e6a78bf230 | ||
|
|
fb4faa15bb | ||
|
|
e6d05926dd | ||
|
|
ca9f18325c | ||
|
|
03da91edfb | ||
|
|
bd96ae5a48 | ||
|
|
cf1cc2ca49 | ||
|
|
66106ce48d | ||
|
|
c057589899 | ||
|
|
bbaaa91575 | ||
|
|
41b21c81a0 | ||
|
|
44842d3221 | ||
|
|
d9c7665aca | ||
|
|
565b79d1b2 | ||
|
|
f30dc7dcd9 | ||
|
|
e4cdf515c9 | ||
|
|
ad3463cbc4 | ||
|
|
db733bced6 | ||
|
|
7aa71a7201 | ||
|
|
6fe55661ed | ||
|
|
af89efcfc4 | ||
|
|
82493c596d | ||
|
|
5a3fbf33df | ||
|
|
5bed0f3bcc | ||
|
|
87f6ff7be6 | ||
|
|
fa56996e10 | ||
|
|
b867cdb8b9 | ||
|
|
3bac32e04a | ||
|
|
c4c0f45228 | ||
|
|
d981bb95b9 | ||
|
|
c9f0a59339 | ||
|
|
ec58e868fd | ||
|
|
aa5152ac70 | ||
|
|
2cc627e7d0 | ||
|
|
8653e7bbb1 | ||
|
|
4fb7430fb7 | ||
|
|
e90c8c4d3e | ||
|
|
06e6deae42 | ||
|
|
38fe99f10e | ||
|
|
05ab62f038 | ||
|
|
168011586b | ||
|
|
b5f1e566b2 | ||
|
|
9b6fb2f382 | ||
|
|
24bb2428e7 | ||
|
|
75ba33abc0 | ||
|
|
ff54629550 | ||
|
|
b492c7ae27 | ||
|
|
5d04f93a88 | ||
|
|
5651d1b023 | ||
|
|
6822e3f5b8 | ||
|
|
3cbb02f9fb | ||
|
|
0f79298c28 | ||
|
|
8f4bd09635 | ||
|
|
0a9cad2ea6 | ||
|
|
dc21adfda5 | ||
|
|
a7bfe18f4a | ||
|
|
209f0902c9 | ||
|
|
9cc76a148b | ||
|
|
1d95a255bc | ||
|
|
3f8d412d1c | ||
|
|
b2c35d45c3 | ||
|
|
35ab90e445 | ||
|
|
9bfb5216f9 | ||
|
|
b10656294e | ||
|
|
316f4d471f | ||
|
|
ef0b56eb22 | ||
|
|
e640042e5d | ||
|
|
2c0d2c5e22 | ||
|
|
9eed39c2ae | ||
|
|
e8d89b6c43 | ||
|
|
494c3ffbc4 | ||
|
|
40d27c787c | ||
|
|
2fe5b44698 | ||
|
|
5cc32b9001 | ||
|
|
d481af43c7 | ||
|
|
1cd43f938f | ||
|
|
528f5295c2 | ||
|
|
aaedeea870 | ||
|
|
c684c32abe | ||
|
|
34df9cca2c | ||
|
|
f071ddf9da | ||
|
|
f49d3757df | ||
|
|
c678b53d3f | ||
|
|
ea30cc7d19 | ||
|
|
4fb1ee1201 | ||
|
|
2a35f5c879 | ||
|
|
a2772d09f3 | ||
|
|
a0016f001c | ||
|
|
ca532f271f | ||
|
|
15affd4701 | ||
|
|
89402fd097 | ||
|
|
75451743aa | ||
|
|
b4d9a6a507 | ||
|
|
335afa56a1 | ||
|
|
485592bdac | ||
|
|
ee9289fc24 | ||
|
|
a0c281a0a9 | ||
|
|
ad0b0858f6 | ||
|
|
c2191872ac | ||
|
|
5f361413bb | ||
|
|
3414026828 | ||
|
|
7089fae0d5 | ||
|
|
80bdf1e19c | ||
|
|
e0c1f2a31a | ||
|
|
92cfa2b033 | ||
|
|
877cd5968c | ||
|
|
b39464a7d1 | ||
|
|
52332e5821 | ||
|
|
7f2c7685b4 | ||
|
|
7e80a60e65 | ||
|
|
44544020ec | ||
|
|
3b9d3fd233 | ||
|
|
4e2d2ee378 | ||
|
|
7aafa8b150 | ||
|
|
6d9a59c60b | ||
|
|
39e0977231 | ||
|
|
f8f140090f | ||
|
|
f063f7b2d3 | ||
|
|
60306f146f | ||
|
|
3b873b7cb2 | ||
|
|
26d44ea030 | ||
|
|
b369751a75 | ||
|
|
6e2cd81c9f | ||
|
|
e953bd40eb | ||
|
|
233ae99d3f | ||
|
|
ddca5ef25a | ||
|
|
ae88f286a6 | ||
|
|
25af0c4302 | ||
|
|
96b398867b | ||
|
|
97d1c49a3c | ||
|
|
e83dfd3d5a | ||
|
|
1142af853d | ||
|
|
4d502fe073 | ||
|
|
b022333df1 | ||
|
|
725b2188aa | ||
|
|
1f20d19aea | ||
|
|
ec9f91519d | ||
|
|
ae4e3e2d33 | ||
|
|
b931493d2f | ||
|
|
7b0c07533b | ||
|
|
33f0d64971 | ||
|
|
d10592a397 | ||
|
|
641937f952 | ||
|
|
b5ed309405 | ||
|
|
9bfbd7c953 | ||
|
|
57924afa3f | ||
|
|
76f11099b7 | ||
|
|
efcf802682 | ||
|
|
b095840dc8 | ||
|
|
5f9370da9a | ||
|
|
7a6eb08e53 | ||
|
|
865c3f28d5 | ||
|
|
d5916f3bc3 | ||
|
|
3ce870fb19 | ||
|
|
a575284bfe | ||
|
|
89d79fdc65 | ||
|
|
05c0fd2f40 | ||
|
|
bc3c2c46a8 | ||
|
|
ae0d41dfc3 | ||
|
|
8e2c05458c | ||
|
|
3d69e9c763 | ||
|
|
9f5a0ca4e9 | ||
|
|
43245681fe | ||
|
|
9d214a77d7 | ||
|
|
5134aca723 | ||
|
|
40405332ec | ||
|
|
8d61f3b479 | ||
|
|
bd15287420 | ||
|
|
5dfc3fd576 | ||
|
|
1e80bdf19f | ||
|
|
76cd7ba8d1 | ||
|
|
bee5473e98 | ||
|
|
fbbffb2467 | ||
|
|
1dfa0d08de | ||
|
|
1fc9c82aaf | ||
|
|
600a2b5ad7 | ||
|
|
cb60556ac0 | ||
|
|
62f683b871 | ||
|
|
f22d32c15e | ||
|
|
a3d8586199 | ||
|
|
0a471441cc | ||
|
|
73149123b4 | ||
|
|
5c6f2171f4 | ||
|
|
fd973038bb | ||
|
|
b7dff91d01 | ||
|
|
e314d199f0 | ||
|
|
3938c199f6 | ||
|
|
962eef4a1d | ||
|
|
97443a86cb | ||
|
|
7137616224 | ||
|
|
444825a5c1 | ||
|
|
986deaa6c7 | ||
|
|
7b27903de2 | ||
|
|
de42011d3e | ||
|
|
7e80d90fb5 | ||
|
|
c0398e9ad9 | ||
|
|
bbadf6795e | ||
|
|
8b9be6eafe | ||
|
|
da336ea412 | ||
|
|
f1cf95d412 | ||
|
|
6642a3e9ad | ||
|
|
49db7773e8 | ||
|
|
9372819fb8 | ||
|
|
9d07d81551 | ||
|
|
3c9bcf05e2 | ||
|
|
3338da2a91 | ||
|
|
8406248a1b | ||
|
|
b31858a64f | ||
|
|
8f2a8dc9ba | ||
|
|
44e54cd4df | ||
|
|
36c41557ea | ||
|
|
d0d72101ab | ||
|
|
7b41d65fa6 | ||
|
|
5f9000db92 | ||
|
|
de031b1ddb | ||
|
|
58f46bb75f | ||
|
|
d1e07ec0a2 | ||
|
|
0d4716f3b4 | ||
|
|
9ddfd650dd | ||
|
|
cf9cda4936 | ||
|
|
eb2ad92bf7 | ||
|
|
60a834d742 | ||
|
|
0e0902df05 | ||
|
|
1880c32f90 | ||
|
|
6d72c08d63 | ||
|
|
95ac1b2c21 | ||
|
|
a33fd45136 | ||
|
|
c3d879aec9 | ||
|
|
4e43d2a96b | ||
|
|
d68c8fe72c | ||
|
|
c9d0619289 | ||
|
|
8ea33946c4 | ||
|
|
bef7394004 | ||
|
|
4042bf042e | ||
|
|
643b698c30 | ||
|
|
aba3e3985a | ||
|
|
91f679f762 | ||
|
|
3eeed507cc | ||
|
|
988e1d6e30 | ||
|
|
04b4aabcf6 | ||
|
|
d97fe47206 | ||
|
|
0d8748a6ce | ||
|
|
b360a39fcf | ||
|
|
70b071fa26 | ||
|
|
64badb2cb7 | ||
|
|
3da6634242 | ||
|
|
4b8d072854 | ||
|
|
a1ea393f35 | ||
|
|
d1920621fa | ||
|
|
8dad252e3c | ||
|
|
5ea22cf1fa | ||
|
|
32abd991e7 | ||
|
|
3294f800be | ||
|
|
74e3dc2d7d | ||
|
|
a7a49a823b | ||
|
|
14c943adfe | ||
|
|
fb84b4b7c1 | ||
|
|
4089ee424c | ||
|
|
9bf010e222 | ||
|
|
0553fb6b79 | ||
|
|
4bb6a25055 | ||
|
|
3d06cfca31 | ||
|
|
66ff7b1592 | ||
|
|
be32810608 | ||
|
|
88f48599a0 | ||
|
|
014e2ac8b8 | ||
|
|
bae88ec416 | ||
|
|
46230ad307 | ||
|
|
963a207194 | ||
|
|
59419e13d9 | ||
|
|
82f43a362f | ||
|
|
b370e04035 | ||
|
|
dfd6e7a07b | ||
|
|
a873560d4e | ||
|
|
f7eea51066 | ||
|
|
c6777bd219 | ||
|
|
8eb4d25638 | ||
|
|
98c35c5291 | ||
|
|
191c6e9016 | ||
|
|
33c1579e9c | ||
|
|
52af0b1db9 | ||
|
|
492cb49805 | ||
|
|
e482c2c318 | ||
|
|
5b387e7e17 | ||
|
|
b2e70a44be | ||
|
|
452a8aaa0c | ||
|
|
c3f392a01c | ||
|
|
7d9b6a41fc | ||
|
|
f4f4cf3947 | ||
|
|
28e930eb4b | ||
|
|
301387fb32 | ||
|
|
5955387bdd | ||
|
|
150491ff2c | ||
|
|
c7d735bf56 | ||
|
|
1f4dbd0024 | ||
|
|
ddef78c7d8 | ||
|
|
dc435d88f4 | ||
|
|
84aff0112d | ||
|
|
a13f8ed05f | ||
|
|
0429abbb28 | ||
|
|
562d3e6528 | ||
|
|
ac27b484fa | ||
|
|
3c57c3e492 | ||
|
|
83f9f5d34a | ||
|
|
c659e4f0aa | ||
|
|
0921b733c2 | ||
|
|
723ee3c647 | ||
|
|
32baa279e2 | ||
|
|
cc597a8e95 | ||
|
|
17b17979ab | ||
|
|
c94ab5b05a | ||
|
|
625a0125cb | ||
|
|
9f8c1b3d20 | ||
|
|
c5ecc2bc15 | ||
|
|
18842dd47d | ||
|
|
ee1e464d4d | ||
|
|
cc6ed88878 | ||
|
|
73523a96fa | ||
|
|
62e3bc86eb | ||
|
|
a12af852ab | ||
|
|
6f2fc00045 | ||
|
|
9e0de644c4 | ||
|
|
393bdfccaf | ||
|
|
56c39799c8 | ||
|
|
7f2a1374e4 | ||
|
|
6fa0ac56ac | ||
|
|
89ee04c942 | ||
|
|
c058163ab4 | ||
|
|
2832dc69ef | ||
|
|
cb2e2ab9b2 | ||
|
|
f342c38c62 | ||
|
|
811e456f8f | ||
|
|
000503d674 | ||
|
|
d0bd29cfa0 | ||
|
|
d56565990e | ||
|
|
b68734d679 | ||
|
|
bf21c94bd7 | ||
|
|
b6b9685d57 | ||
|
|
f8adbda9c5 | ||
|
|
c9178c3f2f | ||
|
|
84786c12d8 | ||
|
|
335b6ae0cc | ||
|
|
9bde68a86f | ||
|
|
c3201178ae | ||
|
|
366636ef7d | ||
|
|
47112e233e | ||
|
|
88f005be0c | ||
|
|
f454cd3291 | ||
|
|
682c7bc08f | ||
|
|
7618b0254f | ||
|
|
c2c4efebb2 | ||
|
|
23038dc6f7 | ||
|
|
58b4f64125 | ||
|
|
974ab59fd2 | ||
|
|
f2f6dc89a2 | ||
|
|
bff9d89232 | ||
|
|
a818da5eb7 | ||
|
|
9b7c8d26b5 | ||
|
|
a1269c05c5 | ||
|
|
d0ff0307f5 | ||
|
|
c4aa0b2863 | ||
|
|
85fd2ad804 | ||
|
|
0770574f17 | ||
|
|
6314bf51df | ||
|
|
4c08c98f8c | ||
|
|
2341da995e | ||
|
|
4ef60af4a8 | ||
|
|
16f6b51857 | ||
|
|
59e53eb672 | ||
|
|
c7724e9122 | ||
|
|
2c4379acd1 | ||
|
|
69e7b442e2 | ||
|
|
70a4c2f3ed | ||
|
|
83c86b3883 | ||
|
|
9924796ad9 | ||
|
|
b587b6bb4d | ||
|
|
4811578c95 | ||
|
|
0a07c62b63 | ||
|
|
c1ff370923 | ||
|
|
e55575f093 | ||
|
|
703f034054 | ||
|
|
2d504521b1 | ||
|
|
8359789d4f | ||
|
|
8162e13f04 | ||
|
|
282aab5939 | ||
|
|
5c6bcbf9cd | ||
|
|
8ef1d54a16 | ||
|
|
e8bbc2bf4c | ||
|
|
b02053a70c | ||
|
|
99f2b8f536 | ||
|
|
8346d5fc13 | ||
|
|
3a841c6c0f | ||
|
|
f91f074463 | ||
|
|
ecd30094b1 | ||
|
|
81909bd1a9 | ||
|
|
1cb01af77b | ||
|
|
40c7347c8e | ||
|
|
a65592d511 | ||
|
|
4ee6f60531 | ||
|
|
5e18514b7a | ||
|
|
319d65f9a3 | ||
|
|
bc8c99df15 | ||
|
|
aef3a719fe | ||
|
|
2726ebe191 | ||
|
|
85767d4946 | ||
|
|
86a78b206a | ||
|
|
4e308d6600 | ||
|
|
7f2cc59b3c | ||
|
|
878901d05d | ||
|
|
d1304abb9e | ||
|
|
4ae39e851d | ||
|
|
06c5c92d2c | ||
|
|
fc6e529049 | ||
|
|
438f128e2e | ||
|
|
878af1ea28 | ||
|
|
8e84e7284e | ||
|
|
77d4b0972d | ||
|
|
2a518fa7c9 | ||
|
|
04c8ecf4af | ||
|
|
67743dded5 | ||
|
|
5acda423d8 | ||
|
|
8b3995686f | ||
|
|
f388ca298e | ||
|
|
636b92205b | ||
|
|
26d26b5e7a | ||
|
|
01efb59d25 | ||
|
|
b1980a17ac | ||
|
|
69ee5257f2 | ||
|
|
6d15066dff | ||
|
|
5573031d07 | ||
|
|
b812fcddf8 | ||
|
|
8393639735 | ||
|
|
90340da42e | ||
|
|
dafbba0907 | ||
|
|
28ab2b3917 | ||
|
|
2be3cc2f1e | ||
|
|
d8085d88a8 | ||
|
|
bdb91a6737 | ||
|
|
ff321ac908 | ||
|
|
3206a7cab4 | ||
|
|
fb78adb49a | ||
|
|
f47c1a5e43 | ||
|
|
d6b023709d | ||
|
|
2459fb23ae | ||
|
|
4bd3f415a9 | ||
|
|
4414ee6d38 | ||
|
|
fdd84066f5 | ||
|
|
4ebf39449e | ||
|
|
d4f26e0340 | ||
|
|
a00a208ff8 | ||
|
|
bc77fd619d | ||
|
|
1b1add315a | ||
|
|
5eadd6608d | ||
|
|
1340b8d4d8 | ||
|
|
9db86f212f | ||
|
|
edde55fedf | ||
|
|
697894274f | ||
|
|
7292479d9c | ||
|
|
301c11c208 | ||
|
|
71b218ad62 | ||
|
|
ec2f21b944 | ||
|
|
c65b3f3aca | ||
|
|
43280ee077 | ||
|
|
c7e4fb8021 | ||
|
|
132d058098 | ||
|
|
c678a5502d | ||
|
|
0ee35721b0 | ||
|
|
1932f9a9c3 | ||
|
|
dc81071c58 | ||
|
|
8e85b71669 | ||
|
|
f439afae9e | ||
|
|
fdd749be18 | ||
|
|
f6093f483c | ||
|
|
666e3e51a3 | ||
|
|
b930d5a1f9 | ||
|
|
5c10a2662d | ||
|
|
214f451cc1 | ||
|
|
67b4fa6f68 | ||
|
|
aa3e7a8ef5 | ||
|
|
7bf6099528 | ||
|
|
fde88e437b | ||
|
|
eb5ce3e05d | ||
|
|
e90a4eb71d | ||
|
|
7b83406ee4 | ||
|
|
c4157d2ec8 | ||
|
|
2bdfaef2d9 | ||
|
|
2b0fbd9904 | ||
|
|
0ffa0351b5 | ||
|
|
951cbf3d16 | ||
|
|
69454048ad | ||
|
|
c4ceb89240 | ||
|
|
4a638cba79 | ||
|
|
c209528271 | ||
|
|
0d1f590937 | ||
|
|
b59b839029 | ||
|
|
513243ba0f | ||
|
|
795e774119 | ||
|
|
d02d419729 | ||
|
|
518bffe644 | ||
|
|
88d1b31aff | ||
|
|
4db2dbff44 | ||
|
|
32ad577f6d | ||
|
|
3310f49f68 | ||
|
|
bf7803d554 | ||
|
|
c9bd253960 | ||
|
|
859591cea5 | ||
|
|
b99b13a6e4 | ||
|
|
c80be4940f | ||
|
|
52374ce06d | ||
|
|
8ba04a98be | ||
|
|
62634c0fe0 | ||
|
|
5a594f7d9a | ||
|
|
aff87a26ce | ||
|
|
18aae0cfa5 | ||
|
|
6f0bc2ecf8 | ||
|
|
8d2a637bd8 | ||
|
|
54180c4768 | ||
|
|
4e22384ed1 | ||
|
|
029f801159 | ||
|
|
fd53671430 | ||
|
|
7b09548261 | ||
|
|
63e1311656 | ||
|
|
36a303a86f | ||
|
|
61f903dcf1 | ||
|
|
2a10562e9e | ||
|
|
d64796f32a | ||
|
|
f2d67d0a5d | ||
|
|
ad39a51fe8 | ||
|
|
14d0927fb6 | ||
|
|
1697465d0d | ||
|
|
e52965d039 | ||
|
|
a8d957bf7d | ||
|
|
b6b5343e04 | ||
|
|
d4c318438d | ||
|
|
6161fb10af | ||
|
|
d8d04f2ac3 | ||
|
|
1c38e73290 | ||
|
|
7fc6b9b940 | ||
|
|
4b4fc8e9ee | ||
|
|
ed50ed8550 | ||
|
|
fb4c65dae0 | ||
|
|
fc9543baa7 | ||
|
|
b0eaca091a | ||
|
|
aab13a5582 | ||
|
|
f852ba02d8 | ||
|
|
4aa074b9fc | ||
|
|
2f7503c752 | ||
|
|
d754593c2b | ||
|
|
07ea938885 | ||
|
|
ac87930672 | ||
|
|
3dfef06bba | ||
|
|
120faf3806 | ||
|
|
f51f04d170 | ||
|
|
ec7bb78ee4 | ||
|
|
5ae1e59b5c | ||
|
|
e3956ebcf2 | ||
|
|
bb75e8f2e0 | ||
|
|
a77b1416e5 | ||
|
|
121e0a433b | ||
|
|
988aee3078 | ||
|
|
2bb99bb100 | ||
|
|
4e7ddc7e71 | ||
|
|
174caef7ca | ||
|
|
d2bb3800e3 | ||
|
|
f0959ab356 | ||
|
|
2c5546c6fb | ||
|
|
a7a565b93e | ||
|
|
ed074bd08b | ||
|
|
d938b22729 | ||
|
|
bd88a2378f | ||
|
|
0371126ccf | ||
|
|
ab36b6a2e1 | ||
|
|
d43d4a1773 | ||
|
|
0837c476a1 | ||
|
|
77a41b1783 | ||
|
|
0d39400f8b | ||
|
|
d3c8678f80 | ||
|
|
b7008072f8 | ||
|
|
15737810f0 | ||
|
|
5036c57372 | ||
|
|
5799e6f567 | ||
|
|
310e8afc25 | ||
|
|
78215363dc | ||
|
|
4e873f8bf3 | ||
|
|
79dc116e6a | ||
|
|
a7480ae656 | ||
|
|
62e310a776 | ||
|
|
bb398a2f1e | ||
|
|
79ab2d122d | ||
|
|
3a2f73a176 | ||
|
|
217237b57e | ||
|
|
cb7b6eb3f8 | ||
|
|
6e21d7f560 | ||
|
|
09d905b96f | ||
|
|
8f29d4871d | ||
|
|
94f175e2cd | ||
|
|
5e15c5574a | ||
|
|
1c530a6c7a | ||
|
|
8fc0872b90 | ||
|
|
3021cc29da | ||
|
|
c77f51b7ae | ||
|
|
aa39d36663 | ||
|
|
40907db32d | ||
|
|
12bff75586 | ||
|
|
8bc59fb67c | ||
|
|
ab5319f3d1 | ||
|
|
6128df0062 | ||
|
|
142938cdca | ||
|
|
b32efe129e | ||
|
|
2b20272a61 | ||
|
|
d9ef79a7b5 | ||
|
|
576f0be4ab | ||
|
|
89a4e6506f | ||
|
|
47099a8a9b | ||
|
|
04dfda0c55 | ||
|
|
22656a40b2 | ||
|
|
b6df916700 | ||
|
|
6fa9abd896 | ||
|
|
e239406199 | ||
|
|
b7a0ebad17 | ||
|
|
266744b1dd | ||
|
|
f8526e1ac7 | ||
|
|
ab716e96e2 | ||
|
|
649d527dcf | ||
|
|
c5e7ddaf7a | ||
|
|
b2a4cb42cf | ||
|
|
3fc5941f54 | ||
|
|
741360022b | ||
|
|
86e2f62aed | ||
|
|
e552915637 | ||
|
|
98a51c1f61 | ||
|
|
aa84eefa8f | ||
|
|
22e12ce3e5 | ||
|
|
f4a82b5c01 | ||
|
|
60520ea855 | ||
|
|
b70a0869cd | ||
|
|
7bdd21bb75 | ||
|
|
0dd3736f2a | ||
|
|
deb2d30706 | ||
|
|
c416e1546d | ||
|
|
6d3a67ae59 | ||
|
|
6b60147152 | ||
|
|
8c91aca838 | ||
|
|
b47e282747 | ||
|
|
134d0e7e4a | ||
|
|
26b596760b | ||
|
|
8a5e15e82d | ||
|
|
ffb5eee62a | ||
|
|
387d9b39da | ||
|
|
43b5cb62bb | ||
|
|
580923a646 | ||
|
|
06444f497b | ||
|
|
1676ad5f1b | ||
|
|
478d86677d | ||
|
|
c5e0db8de9 | ||
|
|
228690b400 | ||
|
|
1fe30bc466 | ||
|
|
8e95be0ac2 | ||
|
|
47b1e700ea | ||
|
|
3ad1949727 | ||
|
|
441680861e | ||
|
|
5e848ecbb3 | ||
|
|
c9520e607f | ||
|
|
40a8c52ba1 | ||
|
|
cb6ffd7810 | ||
|
|
185a7bb7d8 | ||
|
|
bc3405d11d | ||
|
|
2804361436 | ||
|
|
4f40f3c4b2 | ||
|
|
897c55c410 | ||
|
|
9e97b5851e | ||
|
|
625fbdb2d7 | ||
|
|
0f32d3f619 | ||
|
|
273c74b275 | ||
|
|
2500d0a930 | ||
|
|
25bf3be009 | ||
|
|
910dab1896 | ||
|
|
6198ad557a | ||
|
|
89b3d3b670 | ||
|
|
122f43ddb9 | ||
|
|
50104d2532 | ||
|
|
f5f30d6026 | ||
|
|
114cd48521 | ||
|
|
548da3ea5f | ||
|
|
2a8b8d040b | ||
|
|
0dc2d4445b | ||
|
|
8ac497354a | ||
|
|
0cbbcc00a5 | ||
|
|
5cfab33ada | ||
|
|
18328320c1 | ||
|
|
73c48afc99 | ||
|
|
62bd0442df | ||
|
|
0aee75c1c1 | ||
|
|
dc3c27297f | ||
|
|
9363946874 | ||
|
|
df78412896 | ||
|
|
16190aa878 | ||
|
|
e6e5b95adc | ||
|
|
990adcd3b3 | ||
|
|
75a5bbdbb1 | ||
|
|
af1746932f | ||
|
|
56ff5689f4 | ||
|
|
0dd15f3141 | ||
|
|
72fb7b9df7 | ||
|
|
d7e1297cce | ||
|
|
3c9d4ee38f | ||
|
|
828e6bb1b7 | ||
|
|
6e42d59716 | ||
|
|
6f589b5c84 | ||
|
|
6d1b8b81fa | ||
|
|
cddd7e0e94 | ||
|
|
340bc5f2f7 | ||
|
|
ecd117cd58 | ||
|
|
ea0788f56c | ||
|
|
4199702b9b | ||
|
|
5946aaa31f | ||
|
|
444b5dbd97 | ||
|
|
695ccfcc4d | ||
|
|
a6d5bdd001 | ||
|
|
bd4d8efd78 | ||
|
|
53baad766f | ||
|
|
8ac746188b | ||
|
|
62dbce089f | ||
|
|
fd5d0b2cbb | ||
|
|
6226e0c5a3 | ||
|
|
01a9be835f | ||
|
|
97eb66b0a5 | ||
|
|
048c5e68f1 | ||
|
|
8f39def993 | ||
|
|
0be674d7af | ||
|
|
e6499f7e5a | ||
|
|
10bd1d1969 | ||
|
|
ec94267b8e | ||
|
|
d3ad113bf5 | ||
|
|
8d7242a1ef | ||
|
|
13879dd374 | ||
|
|
0f519fd358 | ||
|
|
e7fb128499 | ||
|
|
c2d619cb7f | ||
|
|
78176cca90 | ||
|
|
dbc49649c0 | ||
|
|
49ee821029 | ||
|
|
e1499330bc | ||
|
|
222175e005 | ||
|
|
388927715e | ||
|
|
ac9e1febfb | ||
|
|
e47836cc64 | ||
|
|
f8f48f1c88 | ||
|
|
95e8a603a5 | ||
|
|
c400fd88f3 | ||
|
|
095d90fd22 | ||
|
|
797be92ddd | ||
|
|
7f23bd694c | ||
|
|
1cbf8b960a | ||
|
|
c8ce195522 | ||
|
|
4458ae042e | ||
|
|
1c3d7c1c73 | ||
|
|
cb3bbd169f | ||
|
|
ab107bfc0d | ||
|
|
d0b5b49bf8 | ||
|
|
1b4b1d5c9f | ||
|
|
aee800ab7a | ||
|
|
895b46307a | ||
|
|
d300d45f22 | ||
|
|
dd05f5278c | ||
|
|
1897008c72 | ||
|
|
328cdac60f | ||
|
|
3942c6cd55 | ||
|
|
f0f7b5aaf7 | ||
|
|
3ad9e44891 | ||
|
|
80bdaa1edc | ||
|
|
39acb224d1 | ||
|
|
f51d565db8 | ||
|
|
d608cf6536 | ||
|
|
0b49bd1985 | ||
|
|
fce69005a9 | ||
|
|
b73420b156 | ||
|
|
fb863cb39b | ||
|
|
8247ff15ed | ||
|
|
af8db9062c | ||
|
|
9039d52817 | ||
|
|
88d5e1cca8 | ||
|
|
57544e615f | ||
|
|
61a92d55ae | ||
|
|
940965f03d | ||
|
|
30a254e9be | ||
|
|
581782af28 | ||
|
|
72cad1409f | ||
|
|
e7e4985761 | ||
|
|
cdb3d29767 | ||
|
|
90fe5329e3 | ||
|
|
22e20cb2da | ||
|
|
a3454e50d7 | ||
|
|
75b8f5e543 | ||
|
|
1a0b22ef15 | ||
|
|
bc78d1a561 | ||
|
|
00b953a04e | ||
|
|
aa0ef529f5 | ||
|
|
bd134bf9c9 | ||
|
|
752267c521 | ||
|
|
34635e3460 | ||
|
|
ba0b4513f1 | ||
|
|
4764808450 | ||
|
|
c66fd67510 | ||
|
|
3997ca6454 | ||
|
|
4242100c53 | ||
|
|
32adcc3676 | ||
|
|
80c26606f0 | ||
|
|
a7852098f1 | ||
|
|
72638fc215 | ||
|
|
65418529cd | ||
|
|
ceea0d1730 | ||
|
|
764ea699b1 | ||
|
|
bdb7f522fb | ||
|
|
2461331e32 | ||
|
|
3464f40da3 | ||
|
|
3b2b79d539 | ||
|
|
8616fc6b05 | ||
|
|
9e9c001422 | ||
|
|
93bbd34055 | ||
|
|
cac953e812 | ||
|
|
aeb3662414 | ||
|
|
1687ce3182 | ||
|
|
2888e87bb8 | ||
|
|
094ebb8020 | ||
|
|
54ad52edc2 | ||
|
|
0e869f3cb5 | ||
|
|
4d40af6ac0 | ||
|
|
79a2f31056 | ||
|
|
b2341bf75c | ||
|
|
c4c4b473e5 | ||
|
|
6e26ccf25d | ||
|
|
83bfad3546 | ||
|
|
90f6fff1ae | ||
|
|
52f2b52990 | ||
|
|
48ed4b0e49 | ||
|
|
c3c609e7b9 | ||
|
|
6cd8fa6b0c | ||
|
|
ffb6d398d7 | ||
|
|
52674b4668 | ||
|
|
4ae2370137 | ||
|
|
cee55afa5c | ||
|
|
f998bbbe4c | ||
|
|
e5d19a9819 | ||
|
|
dd75d88d2f | ||
|
|
65ea01218a | ||
|
|
7a2234cd25 | ||
|
|
11ede2756e | ||
|
|
3e51fab387 | ||
|
|
962f413421 | ||
|
|
ae6c938abb | ||
|
|
68faae69c5 | ||
|
|
08edce7906 | ||
|
|
55eb493d1f | ||
|
|
d6be07f1b8 | ||
|
|
064a012b25 | ||
|
|
df26148e7c | ||
|
|
d26f533111 | ||
|
|
69575dbab3 | ||
|
|
9f4a430412 | ||
|
|
23843be981 | ||
|
|
486e3ffc0a | ||
|
|
8127e5a66f | ||
|
|
53167a3b52 | ||
|
|
1b77247c40 | ||
|
|
24374cf7e3 | ||
|
|
88de54ec90 | ||
|
|
3035d569cc | ||
|
|
51f9ad5a2c | ||
|
|
bb322f1bff | ||
|
|
72843e9c92 | ||
|
|
20fbe2fbbe | ||
|
|
bf073a84c8 | ||
|
|
35b158dba7 | ||
|
|
465c0e7dc3 | ||
|
|
eb4f6f2e9f | ||
|
|
0ff56e3a68 | ||
|
|
4ddc59589c | ||
|
|
1e15d7a33e | ||
|
|
e4e2b6ab00 | ||
|
|
af67690e75 | ||
|
|
b37ae484c0 | ||
|
|
13969bdd29 | ||
|
|
a3f5583326 | ||
|
|
f137c11c6c | ||
|
|
8d6afbd80d | ||
|
|
c46fa206f6 | ||
|
|
e8da206389 | ||
|
|
18f1b5f9d2 | ||
|
|
b2b8cf2357 | ||
|
|
a4fd88a440 | ||
|
|
96a92fd85f | ||
|
|
e5175d6309 | ||
|
|
b5ceee3336 | ||
|
|
a1624f61ae | ||
|
|
5ee26fc3f4 | ||
|
|
93ffb66e59 | ||
|
|
4b9bcfb014 | ||
|
|
a161c09441 | ||
|
|
0c396f76b2 | ||
|
|
b2408b1a7c | ||
|
|
c97826ed29 | ||
|
|
9c653a46bc | ||
|
|
eaa2ad4f05 | ||
|
|
88ce7837a6 | ||
|
|
9f5a183793 | ||
|
|
c2a6690d24 | ||
|
|
5e5b719704 | ||
|
|
4054c7d12d | ||
|
|
bb5e454b91 | ||
|
|
ffb12f9c0b | ||
|
|
a89786d079 | ||
|
|
2d3fd513d8 | ||
|
|
271d01dc9d | ||
|
|
d3ffaea042 | ||
|
|
404b593ab8 | ||
|
|
b9f1dea914 | ||
|
|
f3385e6453 | ||
|
|
a2e55f7861 | ||
|
|
761e0114a5 | ||
|
|
dcae128d06 | ||
|
|
a891a8badc | ||
|
|
f3ec5b533e | ||
|
|
d50397edf1 | ||
|
|
49986f22c8 | ||
|
|
70f279d978 | ||
|
|
84c5a75b6c | ||
|
|
97663e87a6 | ||
|
|
5956edcb8e | ||
|
|
7e975f2134 | ||
|
|
40de13f9c7 | ||
|
|
70946539e3 | ||
|
|
996c594dfc | ||
|
|
d8eeb79b63 | ||
|
|
cf61dd0704 | ||
|
|
6fd5f1563a | ||
|
|
3c643c917a | ||
|
|
378be0ef86 | ||
|
|
29e90969eb | ||
|
|
fb724514f3 | ||
|
|
1f11da75d2 | ||
|
|
a2fa65330d | ||
|
|
d3af66b7ed | ||
|
|
fcc433fe17 | ||
|
|
617bdf9910 | ||
|
|
3b2aa92eb7 | ||
|
|
4c17b56e28 | ||
|
|
ad13c83f93 | ||
|
|
768d67a8ae | ||
|
|
d827cda395 | ||
|
|
106e6c98a3 | ||
|
|
e7ad797d4e | ||
|
|
6e1fb71194 | ||
|
|
9f5dc7f091 | ||
|
|
57b273639c | ||
|
|
278d690a6b | ||
|
|
c91c0f7b47 | ||
|
|
6a406f4d45 | ||
|
|
eecaa850e0 | ||
|
|
f332332eaa | ||
|
|
79b0e76be0 | ||
|
|
30650efd98 | ||
|
|
b7759c8151 | ||
|
|
0382c35ac0 | ||
|
|
819262c93f | ||
|
|
db60f4bb1c | ||
|
|
7785ca55c2 | ||
|
|
75dcceff43 | ||
|
|
af91979d4c | ||
|
|
52cd4a77dd | ||
|
|
8a1da3c0ed | ||
|
|
9d67c36c32 | ||
|
|
f283709e62 | ||
|
|
5035559b08 | ||
|
|
01e1438382 | ||
|
|
4eee472043 | ||
|
|
5f89a1b9ca | ||
|
|
b9db5ad662 | ||
|
|
4a7960d64b | ||
|
|
5b8084e1fa | ||
|
|
ab67b67e4c | ||
|
|
f825931f92 | ||
|
|
6113edf2ce | ||
|
|
8413443c26 | ||
|
|
f67fb31bc5 | ||
|
|
d321ec5ed1 | ||
|
|
084ae184f9 | ||
|
|
d1ec652f7b | ||
|
|
7a2a6586be | ||
|
|
392dcf3092 | ||
|
|
8a983c784d | ||
|
|
a443263439 | ||
|
|
3e766b9f54 | ||
|
|
89b9501f35 | ||
|
|
816ae84005 | ||
|
|
c0e425cf46 | ||
|
|
9ebb4c7d12 | ||
|
|
46c3b35028 | ||
|
|
ef2b8be726 | ||
|
|
df51078858 | ||
|
|
5783b61631 | ||
|
|
98a53381fb | ||
|
|
daccfa5fe3 | ||
|
|
d82c24616f | ||
|
|
905ca3dcfc | ||
|
|
b4fb687c4f | ||
|
|
39fb2ae5ab | ||
|
|
b40beb0d1d | ||
|
|
4a96b9bb00 | ||
|
|
f83a178982 | ||
|
|
986b4276e1 | ||
|
|
6f6f418ec9 | ||
|
|
1463571cd7 | ||
|
|
7dfb0a81e3 | ||
|
|
9699d9467a | ||
|
|
08a2872527 | ||
|
|
7c81a807ea | ||
|
|
3bf7031e6a | ||
|
|
503fc980f4 | ||
|
|
efed11eb97 | ||
|
|
330820062f | ||
|
|
45d157fe3f | ||
|
|
812dea385c | ||
|
|
c582bdea46 | ||
|
|
e6c6a9381b | ||
|
|
4b4c0755c6 | ||
|
|
aeb0539c91 | ||
|
|
9feafa45f5 | ||
|
|
927df391f3 | ||
|
|
cbef6adeb1 | ||
|
|
2dee221861 | ||
|
|
0b175cb25d | ||
|
|
0820338b55 | ||
|
|
a2b46eee6f | ||
|
|
09a435320a | ||
|
|
bf56200c06 | ||
|
|
2d18df2011 | ||
|
|
bab87c0da8 | ||
|
|
148f272500 | ||
|
|
6de4af727b | ||
|
|
75946b9d14 | ||
|
|
1c63ee6743 | ||
|
|
efdaf0d986 | ||
|
|
3f6aeac33d | ||
|
|
d9692004cc | ||
|
|
67a12eecad | ||
|
|
37999e0870 | ||
|
|
66dc1e94f5 | ||
|
|
ebcce194a0 | ||
|
|
95eab94c80 | ||
|
|
41a6dbe06c | ||
|
|
fa22b0ec12 | ||
|
|
be60a367e8 | ||
|
|
608de34205 | ||
|
|
0a8f2edb05 | ||
|
|
41b08f38c5 | ||
|
|
a83c0b2e9a | ||
|
|
8f853c8f18 | ||
|
|
b4071f6dcb | ||
|
|
6b70418861 | ||
|
|
de0235ad94 | ||
|
|
c278c632b3 | ||
|
|
6392330e70 | ||
|
|
160ae4e244 | ||
|
|
a6c9bd3182 | ||
|
|
801eadd8a8 | ||
|
|
211dab1297 | ||
|
|
0c3b39ffdc | ||
|
|
c31f88a318 | ||
|
|
e9eb981782 | ||
|
|
83bde8a781 | ||
|
|
52f352bf94 | ||
|
|
b419a96d69 | ||
|
|
eb3d5b62f5 | ||
|
|
1c5f578d88 | ||
|
|
db3aae1388 | ||
|
|
0b08eb72a6 | ||
|
|
cbc81376be | ||
|
|
27e9901d05 | ||
|
|
532c36677c | ||
|
|
0c20c6ecb7 | ||
|
|
fbb3240ebb | ||
|
|
bffae90022 | ||
|
|
61f6368591 | ||
|
|
1027ca2a85 | ||
|
|
5acc42f739 | ||
|
|
1edeaeb94e | ||
|
|
879acc6077 | ||
|
|
4e5d87104c | ||
|
|
e6a24b8ba1 | ||
|
|
fd190c7770 | ||
|
|
d56869aefa | ||
|
|
c8a15bb7e4 | ||
|
|
07c28c3f6d | ||
|
|
855957b099 | ||
|
|
50959317e9 | ||
|
|
20a681a71f | ||
|
|
4e2d558b36 | ||
|
|
0430b908f4 | ||
|
|
a84e9f2aaa | ||
|
|
7ce571e59c | ||
|
|
545a64f7dc | ||
|
|
10c999a4a2 | ||
|
|
d0e026d597 | ||
|
|
0b1e2bf19b | ||
|
|
71c2c7ad05 | ||
|
|
97f5bf3cc4 | ||
|
|
bb9573b85a | ||
|
|
e1f53dfc67 | ||
|
|
87481e0a4d | ||
|
|
f7aa58e385 | ||
|
|
ea5c78f814 | ||
|
|
c93c016e9c | ||
|
|
4bb6664c7e | ||
|
|
9578068a02 | ||
|
|
30e5f2b17d | ||
|
|
f959760c07 | ||
|
|
e7db2350bc | ||
|
|
0585dabf7a | ||
|
|
a3c6e3f1df | ||
|
|
9f57278644 | ||
|
|
afc35cf623 | ||
|
|
6d8523054b | ||
|
|
fdecd55278 | ||
|
|
7e7f95916b | ||
|
|
ab52c65dcf | ||
|
|
ed4d0eb5d0 | ||
|
|
4bc9143306 | ||
|
|
a4f558c77a | ||
|
|
e4f226a9c5 | ||
|
|
c7d34049fa | ||
|
|
ee06e620c6 | ||
|
|
b48110db3b | ||
|
|
8413046dd8 | ||
|
|
83a5a82e18 | ||
|
|
771c5fbe3d | ||
|
|
74f16d0137 | ||
|
|
5d5d354f7d | ||
|
|
8f5f27755d | ||
|
|
4cb92cdb06 | ||
|
|
9e067ebdd6 | ||
|
|
fd5fcc9928 | ||
|
|
c0b2abb5fd | ||
|
|
2c8620a75c | ||
|
|
62f6ed0878 | ||
|
|
886b62bbad | ||
|
|
4bd58589fc | ||
|
|
0ce4144767 | ||
|
|
cde945f40e | ||
|
|
c5226c9e59 | ||
|
|
e2126a2693 | ||
|
|
c9f6d92bef | ||
|
|
3bad95b389 | ||
|
|
54ef7760b9 | ||
|
|
fbf4c411c1 | ||
|
|
ce5218db58 | ||
|
|
e2ea7f9b87 | ||
|
|
94d9f04814 | ||
|
|
c86dbac04a | ||
|
|
f36eed32b9 | ||
|
|
cd752209ad | ||
|
|
fe37d619b9 | ||
|
|
2ed5d34192 | ||
|
|
043f4688ef | ||
|
|
949f171579 | ||
|
|
87d586a30e | ||
|
|
783f453da3 | ||
|
|
6dcf889ffe | ||
|
|
8d44879cc6 | ||
|
|
9336a2b4c5 | ||
|
|
eb92ca8cd7 | ||
|
|
e7b813962d | ||
|
|
22fadab3b3 | ||
|
|
91741ec29c | ||
|
|
8269d842ce | ||
|
|
d038bdb6ce | ||
|
|
6cef301b94 | ||
|
|
e7ffbd817c | ||
|
|
97067a6ee2 | ||
|
|
7d1a8f5404 | ||
|
|
43bcf0cf3b | ||
|
|
71751ee18d | ||
|
|
ed105b102d | ||
|
|
f2662045ed | ||
|
|
ecb77b0283 | ||
|
|
4d4869842e | ||
|
|
47300b42b0 | ||
|
|
609565af5f | ||
|
|
0c75f920de | ||
|
|
e7b51f313b | ||
|
|
e8204fc983 | ||
|
|
aa69af64fb | ||
|
|
41f734b04d | ||
|
|
8ad6f3abcc | ||
|
|
e4875903f1 | ||
|
|
0a04de04f1 | ||
|
|
20427fdffa | ||
|
|
0fd0abc6c0 | ||
|
|
70f7fc29d4 | ||
|
|
b0c1aff783 | ||
|
|
4909c28ed9 | ||
|
|
9e6745f691 | ||
|
|
6c3ccb259f | ||
|
|
6c8d80777c | ||
|
|
2db61f93ac | ||
|
|
ad059cbc38 | ||
|
|
87e7e04c5e | ||
|
|
c083d059c9 | ||
|
|
ebd44d3b60 | ||
|
|
51f5d04889 | ||
|
|
0f4d574115 | ||
|
|
1feb4a5e6d | ||
|
|
f861b75c7d | ||
|
|
3530ca8989 | ||
|
|
6b074ed4b2 | ||
|
|
671823b4fa | ||
|
|
8ceebf1546 | ||
|
|
376495836a | ||
|
|
98212df076 | ||
|
|
1316c9235a | ||
|
|
a0905d5695 | ||
|
|
2a35e22dd2 | ||
|
|
f86a07daee | ||
|
|
997628622a | ||
|
|
563e015c92 | ||
|
|
64533de597 | ||
|
|
3776b99c39 | ||
|
|
d3922905c9 | ||
|
|
f5866d7f72 | ||
|
|
dbbc72d00f | ||
|
|
a5d1350815 | ||
|
|
82e44397ff | ||
|
|
335c880af2 | ||
|
|
966efa0669 | ||
|
|
526a61381d | ||
|
|
d01f68f731 | ||
|
|
1235b41172 | ||
|
|
21f3a053ed | ||
|
|
9e960d461b | ||
|
|
02fad0a9cc | ||
|
|
627b78043b | ||
|
|
89b439c3c8 | ||
|
|
4a4a9f267b | ||
|
|
f605aabaa9 | ||
|
|
d82d0ae923 | ||
|
|
1e111d29d9 | ||
|
|
110def97d9 | ||
|
|
5bacdfa951 | ||
|
|
914f1b38f8 | ||
|
|
2aff73a958 | ||
|
|
13c2eae1f4 | ||
|
|
8f4258b119 | ||
|
|
4eba89603e | ||
|
|
61f75d7331 | ||
|
|
cd387c5c3a | ||
|
|
2fa32e5099 | ||
|
|
f12da57720 | ||
|
|
964d1a0d87 | ||
|
|
0cb14461ba | ||
|
|
d05f9c5540 | ||
|
|
690580c57d | ||
|
|
5039763a52 | ||
|
|
2cc54ffa5b | ||
|
|
0a9b78f013 | ||
|
|
e42fa7ad20 | ||
|
|
9c179e559b | ||
|
|
6dd10b74d5 | ||
|
|
a073b0ab18 | ||
|
|
4f253999ac | ||
|
|
9108a7bae6 | ||
|
|
6ba88323fe | ||
|
|
e112e3f949 | ||
|
|
1ed4e9f5bb | ||
|
|
b6c5f202e4 | ||
|
|
976b39414f | ||
|
|
d74887eaa1 | ||
|
|
7fb72bf0e2 | ||
|
|
b0126206e1 | ||
|
|
9c240850b8 | ||
|
|
5b7b50f555 | ||
|
|
f591403b7d | ||
|
|
4b028b3435 | ||
|
|
cbcf237d80 | ||
|
|
a815c564fb | ||
|
|
cb12501d5b | ||
|
|
86aeabc911 | ||
|
|
5e2a455045 | ||
|
|
86dddd0253 | ||
|
|
4677de80c1 | ||
|
|
fbcbca6f24 | ||
|
|
7024273a02 | ||
|
|
070bb4d2d1 | ||
|
|
2b4bcf0b0a | ||
|
|
f33e924cdf | ||
|
|
18fcc6e596 | ||
|
|
59e909ae3a | ||
|
|
66766b43c7 | ||
|
|
8c6c4c2630 | ||
|
|
ea2ed7d776 | ||
|
|
a708c8b7ea | ||
|
|
12ca4cda91 | ||
|
|
85f73fee02 | ||
|
|
1b5b6d424b | ||
|
|
126a764918 | ||
|
|
f796a24956 | ||
|
|
e815cff291 | ||
|
|
0851f2d0e2 | ||
|
|
0ad89ebc04 | ||
|
|
a4b9579d25 | ||
|
|
e65b6670ec | ||
|
|
1665e75068 | ||
|
|
6d01d893f7 | ||
|
|
cb9616a381 | ||
|
|
d218fb926a | ||
|
|
39276b4b03 | ||
|
|
51ba999ee1 | ||
|
|
52593252c5 | ||
|
|
718f56172e | ||
|
|
34b7961814 | ||
|
|
897b90f044 | ||
|
|
a9778e6e68 | ||
|
|
ccaf888e8b | ||
|
|
29821003fe | ||
|
|
3f7ba23dff | ||
|
|
6fd243522d | ||
|
|
368bf2258f | ||
|
|
533ddb874e | ||
|
|
baaf126c15 | ||
|
|
5b2bfe10bc | ||
|
|
17b24c3389 | ||
|
|
55b3e8639f | ||
|
|
22dad88ff7 | ||
|
|
ce3b0f2d8f | ||
|
|
a87e2a56d2 | ||
|
|
bb0ee26e4f | ||
|
|
adf5189541 | ||
|
|
82077936bb | ||
|
|
5094a6fc49 | ||
|
|
274ef166ef | ||
|
|
66c27fab13 | ||
|
|
56bcabedf7 | ||
|
|
79a9541394 | ||
|
|
7e35de3c33 | ||
|
|
7b90044544 | ||
|
|
5a7e5450dc | ||
|
|
ec2ec59be0 | ||
|
|
beb25bd595 | ||
|
|
c2919f7e7a | ||
|
|
cee9d86835 | ||
|
|
9dbedc6e5d | ||
|
|
53310ed80a | ||
|
|
9251c55be2 | ||
|
|
25658f2a0a | ||
|
|
4f9e64588f | ||
|
|
afeb4d033b | ||
|
|
2569b2139d | ||
|
|
d88923bb71 | ||
|
|
d0c6d9a489 | ||
|
|
1bdea1b8d8 | ||
|
|
6ea90ea828 | ||
|
|
6217ae78e3 | ||
|
|
20529d3ebc | ||
|
|
c8fa116a24 | ||
|
|
2904bc69d9 | ||
|
|
38b3ad07b7 | ||
|
|
fe765e5a5b | ||
|
|
6e7514491c | ||
|
|
eb5b50b3e9 | ||
|
|
82b908f0ab | ||
|
|
336256fc71 | ||
|
|
49a7da6393 | ||
|
|
a8c645f00d | ||
|
|
62d8cb0b25 | ||
|
|
f5028a4937 | ||
|
|
203612853b | ||
|
|
8e8e95cd2d | ||
|
|
696e6cb84b | ||
|
|
67940476af | ||
|
|
0dd9d2b460 | ||
|
|
6b2f2d0664 | ||
|
|
636bfdb530 | ||
|
|
c0d6618808 | ||
|
|
e21a3347ac | ||
|
|
59a68ee981 | ||
|
|
7a072746d9 | ||
|
|
a6799dd29b | ||
|
|
163ecb160a | ||
|
|
f00d1f9505 | ||
|
|
87b489a541 | ||
|
|
f670ade2ee | ||
|
|
b5508c1152 | ||
|
|
564c258c86 | ||
|
|
745ff1a270 | ||
|
|
e727ee6d4a | ||
|
|
e6a39a8255 | ||
|
|
43bff5c34d | ||
|
|
c046a1b474 | ||
|
|
209e3f03c1 | ||
|
|
dbf05a1419 | ||
|
|
5af35b6771 | ||
|
|
00abba11ae | ||
|
|
d268d94f76 | ||
|
|
76af3e3077 | ||
|
|
54bade668e | ||
|
|
5a3ec8f407 | ||
|
|
c043664ad6 | ||
|
|
7e9ca6fbb6 | ||
|
|
e9a82652a0 | ||
|
|
db2e6b6973 | ||
|
|
da9278ad8d | ||
|
|
5a9307e9a7 | ||
|
|
f31fd622dd | ||
|
|
6723157ca5 | ||
|
|
956448a1a5 | ||
|
|
4be675f977 | ||
|
|
7924051c0d | ||
|
|
83b5f6ef2d | ||
|
|
0f26d62a0a | ||
|
|
a9f11256cd | ||
|
|
ead0547d59 | ||
|
|
89e29bce62 | ||
|
|
058db5d5d0 | ||
|
|
76aa409f89 | ||
|
|
923d0497e6 | ||
|
|
dd4f4b83fc | ||
|
|
c2bed82db5 | ||
|
|
9a444da343 | ||
|
|
9dd6a77c76 | ||
|
|
895725df64 | ||
|
|
6f07576748 | ||
|
|
550a11962e | ||
|
|
c3883cdad0 | ||
|
|
e9e2cd614d | ||
|
|
55e1759b47 | ||
|
|
33f5215e6d | ||
|
|
5459a646b3 | ||
|
|
6229f99a2e | ||
|
|
0e5b95e3aa | ||
|
|
72d7c1ba54 | ||
|
|
ee9a2ee03d | ||
|
|
6bfbcc4aa9 | ||
|
|
a9d7ed50b7 | ||
|
|
bc77ebc10c | ||
|
|
cbdce79d7d | ||
|
|
46dfa064d0 | ||
|
|
0478af2564 | ||
|
|
750388a425 | ||
|
|
ea9155b903 | ||
|
|
d34f228d2f | ||
|
|
093043750b | ||
|
|
4fb0c246db | ||
|
|
5e951f27c9 | ||
|
|
49253964d8 | ||
|
|
4ff1d0c2e1 | ||
|
|
2385011f96 | ||
|
|
f35f1550e8 | ||
|
|
7527f9326c | ||
|
|
9c7b80f066 | ||
|
|
48facc0978 | ||
|
|
22a6c4e8af | ||
|
|
bd6cfa6461 | ||
|
|
c63dca1c0d | ||
|
|
c6af151bf3 | ||
|
|
ccc20a9716 | ||
|
|
47605583d1 | ||
|
|
58e83c11f0 | ||
|
|
836a4eb892 | ||
|
|
6d50a747e3 | ||
|
|
4344af1f02 | ||
|
|
6510d83524 | ||
|
|
6d01193e1e | ||
|
|
8c3d6d05ab | ||
|
|
733a064c79 | ||
|
|
8715f6a301 | ||
|
|
b51725633e | ||
|
|
5ec11c61bd | ||
|
|
ab038a4d46 | ||
|
|
a976a7affb | ||
|
|
2f76684113 | ||
|
|
1ad7f12e2d | ||
|
|
017b83d375 | ||
|
|
650b443fd0 | ||
|
|
8aa1509f47 | ||
|
|
b21bf2d544 | ||
|
|
777bd60f88 | ||
|
|
7889db43a8 | ||
|
|
ae3aa20508 | ||
|
|
84e754dd10 | ||
|
|
b9618d66f2 | ||
|
|
daa7b20e4a | ||
|
|
48a7254aa3 | ||
|
|
2bc63b37e4 | ||
|
|
33afab7294 | ||
|
|
8010a82776 | ||
|
|
048b7bd32f | ||
|
|
28fa0b070d | ||
|
|
dc0be93b25 | ||
|
|
5e49d2d8d6 | ||
|
|
1d8efe5f9d | ||
|
|
8b791b68d3 | ||
|
|
521174f911 | ||
|
|
a6f7bd9099 | ||
|
|
fed964e0f7 | ||
|
|
77b4f3e930 | ||
|
|
351b8c2469 | ||
|
|
ee9f65d4a3 | ||
|
|
a1a69f62e1 | ||
|
|
ff52fec663 | ||
|
|
5743d30851 | ||
|
|
de02061b5e | ||
|
|
b64c38809e | ||
|
|
a163db485b | ||
|
|
47f7507af3 | ||
|
|
568e55e373 | ||
|
|
79e722b5ff | ||
|
|
415252a5b2 | ||
|
|
307bb7aeec | ||
|
|
397da91ab4 | ||
|
|
fdd0c25a25 | ||
|
|
d691e9f39d | ||
|
|
a5cbe19d23 | ||
|
|
5661124d86 | ||
|
|
1346e163e9 | ||
|
|
d5626bfe52 | ||
|
|
0900c13fa1 | ||
|
|
5019f200b7 | ||
|
|
3b41ded045 | ||
|
|
9f84b84819 | ||
|
|
f61f3af687 | ||
|
|
0a6f7ac817 | ||
|
|
153e6c5f1b | ||
|
|
e24d96da6f | ||
|
|
59e5099ed6 | ||
|
|
b8e6e5df61 | ||
|
|
16851a457e | ||
|
|
1c5bb605c3 | ||
|
|
dc12d58054 | ||
|
|
120e0f6971 | ||
|
|
b9136e4e98 | ||
|
|
197b97d0db | ||
|
|
912136d174 | ||
|
|
653c85c58d | ||
|
|
638c99981d | ||
|
|
71e61abcd6 | ||
|
|
fa1d440bb0 | ||
|
|
f0064e35bc | ||
|
|
88d208268a | ||
|
|
6aa90a44f7 | ||
|
|
3c9322ee08 | ||
|
|
b2f47e6b70 | ||
|
|
c905a870e0 | ||
|
|
b2360e42c6 | ||
|
|
0da621745a | ||
|
|
d8fc3851a7 | ||
|
|
edd3fb3440 | ||
|
|
a105c017d5 | ||
|
|
dd1034e37b | ||
|
|
41f16a54de | ||
|
|
b91510efb3 | ||
|
|
745d8122f5 | ||
|
|
98e4f7409b | ||
|
|
cdb3971b8d | ||
|
|
d01b8c7ad1 | ||
|
|
7c35b6e95a | ||
|
|
86b35fc43d | ||
|
|
5b2c8ac337 | ||
|
|
734d4a912b | ||
|
|
4386d3169a | ||
|
|
35348f1150 | ||
|
|
36b27458b6 | ||
|
|
bbb2153112 | ||
|
|
9ec1d8f16b | ||
|
|
e1858df645 | ||
|
|
3b1066e16f | ||
|
|
75709a7812 | ||
|
|
81c68e90cb | ||
|
|
bc9110b344 | ||
|
|
89d5618232 | ||
|
|
1e8b844eac | ||
|
|
3fc278c7b7 | ||
|
|
db546412f1 | ||
|
|
3b42b604e1 | ||
|
|
f22caed088 | ||
|
|
1f4e611629 | ||
|
|
8879593381 | ||
|
|
22b7086bea | ||
|
|
c097841d78 | ||
|
|
44e4ffbe62 | ||
|
|
84f60f63b8 | ||
|
|
572f358bda | ||
|
|
46df7726c3 | ||
|
|
3abfaf1bca | ||
|
|
f119afe436 | ||
|
|
94908bc599 | ||
|
|
cabcfc7136 | ||
|
|
d2c6305548 | ||
|
|
414af6a5d5 | ||
|
|
ecab13af57 | ||
|
|
ea9ed841ee | ||
|
|
47f9aece38 | ||
|
|
6dc64cf2f6 | ||
|
|
832582caa9 | ||
|
|
828661e9de | ||
|
|
567f3fd3cd | ||
|
|
52f78ee4ed | ||
|
|
9dcd8dc419 | ||
|
|
6029b6d67f | ||
|
|
9d744580a1 | ||
|
|
b295f51c29 | ||
|
|
5c6aea0d50 | ||
|
|
99bf50ee52 | ||
|
|
f48a19a3bc | ||
|
|
fed11db92e | ||
|
|
23fb15fe78 | ||
|
|
7a533f6053 | ||
|
|
a292ff4287 | ||
|
|
29329383e4 | ||
|
|
fefdad5335 | ||
|
|
982f9ce8fb | ||
|
|
5c6d4b9ac2 | ||
|
|
49954f5c07 | ||
|
|
0b837925a2 | ||
|
|
54dd67a435 | ||
|
|
18ddc040d1 | ||
|
|
aeb28f67e4 | ||
|
|
54b892cd29 | ||
|
|
2e28525c4b | ||
|
|
8aa8de570f | ||
|
|
6723479c32 | ||
|
|
e318b6a113 | ||
|
|
df44f82198 | ||
|
|
97d54868e9 | ||
|
|
65e65ba308 | ||
|
|
2056d5e350 | ||
|
|
8b3b72243f | ||
|
|
814146f227 | ||
|
|
511983e1ea | ||
|
|
13e5df62c9 | ||
|
|
8debf8caf8 | ||
|
|
eab90cac05 | ||
|
|
ce401b01b6 | ||
|
|
271dcd46bc | ||
|
|
e19bd9d434 | ||
|
|
c1a7b452e0 | ||
|
|
e50ff6b0a5 | ||
|
|
34ddb92e4d | ||
|
|
35b16c7292 | ||
|
|
931fc93b4b | ||
|
|
35ecd26634 | ||
|
|
ac3bb37c36 | ||
|
|
17b8b285a3 | ||
|
|
788bf383aa | ||
|
|
8d0b889f3c | ||
|
|
d250fb655d | ||
|
|
aacd9dc62c | ||
|
|
061c55614b | ||
|
|
41c6887f33 | ||
|
|
b427185fac | ||
|
|
6fa14accfe | ||
|
|
1b8933cd84 | ||
|
|
e6261a6bf8 | ||
|
|
0a76647175 | ||
|
|
787706b1f7 | ||
|
|
94665e8055 | ||
|
|
b24770629e | ||
|
|
a09bd09a0e | ||
|
|
74eb79de17 | ||
|
|
988df8742c | ||
|
|
10c41bf443 | ||
|
|
bb30876557 | ||
|
|
81c24b3de1 | ||
|
|
4e1f734af7 | ||
|
|
2f726cf7f2 | ||
|
|
e726d16094 | ||
|
|
5bda5124e6 | ||
|
|
1a66b7c4c3 | ||
|
|
da86dee981 | ||
|
|
6caf0fc1cc | ||
|
|
8d28976b0d | ||
|
|
26e972314e | ||
|
|
8a582f8872 | ||
|
|
ca04504573 | ||
|
|
80360214df | ||
|
|
c69eae486e | ||
|
|
57bebd3fb6 | ||
|
|
329dac77ee | ||
|
|
e5dabc63c2 | ||
|
|
f652135e19 | ||
|
|
6bf7d8b111 | ||
|
|
004ad0eb8c | ||
|
|
989034c799 | ||
|
|
c2334ce80a | ||
|
|
6d59fe3080 | ||
|
|
9c01256029 | ||
|
|
e33c863162 | ||
|
|
787a9c0083 | ||
|
|
c75c22955c | ||
|
|
5afb5d24d8 | ||
|
|
134cc34d74 | ||
|
|
3397d6c907 | ||
|
|
f8cf185db9 | ||
|
|
735935c0c4 | ||
|
|
fd3beaf2b9 | ||
|
|
034fab480d | ||
|
|
17432d1f94 | ||
|
|
62c6d8e42d | ||
|
|
14e057cf05 | ||
|
|
982c9bf964 | ||
|
|
b4aba3d263 | ||
|
|
e2eabfc141 | ||
|
|
9f9d57b9a9 | ||
|
|
236e3c7e61 | ||
|
|
2160844ad0 | ||
|
|
51475d600c | ||
|
|
149f7a1d9d | ||
|
|
56ef7ae60c | ||
|
|
7ec6586c4a | ||
|
|
074a6bfa87 | ||
|
|
965fec5927 | ||
|
|
58b87aa999 | ||
|
|
b0b16b52ee | ||
|
|
9ab3f7e5aa | ||
|
|
61210955bd | ||
|
|
28f73d0a76 | ||
|
|
99fb1a4c5f | ||
|
|
42cf80106f | ||
|
|
bcb9cfd2fe | ||
|
|
1d57568322 | ||
|
|
d9ade96fad | ||
|
|
82d20efa8d | ||
|
|
8c7716428d | ||
|
|
9ac8a4211e | ||
|
|
ab69cd8027 | ||
|
|
4cb72c1998 | ||
|
|
12ccc10e83 | ||
|
|
ec631f3499 | ||
|
|
630693d64e | ||
|
|
2972780bed | ||
|
|
cf3d2c3def | ||
|
|
1f8751054c | ||
|
|
739219c57b | ||
|
|
f56e1933a6 | ||
|
|
11e071289b | ||
|
|
c9480ef17d | ||
|
|
a9517096f9 | ||
|
|
fc3f03425e | ||
|
|
8d43046f13 | ||
|
|
cd6880aff4 | ||
|
|
ccefa45fb0 | ||
|
|
b721d7a10f | ||
|
|
f640494c1f | ||
|
|
77b9feb765 | ||
|
|
99139dfcca | ||
|
|
a3ee43b31c | ||
|
|
12dd16d4bf | ||
|
|
a5b9e57576 | ||
|
|
6c194d257c | ||
|
|
21f61d46da | ||
|
|
6ac8a9d440 | ||
|
|
4a8299d9dc | ||
|
|
560d388df4 | ||
|
|
7683e86d8b | ||
|
|
ebb763db03 | ||
|
|
920491ddb2 | ||
|
|
761728ac43 | ||
|
|
d8ddb9dc82 | ||
|
|
405f153439 | ||
|
|
f789a35901 | ||
|
|
46c6b2168c | ||
|
|
1f955904a4 | ||
|
|
558c89cc30 | ||
|
|
222d41c84a | ||
|
|
12a62f4607 | ||
|
|
f561768c67 | ||
|
|
c1bb05c0a4 | ||
|
|
f5b8d8a60c | ||
|
|
8218cfc72c | ||
|
|
00706daae5 | ||
|
|
6ba8a6a600 | ||
|
|
377fb2329c | ||
|
|
285ee665ee | ||
|
|
f8d55ba837 | ||
|
|
c6f1f19866 | ||
|
|
745592f507 | ||
|
|
d52f5e6e03 | ||
|
|
eb62356313 | ||
|
|
919dc248e3 | ||
|
|
09598e0ced | ||
|
|
6af2696f6a | ||
|
|
69dac77932 | ||
|
|
a011728cc9 | ||
|
|
e584139b6d | ||
|
|
21f3f52c7b | ||
|
|
568e43cf3d | ||
|
|
e004e540d7 | ||
|
|
cac6172344 | ||
|
|
2764e0e5fa | ||
|
|
fa5cdc3afa | ||
|
|
d8cbc7ddd8 | ||
|
|
8dae5ec47a | ||
|
|
bdf3a2dfe8 | ||
|
|
693b82e47d | ||
|
|
888be0fd5e | ||
|
|
e8ea2af298 | ||
|
|
785c2e36c6 | ||
|
|
d824b41bbb | ||
|
|
a9df64f861 | ||
|
|
4cb78f55d1 | ||
|
|
8091bec6bf | ||
|
|
7baf42b138 | ||
|
|
ab9835b896 | ||
|
|
9d142c5607 | ||
|
|
09db6dc424 | ||
|
|
3b62526267 | ||
|
|
5d80031a40 | ||
|
|
656e4d529c | ||
|
|
a894873d6b | ||
|
|
832aac0e6e | ||
|
|
6967d4e762 | ||
|
|
e422f64b8b | ||
|
|
ed143414ca | ||
|
|
f9c48f5edf |
12
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help fix an issue.
|
||||||
|
---
|
||||||
|
|
||||||
|
**Platform**: *Android/iOS/Mac/Windows/Linux*
|
||||||
|
|
||||||
|
**Build**: *The build number under the title in the main menu. Required.*
|
||||||
|
|
||||||
|
**Issue**: *Explain your issue in detail.*
|
||||||
|
|
||||||
|
**Steps to reproduce**: *How you happened across the issue, and what you were doing at the time.*
|
||||||
7
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Do not make a new issue for feature requests!** Instead, post it on FeatHub: https://feathub.com/Anuken/Mindustry
|
||||||
85
.github/Mindustry-CodeStyle-IJ.xml
vendored
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
<code_scheme name="Default" version="173">
|
||||||
|
<option name="AUTODETECT_INDENTS" value="false" />
|
||||||
|
<option name="RIGHT_MARGIN" value="300" />
|
||||||
|
<GroovyCodeStyleSettings>
|
||||||
|
<option name="SPACE_BEFORE_CLOSURE_LBRACE" value="false" />
|
||||||
|
</GroovyCodeStyleSettings>
|
||||||
|
<JavaCodeStyleSettings>
|
||||||
|
<option name="SPACE_AROUND_TYPE_BOUNDS_IN_TYPE_PARAMETERS" value="false" />
|
||||||
|
<option name="INSERT_INNER_CLASS_IMPORTS" value="true" />
|
||||||
|
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="1" />
|
||||||
|
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="2" />
|
||||||
|
<option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
|
||||||
|
<value>
|
||||||
|
<package name="java.awt" withSubpackages="false" static="false" />
|
||||||
|
<package name="io.anuke.mindustry" withSubpackages="false" static="true" />
|
||||||
|
<package name="javax.swing" withSubpackages="false" static="false" />
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
<option name="JD_ALIGN_PARAM_COMMENTS" value="false" />
|
||||||
|
<option name="JD_ALIGN_EXCEPTION_COMMENTS" value="false" />
|
||||||
|
<option name="JD_ADD_BLANK_AFTER_DESCRIPTION" value="false" />
|
||||||
|
<option name="JD_DO_NOT_WRAP_ONE_LINE_COMMENTS" value="true" />
|
||||||
|
<option name="JD_KEEP_EMPTY_PARAMETER" value="false" />
|
||||||
|
<option name="JD_KEEP_EMPTY_EXCEPTION" value="false" />
|
||||||
|
<option name="JD_KEEP_EMPTY_RETURN" value="false" />
|
||||||
|
</JavaCodeStyleSettings>
|
||||||
|
<Properties>
|
||||||
|
<option name="SPACES_AROUND_KEY_VALUE_DELIMITER" value="true" />
|
||||||
|
<option name="KEEP_BLANK_LINES" value="true" />
|
||||||
|
</Properties>
|
||||||
|
<codeStyleSettings language="Groovy">
|
||||||
|
<option name="SPACE_BEFORE_IF_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_WHILE_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_FOR_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_TRY_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_CATCH_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_SWITCH_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_SYNCHRONIZED_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_CLASS_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_METHOD_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_IF_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_ELSE_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_WHILE_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_FOR_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_DO_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_SWITCH_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_TRY_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_CATCH_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_FINALLY_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_SYNCHRONIZED_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_ELSE_KEYWORD" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_WHILE_KEYWORD" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_CATCH_KEYWORD" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_FINALLY_KEYWORD" value="false" />
|
||||||
|
</codeStyleSettings>
|
||||||
|
<codeStyleSettings language="JAVA">
|
||||||
|
<option name="SPACE_AFTER_TYPE_CAST" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_IF_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_WHILE_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_FOR_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_TRY_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_CATCH_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_SWITCH_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_SYNCHRONIZED_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_CLASS_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_METHOD_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_IF_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_ELSE_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_WHILE_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_FOR_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_DO_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_SWITCH_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_TRY_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_CATCH_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_FINALLY_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_SYNCHRONIZED_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_ELSE_KEYWORD" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_WHILE_KEYWORD" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_CATCH_KEYWORD" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_FINALLY_KEYWORD" value="false" />
|
||||||
|
<indentOptions>
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="0" />
|
||||||
|
</indentOptions>
|
||||||
|
</codeStyleSettings>
|
||||||
|
</code_scheme>
|
||||||
17
.github/workflows/gradle.yml
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
name: Java CI
|
||||||
|
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: Set up JDK 1.8
|
||||||
|
uses: actions/setup-java@v1
|
||||||
|
with:
|
||||||
|
java-version: 1.8
|
||||||
|
#- name: Run unit tests with gradle
|
||||||
|
# run: ./gradlew test
|
||||||
17
.gitignore
vendored
@@ -1,23 +1,30 @@
|
|||||||
##Packr, build stuff
|
|
||||||
|
|
||||||
logs/
|
logs/
|
||||||
/core/assets/mindustry-saves/
|
/core/assets/mindustry-saves/
|
||||||
/core/assets/mindustry-maps/
|
/core/assets/mindustry-maps/
|
||||||
/core/assets/bundles/output/
|
/core/assets/bundles/output/
|
||||||
/core/assets/.gifimages/
|
/core/assets/.gifimages/
|
||||||
/deploy/
|
/deploy/
|
||||||
|
/out/
|
||||||
/desktop/packr-out/
|
/desktop/packr-out/
|
||||||
/desktop/packr-export/
|
/desktop/packr-export/
|
||||||
/desktop/mindustry-saves/
|
/desktop/mindustry-saves/
|
||||||
/desktop/mindustry-maps/
|
/desktop/mindustry-maps/
|
||||||
/desktop/gifexport/
|
/desktop/gifexport/
|
||||||
/core/lib/
|
/core/lib/
|
||||||
|
/ios/assets/
|
||||||
/core/assets-raw/sprites/generated/
|
/core/assets-raw/sprites/generated/
|
||||||
|
/core/assets-raw/sprites_out/
|
||||||
/annotations/build/
|
/annotations/build/
|
||||||
/kryonet/build/
|
/annotations/out/
|
||||||
|
/net/build/
|
||||||
/tools/build/
|
/tools/build/
|
||||||
/tests/build/
|
/tests/build/
|
||||||
/server/build/
|
/server/build/
|
||||||
|
changelog
|
||||||
|
saves/
|
||||||
|
core/assets/saves/
|
||||||
|
/core/assets/saves/
|
||||||
|
steam_appid.txt
|
||||||
/test_files/
|
/test_files/
|
||||||
/annotations/build/
|
/annotations/build/
|
||||||
/android/assets/mindustry-maps/
|
/android/assets/mindustry-maps/
|
||||||
@@ -28,7 +35,11 @@ logs/
|
|||||||
/ios/src/io/anuke/mindustry/gen/
|
/ios/src/io/anuke/mindustry/gen/
|
||||||
/core/src/io/anuke/mindustry/gen/
|
/core/src/io/anuke/mindustry/gen/
|
||||||
ios/robovm.properties
|
ios/robovm.properties
|
||||||
|
packr-out/
|
||||||
|
config/
|
||||||
|
changelog
|
||||||
*.gif
|
*.gif
|
||||||
|
/core/assets/saves/
|
||||||
|
|
||||||
version.properties
|
version.properties
|
||||||
|
|
||||||
|
|||||||
33
.travis.yml
@@ -1,20 +1,43 @@
|
|||||||
|
|
||||||
jdk:
|
jdk:
|
||||||
- openjdk8
|
- openjdk8
|
||||||
|
dist: trusty
|
||||||
|
android:
|
||||||
|
components:
|
||||||
|
- android-29
|
||||||
|
- build-tools-29.0.2
|
||||||
|
|
||||||
script:
|
script:
|
||||||
|
- git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
|
||||||
|
- cd ../MindustryBuilds
|
||||||
|
- echo ${TRAVIS_TAG}
|
||||||
|
- if [ -n "$TRAVIS_TAG" ]; then echo versionName=5-fdroid-${TRAVIS_TAG:1}$'\n'versionCode=${TRAVIS_TAG:1} > version_fdroid.txt; git add .; git commit -m "Updating to build ${TRAVIS_TAG}"; fi
|
||||||
|
- git tag ${TRAVIS_BUILD_NUMBER}
|
||||||
|
- git config --global user.name "Build Uploader"
|
||||||
|
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/MindustryBuilds ${TRAVIS_BUILD_NUMBER}; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/MindustryBuilds; fi
|
||||||
|
- cd ../Mindustry
|
||||||
|
- git clone --depth=1 --branch=master https://github.com/Anuken/Arc ../Arc
|
||||||
|
- if [ -n "$TRAVIS_TAG" ]; then cd ../Arc; git tag ${TRAVIS_TAG}; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/Arc ${TRAVIS_TAG}; cd ../Mindustry; fi
|
||||||
- "./gradlew test"
|
- "./gradlew test"
|
||||||
- "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
- "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
||||||
- "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
- "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
provider: releases
|
- provider: releases
|
||||||
skip_cleanup: true
|
skip_cleanup: true
|
||||||
draft: false
|
draft: false
|
||||||
api_key:
|
api_key:
|
||||||
secure: Cv5wFtWt62/A24EvSEQvMow7gKPbZ3oATEFPuSghhB2TQz1dA40Zee3Qvk4LFlpLrhYo4K0ZSczCZRGpR+hCd8+Dpww52bheYEvWuh3ZQfvu/fXtEx2j5PwP1qMpmIgSxETV/gkD7l9FImdh0VzktYiAvQfmi0bEocG9/D4QwjFpNat7iwBdcMiw1MvAygpdIWRsjiw0RKlB2mWarmoHhQ7Gu7qlU3j50uaEvcrtmU0pBUPggNQwQRv32i9NPvNFxrqqlUjDLIS8JFea99zCkp8BwYqbEvBIMzd+Qip1/stLJJA3+cDUClbsDtg8rAVetzpOrdLEEBmqShFe5MDl2yEHcsgpN9CFsyTaUfvB3P3rVjizvycMm42IsUkXQiarm5xTQ/TIA8Rd8AHiSKuweNCg1Fd5SFaRtKy8JVLXuxyfUccmyje6hhz2L4lS2Wfj3mAG7sqZUCXhWP79EKdGkiPOjKv4CwXEKmuH3BMVqPlNUZJr9Eg3sV1FG0h2l+MVOOnR635qdUbb49sYojYxVruMLX0BH1c4ZCu230m8CUoWA1Em1QNI75ya7+9Y5T6AsgWDVpBvdUo9fWNbdp+VQ0GskFQsJD5wtnxbcbHeFiERAgGBm7z6qt9u9LrQpBH+dsW52ADvYsu3L4nQEa+sdMHwTTwmGY+iUvsxu0DqxGg=
|
secure: Cv5wFtWt62/A24EvSEQvMow7gKPbZ3oATEFPuSghhB2TQz1dA40Zee3Qvk4LFlpLrhYo4K0ZSczCZRGpR+hCd8+Dpww52bheYEvWuh3ZQfvu/fXtEx2j5PwP1qMpmIgSxETV/gkD7l9FImdh0VzktYiAvQfmi0bEocG9/D4QwjFpNat7iwBdcMiw1MvAygpdIWRsjiw0RKlB2mWarmoHhQ7Gu7qlU3j50uaEvcrtmU0pBUPggNQwQRv32i9NPvNFxrqqlUjDLIS8JFea99zCkp8BwYqbEvBIMzd+Qip1/stLJJA3+cDUClbsDtg8rAVetzpOrdLEEBmqShFe5MDl2yEHcsgpN9CFsyTaUfvB3P3rVjizvycMm42IsUkXQiarm5xTQ/TIA8Rd8AHiSKuweNCg1Fd5SFaRtKy8JVLXuxyfUccmyje6hhz2L4lS2Wfj3mAG7sqZUCXhWP79EKdGkiPOjKv4CwXEKmuH3BMVqPlNUZJr9Eg3sV1FG0h2l+MVOOnR635qdUbb49sYojYxVruMLX0BH1c4ZCu230m8CUoWA1Em1QNI75ya7+9Y5T6AsgWDVpBvdUo9fWNbdp+VQ0GskFQsJD5wtnxbcbHeFiERAgGBm7z6qt9u9LrQpBH+dsW52ADvYsu3L4nQEa+sdMHwTTwmGY+iUvsxu0DqxGg=
|
||||||
file:
|
file:
|
||||||
- "desktop/build/libs/desktop-release.jar"
|
- desktop/build/libs/Mindustry.jar
|
||||||
- "server/build/libs/server-release.jar"
|
- server/build/libs/server-release.jar
|
||||||
on:
|
on:
|
||||||
repo: Anuken/Mindustry
|
repo: Anuken/Mindustry
|
||||||
tags: true
|
tags: true
|
||||||
|
- provider: script
|
||||||
|
script: bash update_wiki.sh
|
||||||
|
on:
|
||||||
|
repo: Anuken/Mindustry
|
||||||
|
tags: true
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
- secure: TqlUl/ojjkCMVOGbCTKz7Cnr4F08UyWzY/CiJ0vvUOGJGZ1qm7XavAlDf5XT0egU4mvr37THubFO8vojbqmrmy0oZnYh3njKFA8axgyZ8PyKkjGHOfd0i6qyEWsOr9H90/2X8r3LwEeLaDFyHpu3wljIGBjweg53g2qwmDwCFa9UR80FJZ+xDB+rD6B3cXT0DTEkCoLZXLqXm0Y3HvBdSuBL1LR/FNb2BSxNq+tNLGiz1kdQZV5erausbbZypBoGxzz63xAnyz2kkFz73A8xQYVTzGbFodTPz7HM13GVZ5s43I03Y+HYyHBgBaSLziO2hi2kzVJccOwzBp7wS4fs1MqsFY5+IeWJ9k+hm89NiYT7+6zlEgoUMlIniny1qLqWTzx7btUeuC/y/h5TVBNgaV+z0jmHycHfeSyq5I+vmX4J8qe3wmaN8TcdqYKU5nIznOTk3CM5Fzu0Bs9vkCkOxmormmcjMFW1RbdOLc/hpZWZggsBA88sNEAI8eq+r5QEeqzeCx8YKoZDjdrsqvgLMc3El3gS9oMGxkn0Y/TEcqs9Tc4BXtTkqIA68hD0DYzlAxYjVbbkAI9Hh9lHNvV3Dr/oCkGXQ/HflM143kj1L3tSBZpqeqQE2XhngB5nqpS3OZTmZbMTQ8qD2luU18yaTGMLF5tJS/fdKPRx0gQ1kL8=
|
||||||
|
- secure: VEskj/0TVX2o7iUVXuVPysj/VSWmPhDl57SrT7/nBNN/P/8N5jFAvx8PMzG7qT0S5FzKxuV20psE4WylUGRKdeRtK7/QNBV7T3YqYYM6BUB1VeRpxe5hLxTeuBK3izglFO8DkdDqjUtzQSjzkoYT75ilROjhBrBUPhVek7UlbBHbaklPWYFXHnJmYS1FpZTdzqIj+Y0Gd1PSL2MzK4X74aAHl0qaDgsTwYwtKs7IAz+kFaTZBRpi9VjQHAFhDlkDR3jo9wQjH8/F6x0lCgV/FulSc37Okdb40sLFG98xcEA6gWh1NPMkz8CulUdVE7mj7SJNxLbNvoMNrWOVRjmEsn59p/9LiNC1F9ncFz9vjQjAmi7rMFFGHGxe5nn8cIAkpTvHQQkZoWHAA9SNJTDMMf09m2pRy/vvzx+a6NVxyC9iNrhLlnBg4gxAqRh0S6NU0uL+fuygKixn7rqlnb7KMT7bAbfcuV+dng6c8V7hYKDCh7sJbH8iJump1xkwoM7ecnU8fxJF/oKOr/fbk0Bfxu+Q9qYLrV1+DEdm93Vl2Thq+DBKmI66jRGSva6HeCLFo81PEiEjP1nLv75+kvVfOqVqJrZD1BrvoG2eWT/3hVLrN2kEIWWlpvQVC7FL11yWmYtAuOBh/vfhI76zKr+YTS6ccG9rqW4XeYjJytshe8M=
|
||||||
|
|||||||
69
CONTRIBUTING.md
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
# Contributing
|
||||||
|
|
||||||
|
This is for code contributions. For translations, see [TRANSLATING](TRANSLATING.md).
|
||||||
|
|
||||||
|
## Basic Guidelines
|
||||||
|
|
||||||
|
#### Use an IDE.
|
||||||
|
Specifically, IntelliJ IDEA. Download the (free) Community Edition of it [here](https://www.jetbrains.com/idea/download/). Some people use other tools, like VS Code, but I would personally not recommend them for Java development.
|
||||||
|
|
||||||
|
#### Always test your changes.
|
||||||
|
Do not submit something without at least running the game to see if it compiles.
|
||||||
|
If you are submitting a new block, make sure it has a name and description, and that it works correctly in-game. If you are changing existing block mechanics, test them out first.
|
||||||
|
|
||||||
|
|
||||||
|
#### Do not make large changes before discussing them first.
|
||||||
|
If you are interested in adding a large mechanic/feature or changing large amounts of code, first contact me (Anuken) via [Discord](https://discord.gg/mindustry) (preferred method) or via e-mail (*anukendev@gmail.com*).
|
||||||
|
For most changes, this should not be necessary. I just want to know if you're doing something big so I can offer advice and/or make sure you're not wasting your time on it.
|
||||||
|
|
||||||
|
|
||||||
|
## Style Guidelines
|
||||||
|
|
||||||
|
#### Follow the formatting guidelines.
|
||||||
|
This means:
|
||||||
|
- No spaces around parentheses: `if(condition){`, `SomeType s = (SomeType)object`
|
||||||
|
- Same-line braces.
|
||||||
|
- 4 spaces indentation
|
||||||
|
- `camelCase`, **even for constants or enums**. Why? Because `SCREAMING_CASE` is ugly, annoying to type and does not achieve anything useful. Constants are *less* dangerous than variables, not more.
|
||||||
|
- No underscores for anything. (Yes, I know `Bindings` violates this principle, but that's for legacy reasons and really should be cleaned up some day)
|
||||||
|
|
||||||
|
Import [this style file](.github/Mindustry-CodeStyle-IJ.xml) into IntelliJ to get correct formatting when developing Mindustry.
|
||||||
|
|
||||||
|
#### Do not use incompatible Java features (java.util.function, java.awt).
|
||||||
|
Android [does not support](https://developer.android.com/studio/write/java8-support#supported_features) many of Java 8's features, such as the packages `java.util.function`, `java.util.stream` or `forEach` in collections. Do not use these in your code.
|
||||||
|
If you need to use functional interfaces, use the ones in `io.anuke.arc.func`, which are more or less the same with different naming schemes.
|
||||||
|
|
||||||
|
The same applies to any class *outside* of the standard `java.[n]io` / `java.net` / `java.util` packages: Most of them are not supported.
|
||||||
|
`java.awt` is one of these packages: do not use it, ever. It is not supported on any platform, even desktop - the entire package is removed during JRE minimization.
|
||||||
|
In general, if you are using IntelliJ, you should be warned about platform incompatiblities.
|
||||||
|
|
||||||
|
|
||||||
|
#### Use `arc` collections and classes when possible.
|
||||||
|
Instead of using `java.util.List`, `java.util.HashMap`, and other standard Java collections, use `Array`, `ObjectMap` and other equivalents from `io.anuke.arc.collection`.
|
||||||
|
Why? Because that's what the rest of the codebase uses, and the standard collections have a lot of cruft and usability issues associated with them.
|
||||||
|
In the rare case that concurrency is required, you may use the standard Java classes for that purpose (e.g. `CopyOnWriteArrayList`).
|
||||||
|
|
||||||
|
What you'll usually need to change:
|
||||||
|
- `HashSet` -> `ObjectSet`
|
||||||
|
- `HashMap` -> `ObjectMap`
|
||||||
|
- `List` / `ArrayList` / `Stack` -> `Array`
|
||||||
|
- `java.util.Queue` -> `io.anuke.arc.collection.Queue`
|
||||||
|
- *Many others*
|
||||||
|
|
||||||
|
|
||||||
|
#### Avoid boxed types (Integer, Boolean)
|
||||||
|
Never create variables or collections with boxed types `Array<Integer>` or `ObjectMap<Integer, ...>`. Use the collections specialized for this task, e.g. `IntArray` and `IntMap`.
|
||||||
|
|
||||||
|
|
||||||
|
#### Do not allocate anything if possible.
|
||||||
|
Never allocate `new` objects in the main loop. If you absolutely require new objects, use `Pools` to obtain and free object instances.
|
||||||
|
Otherwise, use the `Tmp` variables for things like vector/shape operations, or create `static` variables for re-use.
|
||||||
|
If using a list, make it a static variable and clear it every time it is used. Re-use as much as possible.
|
||||||
|
|
||||||
|
#### Avoid bloated code and unnecessary getters/setters.
|
||||||
|
This is situational, but in essence what it means is to avoid using any sort of getters and setters unless absolutely necessary. Public or protected fields should suffice for most things.
|
||||||
|
If something needs to be encapsulated in the future, IntelliJ can handle it with a few clicks.
|
||||||
|
|
||||||
|
|
||||||
|
#### Do not create methods unless necessary.
|
||||||
|
Unless a block of code is very large or used in more than 1-2 places, don't split it up into a separate method. Making unnecessary methods only creates confusion, and may slightly decrease performance.
|
||||||
51
README.md
@@ -1,42 +1,69 @@
|
|||||||

|

|
||||||
|
|
||||||
[](https://travis-ci.org/Anuken/Mindustry)
|
[](https://travis-ci.org/Anuken/Mindustry)
|
||||||
[](https://discord.gg/mindustry)
|
[](https://discord.gg/mindustry)
|
||||||
|
|
||||||
A pixelated sandbox tower defense game made using [LibGDX](https://libgdx.badlogicgames.com/). Winner of the [GDL Metal Monstrosity Jam](https://itch.io/jam/gdl---metal-monstrosity-jam).
|
A sandbox tower defense game written in Java.
|
||||||
|
|
||||||
_[Trello Board](https://trello.com/b/aE2tcUwF/mindustry-40-plans)_
|
_[Trello Board](https://trello.com/b/aE2tcUwF/mindustry-40-plans)_
|
||||||
_[Wiki](http://mindustry.wikia.com/wiki/Mindustry_Wiki)_
|
_[Wiki](https://mindustrygame.github.io/wiki)_
|
||||||
_[Discord](https://discord.gg/r8BkXNd)_
|
|
||||||
|
### Contributing
|
||||||
|
|
||||||
|
See [CONTRIBUTING](CONTRIBUTING.md).
|
||||||
|
|
||||||
### Building
|
### Building
|
||||||
|
|
||||||
Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://jenkins.hellomouse.net/job/mindustry/).
|
Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases). Old builds might still be on [jenkins](https://jenkins.hellomouse.net/job/mindustry/).
|
||||||
|
|
||||||
If you'd rather compile on your own, follow these instructions.
|
If you'd rather compile on your own, follow these instructions.
|
||||||
First, make sure you have Java 8 and JDK 8 installed. Open a terminal in the root directory, and run the following commands:
|
First, make sure you have [Java 8](https://www.java.com/en/download/) and [JDK 8](https://adoptopenjdk.net/) installed. Open a terminal in the root directory, `cd` to the Mindustry folder and run the following commands:
|
||||||
|
|
||||||
#### Windows
|
#### Windows
|
||||||
|
|
||||||
_Running:_ `gradlew desktop:run`
|
_Running:_ `gradlew desktop:run`
|
||||||
_Building:_ `gradlew desktop:dist`
|
_Building:_ `gradlew desktop:dist`
|
||||||
|
|
||||||
#### Linux
|
#### Linux/Mac OS
|
||||||
|
|
||||||
_Running:_ `./gradlew desktop:run`
|
_Running:_ `./gradlew desktop:run`
|
||||||
_Building:_ `./gradlew desktop:dist`
|
_Building:_ `./gradlew desktop:dist`
|
||||||
|
|
||||||
#### For Server Builds...
|
#### Server
|
||||||
|
|
||||||
Server builds are bundled with each released build (in Releases). If you'd rather compile on your own, replace 'desktop' with 'server' i.e. `gradlew server:dist`.
|
Server builds are bundled with each released build (in Releases). If you'd rather compile on your own, replace 'desktop' with 'server', e.g. `gradlew server:dist`.
|
||||||
|
|
||||||
|
#### Android
|
||||||
|
|
||||||
|
1. Install the Android SDK [here.](https://developer.android.com/studio#downloads) Make sure you're downloading the "Command line tools only", as Android Studio is not required.
|
||||||
|
2. Create a file named `local.properties` inside the Mindustry directory, with its contents looking like this: `sdk.dir=<Path to Android SDK you just downloaded, without these bracket>`. For example, if you're on Windows and installed the tools to C:\\tools, your local.properties would contain `sdk.dir=C:\\tools` (*note the double backslashes are required instead of single ones!*).
|
||||||
|
3. Run `gradlew android:assembleDebug` (or `./gradlew` if on linux/mac). This will create an unsigned APK in `android/build/outputs/apk`.
|
||||||
|
4. (Optional) To debug the application on a connected phone, do `gradlew android:installDebug android:run`. It is **highly recommended** to use IntelliJ for this instead, however.
|
||||||
|
|
||||||
|
##### Troubleshooting
|
||||||
|
|
||||||
|
If the terminal returns `Permission denied` or `Command not found` on Mac/Linux, run `chmod +x ./gradlew` before running `./gradlew`. *This is a one-time procedure.*
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Gradle may take up to several minutes to download files. Be patient. <br>
|
Gradle may take up to several minutes to download files. Be patient. <br>
|
||||||
After building, the output .JAR file should be in `/desktop/build/libs/desktop-release.jar` for desktop builds, and in `/server/build/libs/server-release.jar` for server builds.
|
After building, the output .JAR file should be in `/desktop/build/libs/Mindustry.jar` for desktop builds, and in `/server/build/libs/server-release.jar` for server builds.
|
||||||
|
|
||||||
|
### Feature Requests
|
||||||
|
|
||||||
|
[](https://feathub.com/Anuken/Mindustry)
|
||||||
|
|
||||||
|
|
||||||
### Downloads
|
### Downloads
|
||||||
|
|
||||||
<a href="https://anuke.itch.io/mindustry"><img src="https://i.imgur.com/sk26hTV.png" width="auto" height="75"></a>
|
[<img src="https://static.itch.io/images/badge.svg"
|
||||||
|
alt="Get it on Itch.io"
|
||||||
|
height="60">](https://anuke.itch.io/mindustry)
|
||||||
|
|
||||||
<a href="https://play.google.com/store/apps/details?id=io.anuke.mindustry&hl=en"><img src="https://i.imgur.com/8dF6l81.png" width="auto" height="75"></a>
|
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png"
|
||||||
|
alt="Get it on Google Play"
|
||||||
|
height="80">](https://play.google.com/store/apps/details?id=io.anuke.mindustry)
|
||||||
|
|
||||||
|
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
||||||
|
alt="Get it on F-Droid"
|
||||||
|
height="80">](https://f-droid.org/packages/io.anuke.mindustry/)
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
## Translating for Mindustry
|
## Translating for Mindustry
|
||||||
|
|
||||||
**DISCLAIMER:** *Currently, 4.0 is far from done, which means that things such as block names, descriptions, and core text will be changing often. If you begin translating now, you might have to re-do large chunks of the bundle before final release.*
|
|
||||||
|
|
||||||
|
|
||||||
To begin, log in to your GitHub account, or if you don't have one yet, create it [here](https://github.com/).
|
To begin, log in to your GitHub account, or if you don't have one yet, create it [here](https://github.com/).
|
||||||
|
|
||||||
Consult [this list](https://www.science.co.il/language/Locale-codes.php) to find the locale code for your language. Once you've found it,
|
Consult [this list](https://www.science.co.il/language/Locale-codes.php) to find the locale code for your language. Once you've found it,
|
||||||
@@ -34,6 +31,10 @@ There are two ways to test the translation bundle:
|
|||||||
1) Assuming you have the PC version downloaded, download your bundle file, name it `bundle.properties`, then place it in the same folder as the Mindustry desktop executable and run it. *You should get a popup message in-game confirming that you have loaded an external translation.*
|
1) Assuming you have the PC version downloaded, download your bundle file, name it `bundle.properties`, then place it in the same folder as the Mindustry desktop executable and run it. *You should get a popup message in-game confirming that you have loaded an external translation.*
|
||||||
2) For advanced users: simply download your fork of mindustry and compile/run the game.
|
2) For advanced users: simply download your fork of mindustry and compile/run the game.
|
||||||
|
|
||||||
|
#### Translating for stores (Steam, Google Play)
|
||||||
|
|
||||||
|
If you would like to translate the descriptions for Google Play or Steam, see the [Fastlane Metadata folder](https://github.com/Anuken/Mindustry/tree/master/fastlane/metadata) and submit a pull request for files there. On Google Play, you would create or edit the folder with the correct local code; for Steam, I have to update the translations manually, so just name the folder with the language name, and include the same files as the English folder does.
|
||||||
|
|
||||||
**And that's it.**
|
**And that's it.**
|
||||||
|
|
||||||
*(...of course, that's never really it. Bother me on Discord when something inevitably goes wrong.)*
|
*(...of course, that's never really it. Bother me on Discord when something inevitably goes wrong.)*
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
package="io.anuke.mindustry">
|
package="io.anuke.mindustry">
|
||||||
|
|
||||||
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
|
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
|
||||||
<uses-permission android:name="com.android.vending.BILLING" />
|
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
@@ -14,9 +13,11 @@
|
|||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:roundIcon="@mipmap/ic_launcher_round"
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
android:isGame="true"
|
android:isGame="true"
|
||||||
|
android:usesCleartextTraffic="true"
|
||||||
android:appCategory="game"
|
android:appCategory="game"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:theme="@style/GdxTheme" android:fullBackupContent="@xml/backup_rules">
|
android:theme="@style/GdxTheme" android:fullBackupContent="@xml/backup_rules">
|
||||||
|
<meta-data android:name="android.max_aspect" android:value="2.1"/>
|
||||||
<activity
|
<activity
|
||||||
android:name="io.anuke.mindustry.AndroidLauncher"
|
android:name="io.anuke.mindustry.AndroidLauncher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
@@ -28,14 +29,6 @@
|
|||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
|
||||||
<category android:name="android.intent.category.BROWSABLE"/>
|
|
||||||
<data android:mimeType="application/octet-stream"/>
|
|
||||||
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.mmap" />
|
|
||||||
</intent-filter>
|
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
@@ -43,27 +36,8 @@
|
|||||||
<data android:mimeType="application/octet-stream" />
|
<data android:mimeType="application/octet-stream" />
|
||||||
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.msav"/>
|
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.msav"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
|
|
||||||
<intent-filter android:icon="@mipmap/ic_launcher"
|
|
||||||
android:label="Mindustry Map"
|
|
||||||
android:priority="1">
|
|
||||||
<action android:name="android.intent.action.VIEW" />
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
|
||||||
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.mmap" android:mimeType="*/*" />
|
|
||||||
</intent-filter>
|
|
||||||
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.VIEW" />
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
|
||||||
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.msav" android:mimeType="*/*" />
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
<activity android:name=".DonationsActivity"
|
|
||||||
android:theme="@style/GdxTheme" />
|
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ buildscript {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
classpath 'com.android.tools.build:gradle:3.2.1'
|
classpath 'com.android.tools.build:gradle:3.4.1'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,37 +26,32 @@ repositories {
|
|||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
implementation project(":core")
|
implementation project(":core")
|
||||||
implementation project(":kryonet")
|
|
||||||
implementation 'com.android.support:support-v4:28.0.0'
|
|
||||||
implementation 'org.sufficientlysecure:donations:2.5'
|
|
||||||
implementation 'com.google.android.gms:play-services-auth:16.0.1'
|
|
||||||
|
|
||||||
implementation "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
|
implementation arcModule("backends:backend-android")
|
||||||
|
implementation 'com.jakewharton.android.repackaged:dalvik-dx:9.0.0_r3'
|
||||||
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
|
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
|
||||||
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
|
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
|
||||||
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a"
|
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a"
|
||||||
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
|
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
|
||||||
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64"
|
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64"
|
||||||
implementation "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
|
|
||||||
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi"
|
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi"
|
||||||
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a"
|
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a"
|
||||||
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-arm64-v8a"
|
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-arm64-v8a"
|
||||||
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86"
|
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86"
|
||||||
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86_64"
|
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86_64"
|
||||||
implementation "com.badlogicgames.gdx:gdx-controllers-android:$gdxVersion"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
task deploy(type: Copy){
|
task deploy(type: Copy){
|
||||||
dependsOn "assembleRelease"
|
dependsOn "assembleRelease"
|
||||||
|
|
||||||
from "build/outputs/apk/google/release/android-google-release.apk"
|
from "build/outputs/apk/release/android-release.apk"
|
||||||
into "../deploy/"
|
into "../deploy/"
|
||||||
rename ("android-google-release.apk", appName + "-android-" + getVersionString() + ".apk")
|
rename("android-release.apk", "${generateDeployName('android')}.apk")
|
||||||
}
|
}
|
||||||
|
|
||||||
android{
|
android{
|
||||||
buildToolsVersion '28.0.3'
|
buildToolsVersion '29.0.2'
|
||||||
compileSdkVersion 28
|
compileSdkVersion 29
|
||||||
sourceSets{
|
sourceSets{
|
||||||
main{
|
main{
|
||||||
manifest.srcFile 'AndroidManifest.xml'
|
manifest.srcFile 'AndroidManifest.xml'
|
||||||
@@ -75,27 +70,21 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
defaultConfig{
|
defaultConfig{
|
||||||
def vfile = file('../core/assets/version.properties')
|
Properties props = loadVersionProps()
|
||||||
|
Integer vcode = props['androidBuildCode']?.toInteger() ?: 1
|
||||||
def code = 0
|
def versionNameResult = "$versionNumber-$versionType-${getBuildVersion().replace(" ", "-")}"
|
||||||
def versionNameResult = "unknown"
|
|
||||||
|
|
||||||
if(vfile.exists()){
|
|
||||||
def props = new Properties()
|
|
||||||
props.load(new FileInputStream(vfile))
|
|
||||||
|
|
||||||
code = (props['androidBuildCode'] == null ? 0 : props['androidBuildCode']).toInteger() + 1
|
|
||||||
|
|
||||||
props['androidBuildCode'] = code.toString()
|
|
||||||
props.store(vfile.newWriter(), "Autogenerated file. Do not modify.")
|
|
||||||
versionNameResult = "$versionNumber-$versionType-${props['build'].replace(" ", "-")}"
|
|
||||||
}
|
|
||||||
|
|
||||||
applicationId "io.anuke.mindustry"
|
applicationId "io.anuke.mindustry"
|
||||||
minSdkVersion 14
|
minSdkVersion 14
|
||||||
targetSdkVersion 28
|
targetSdkVersion 29
|
||||||
versionCode code
|
|
||||||
versionName versionNameResult
|
versionName versionNameResult
|
||||||
|
versionCode vcode
|
||||||
|
|
||||||
|
if(project.hasProperty("release")){
|
||||||
|
props['androidBuildCode'] = (vcode + 1).toString()
|
||||||
|
}
|
||||||
|
props.store(file('../core/assets/version.properties').newWriter(), null)
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOptions{
|
compileOptions{
|
||||||
@@ -105,12 +94,6 @@ android {
|
|||||||
|
|
||||||
flavorDimensions "google"
|
flavorDimensions "google"
|
||||||
|
|
||||||
productFlavors {
|
|
||||||
google {
|
|
||||||
buildConfigField "boolean", "DONATIONS_GOOGLE", "true"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
signingConfigs{
|
signingConfigs{
|
||||||
release{
|
release{
|
||||||
if(project.hasProperty("RELEASE_STORE_FILE")){
|
if(project.hasProperty("RELEASE_STORE_FILE")){
|
||||||
@@ -124,12 +107,14 @@ android {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(project.hasProperty("RELEASE_STORE_FILE")) {
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
signingConfig signingConfigs.release
|
signingConfig signingConfigs.release
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// called every time gradle gets executed, takes the native dependencies of
|
// called every time gradle gets executed, takes the native dependencies of
|
||||||
// the natives configuration, and extracts them to the proper libs/ folders
|
// the natives configuration, and extracts them to the proper libs/ folders
|
||||||
// so they get packed with the APK.
|
// so they get packed with the APK.
|
||||||
@@ -178,26 +163,3 @@ task run(type: Exec) {
|
|||||||
def adb = path + "/platform-tools/adb"
|
def adb = path + "/platform-tools/adb"
|
||||||
commandLine "$adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/io.anuke.mindustry.AndroidLauncher'
|
commandLine "$adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/io.anuke.mindustry.AndroidLauncher'
|
||||||
}
|
}
|
||||||
|
|
||||||
// sets up the Android Idea project, using the old Ant based build.
|
|
||||||
idea {
|
|
||||||
module {
|
|
||||||
sourceDirs += file("src")
|
|
||||||
scopes = [COMPILE: [plus: [project.configurations.compile]]]
|
|
||||||
|
|
||||||
iml {
|
|
||||||
withXml {
|
|
||||||
def node = it.asNode()
|
|
||||||
def builder = NodeBuilder.newInstance()
|
|
||||||
builder.current = node
|
|
||||||
builder.component(name: "FacetManager") {
|
|
||||||
facet(type: "android", name: "Android") {
|
|
||||||
configuration {
|
|
||||||
option(name: "UPDATE_PROPERTY_FILES", value: "true")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 87 KiB |
@@ -20,26 +20,10 @@
|
|||||||
#}
|
#}
|
||||||
|
|
||||||
-verbose
|
-verbose
|
||||||
|
-verbose
|
||||||
-dontwarn android.support.**
|
-ignorewarnings
|
||||||
-dontwarn com.badlogic.gdx.backends.android.AndroidFragmentApplication
|
-keep class io.anuke.mindustry.game.Rules
|
||||||
-dontwarn com.badlogic.gdx.utils.GdxBuild
|
-keep class io.anuke.mindustry.desktop.DesktopLauncher
|
||||||
-dontwarn com.badlogic.gdx.physics.box2d.utils.Box2DBuild
|
-keepclasseswithmembers public class * {
|
||||||
-dontwarn com.badlogic.gdx.jnigen.BuildTarget*
|
public static void main(java.lang.String[]);
|
||||||
-dontwarn com.badlogic.gdx.graphics.g2d.freetype.FreetypeBuild
|
|
||||||
|
|
||||||
-keep class com.badlogic.gdx.controllers.android.AndroidControllers
|
|
||||||
|
|
||||||
-keepclassmembers class com.badlogic.gdx.backends.android.AndroidInput* {
|
|
||||||
<init>(com.badlogic.gdx.Application, android.content.Context, java.lang.Object, com.badlogic.gdx.backends.android.AndroidApplicationConfiguration);
|
|
||||||
}
|
|
||||||
|
|
||||||
-keepclassmembers class com.badlogic.gdx.physics.box2d.World {
|
|
||||||
boolean contactFilter(long, long);
|
|
||||||
void beginContact(long);
|
|
||||||
void endContact(long);
|
|
||||||
void preSolve(long, long);
|
|
||||||
void postSolve(long, long);
|
|
||||||
boolean reportFixture(long);
|
|
||||||
float reportRayFixture(long, float, float, float, float, float);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,5 @@
|
|||||||
#
|
#
|
||||||
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||||
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
||||||
|
|
||||||
# Project target.
|
# Project target.
|
||||||
target=android-19
|
target=android-19
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 911 B After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 28 KiB |
@@ -1,32 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="fill_parent"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:background="#000">
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_gravity="top"
|
|
||||||
android:adjustViewBounds="false"
|
|
||||||
android:contentDescription="background"
|
|
||||||
android:cropToPadding="false"
|
|
||||||
android:scaleType="centerCrop"
|
|
||||||
android:src="@drawable/background" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/donations_activity_container"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 553 B After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 9.5 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 29 KiB |
@@ -1,15 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
|
|
||||||
<string name="app_name">Mindustry</string>
|
|
||||||
<string-array name="donation_google_catalog_values">
|
|
||||||
<item>1 달러</item>
|
|
||||||
<item>2 달러</item>
|
|
||||||
<item>5 달러</item>
|
|
||||||
<item>10 달러</item>
|
|
||||||
<item>15 달러</item>
|
|
||||||
<item>25 달러</item>
|
|
||||||
<item>50 달러</item>
|
|
||||||
</string-array>
|
|
||||||
|
|
||||||
</resources>
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
|
|
||||||
<string name="app_name">Mindustry</string>
|
|
||||||
<string-array name="donation_google_catalog_values">
|
|
||||||
<item>1 Доллар</item>
|
|
||||||
<item>2 Доллара</item>
|
|
||||||
<item>5 Доллара</item>
|
|
||||||
<item>10 Долларов</item>
|
|
||||||
<item>15 Долларов</item>
|
|
||||||
<item>25 Долларов</item>
|
|
||||||
<item>50 Долларов</item>
|
|
||||||
</string-array>
|
|
||||||
|
|
||||||
</resources>
|
|
||||||
@@ -2,14 +2,5 @@
|
|||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<string name="app_name">Mindustry</string>
|
<string name="app_name">Mindustry</string>
|
||||||
<string-array name="donation_google_catalog_values">
|
|
||||||
<item>1 Dollar</item>
|
|
||||||
<item>2 Dollars</item>
|
|
||||||
<item>5 Dollars</item>
|
|
||||||
<item>10 Dollars</item>
|
|
||||||
<item>15 Dollars</item>
|
|
||||||
<item>25 Dollars</item>
|
|
||||||
<item>50 Dollars</item>
|
|
||||||
</string-array>
|
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,59 +1,50 @@
|
|||||||
package io.anuke.mindustry;
|
package io.anuke.mindustry;
|
||||||
|
|
||||||
import android.Manifest;
|
import android.*;
|
||||||
import android.content.Context;
|
import android.app.*;
|
||||||
import android.content.Intent;
|
import android.content.*;
|
||||||
import android.content.pm.ActivityInfo;
|
import android.content.pm.*;
|
||||||
import android.content.pm.PackageManager;
|
import android.net.*;
|
||||||
import android.net.Uri;
|
import android.os.Build.*;
|
||||||
import android.os.Build;
|
import android.os.*;
|
||||||
import android.os.Bundle;
|
import android.provider.Settings.*;
|
||||||
import android.provider.Settings.Secure;
|
import android.telephony.*;
|
||||||
import android.telephony.TelephonyManager;
|
import io.anuke.arc.*;
|
||||||
import android.util.Log;
|
import io.anuke.arc.backends.android.surfaceview.*;
|
||||||
import com.badlogic.gdx.Gdx;
|
import io.anuke.arc.files.*;
|
||||||
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
|
import io.anuke.arc.func.*;
|
||||||
import com.badlogic.gdx.files.FileHandle;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import com.badlogic.gdx.utils.Base64Coder;
|
import io.anuke.arc.util.*;
|
||||||
import com.google.android.gms.common.GoogleApiAvailability;
|
import io.anuke.arc.util.serialization.*;
|
||||||
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
|
import io.anuke.mindustry.game.Saves.*;
|
||||||
import com.google.android.gms.common.GooglePlayServicesRepairableException;
|
import io.anuke.mindustry.io.*;
|
||||||
import com.google.android.gms.security.ProviderInstaller;
|
import io.anuke.mindustry.mod.*;
|
||||||
import io.anuke.kryonet.KryoClient;
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
import io.anuke.kryonet.KryoServer;
|
|
||||||
import io.anuke.mindustry.core.Platform;
|
|
||||||
import io.anuke.mindustry.game.Saves.SaveSlot;
|
|
||||||
import io.anuke.mindustry.io.SaveIO;
|
|
||||||
import io.anuke.mindustry.net.Net;
|
|
||||||
import io.anuke.mindustry.ui.dialogs.FileChooser;
|
|
||||||
import io.anuke.ucore.function.Consumer;
|
|
||||||
import io.anuke.ucore.scene.ui.layout.Unit;
|
|
||||||
import io.anuke.ucore.util.Bundles;
|
|
||||||
import io.anuke.ucore.util.Strings;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.*;
|
||||||
import java.io.FileInputStream;
|
import java.lang.System;
|
||||||
import java.io.IOException;
|
import java.util.*;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
public class AndroidLauncher extends PatchedAndroidApplication{
|
public class AndroidLauncher extends AndroidApplication{
|
||||||
public static final int PERMISSION_REQUEST_CODE = 1;
|
public static final int PERMISSION_REQUEST_CODE = 1;
|
||||||
boolean doubleScaleTablets = true;
|
boolean doubleScaleTablets = true;
|
||||||
FileChooser chooser;
|
FileChooser chooser;
|
||||||
|
Runnable permCallback;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState){
|
protected void onCreate(Bundle savedInstanceState){
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
|
if(doubleScaleTablets && isTablet(this.getContext())){
|
||||||
config.useImmersiveMode = true;
|
Scl.setAddition(0.5f);
|
||||||
Platform.instance = new Platform(){
|
}
|
||||||
|
|
||||||
|
initialize(new ClientLauncher(){
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void openDonations(){
|
public void hide(){
|
||||||
showDonations();
|
moveTaskToBack(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -74,18 +65,58 @@ public class AndroidLauncher extends PatchedAndroidApplication{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public org.mozilla.javascript.Context getScriptContext(){
|
||||||
|
return AndroidRhinoContext.enter(getContext().getCacheDir());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void shareFile(FileHandle file){
|
public void shareFile(FileHandle file){
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, String filetype){
|
public void showFileChooser(boolean open, String extension, Cons<FileHandle> cons){
|
||||||
chooser = new FileChooser(text, file -> file.extension().equalsIgnoreCase(filetype), open, cons);
|
if(VERSION.SDK_INT >= VERSION_CODES.Q){
|
||||||
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
|
Intent intent = new Intent(open ? Intent.ACTION_OPEN_DOCUMENT : Intent.ACTION_CREATE_DOCUMENT);
|
||||||
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||||
|
intent.setType(extension.equals("zip") ? "application/zip" : "*/*");
|
||||||
|
addResultListener(i -> startActivityForResult(intent, i), (code, in) -> {
|
||||||
|
if(code == Activity.RESULT_OK && in != null && in.getData() != null){
|
||||||
|
Uri uri = in.getData();
|
||||||
|
|
||||||
|
if(uri.getPath().contains("(invalid)")) return;
|
||||||
|
|
||||||
|
Core.app.post(() -> Core.app.post(() -> cons.get(new FileHandle(uri.getPath()){
|
||||||
|
@Override
|
||||||
|
public InputStream read(){
|
||||||
|
try{
|
||||||
|
return getContentResolver().openInputStream(uri);
|
||||||
|
}catch(IOException e){
|
||||||
|
throw new ArcRuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OutputStream write(boolean append){
|
||||||
|
try{
|
||||||
|
return getContentResolver().openOutputStream(uri);
|
||||||
|
}catch(IOException e){
|
||||||
|
throw new ArcRuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}else if(VERSION.SDK_INT >= VERSION_CODES.M && !(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
|
||||||
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
|
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
|
||||||
chooser.show();
|
chooser = new FileChooser(open ? "$open" : "$save", file -> file.extension().equalsIgnoreCase(extension), open, file -> {
|
||||||
chooser = null;
|
if(!open){
|
||||||
|
cons.get(file.parent().child(file.nameWithoutExtension() + "." + extension));
|
||||||
}else{
|
}else{
|
||||||
|
cons.get(file);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
ArrayList<String> perms = new ArrayList<>();
|
ArrayList<String> perms = new ArrayList<>();
|
||||||
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
||||||
perms.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
perms.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
||||||
@@ -93,52 +124,43 @@ public class AndroidLauncher extends PatchedAndroidApplication{
|
|||||||
if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
||||||
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
|
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
|
||||||
}
|
}
|
||||||
requestPermissions(perms.toArray(new String[perms.size()]), PERMISSION_REQUEST_CODE);
|
requestPermissions(perms.toArray(new String[0]), PERMISSION_REQUEST_CODE);
|
||||||
|
}else{
|
||||||
|
super.showFileChooser(open, extension, cons);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void beginForceLandscape(){
|
public void beginForceLandscape(){
|
||||||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
|
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void endForceLandscape(){
|
public void endForceLandscape(){
|
||||||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
|
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
}, new AndroidApplicationConfiguration(){{
|
||||||
public boolean canDonate(){
|
useImmersiveMode = true;
|
||||||
return true;
|
depth = 0;
|
||||||
}
|
hideStatusBar = true;
|
||||||
};
|
errorHandler = ModCrashHandler::handle;
|
||||||
|
}});
|
||||||
try{
|
|
||||||
ProviderInstaller.installIfNeeded(this);
|
|
||||||
}catch(GooglePlayServicesRepairableException e){
|
|
||||||
GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
|
|
||||||
apiAvailability.getErrorDialog(this, e.getConnectionStatusCode(), 0).show();
|
|
||||||
}catch(GooglePlayServicesNotAvailableException e){
|
|
||||||
Log.e("SecurityException", "Google Play Services not available.");
|
|
||||||
}
|
|
||||||
if(doubleScaleTablets && isTablet(this.getContext())){
|
|
||||||
Unit.dp.addition = 0.5f;
|
|
||||||
}
|
|
||||||
config.hideStatusBar = true;
|
|
||||||
Net.setClientProvider(new KryoClient());
|
|
||||||
Net.setServerProvider(new KryoServer());
|
|
||||||
initialize(new Mindustry(), config);
|
|
||||||
checkFiles(getIntent());
|
checkFiles(getIntent());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults){
|
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
|
||||||
if(requestCode == PERMISSION_REQUEST_CODE){
|
if(requestCode == PERMISSION_REQUEST_CODE){
|
||||||
for(int i : grantResults){
|
for(int i : grantResults){
|
||||||
if(i != PackageManager.PERMISSION_GRANTED) return;
|
if(i != PackageManager.PERMISSION_GRANTED) return;
|
||||||
}
|
}
|
||||||
if(chooser != null){
|
if(chooser != null){
|
||||||
chooser.show();
|
Core.app.post(chooser::show);
|
||||||
|
}
|
||||||
|
if(permCallback != null){
|
||||||
|
Core.app.post(permCallback);
|
||||||
|
permCallback = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -161,53 +183,41 @@ public class AndroidLauncher extends PatchedAndroidApplication{
|
|||||||
InputStream inStream;
|
InputStream inStream;
|
||||||
if(myFile != null) inStream = new FileInputStream(myFile);
|
if(myFile != null) inStream = new FileInputStream(myFile);
|
||||||
else inStream = getContentResolver().openInputStream(uri);
|
else inStream = getContentResolver().openInputStream(uri);
|
||||||
Gdx.app.postRunnable(() -> {
|
Core.app.post(() -> Core.app.post(() -> {
|
||||||
if(save){ //open save
|
if(save){ //open save
|
||||||
System.out.println("Opening save.");
|
System.out.println("Opening save.");
|
||||||
FileHandle file = Gdx.files.local("temp-save." + saveExtension);
|
FileHandle file = Core.files.local("temp-save." + saveExtension);
|
||||||
file.write(inStream, false);
|
file.write(inStream, false);
|
||||||
if(SaveIO.isSaveValid(file)){
|
if(SaveIO.isSaveValid(file)){
|
||||||
try{
|
try{
|
||||||
SaveSlot slot = control.saves.importSave(file);
|
SaveSlot slot = control.saves.importSave(file);
|
||||||
ui.load.runLoadSave(slot);
|
ui.load.runLoadSave(slot);
|
||||||
}catch(IOException e){
|
}catch(IOException e){
|
||||||
ui.showError(Bundles.format("text.save.import.fail", Strings.parseException(e, false)));
|
ui.showException("$save.import.fail", e);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
ui.showError("$text.save.import.invalid");
|
ui.showErrorMessage("$save.import.invalid");
|
||||||
}
|
}
|
||||||
}else if(map){ //open map
|
}else if(map){ //open map
|
||||||
Gdx.app.postRunnable(() -> {
|
FileHandle file = Core.files.local("temp-map." + mapExtension);
|
||||||
|
file.write(inStream, false);
|
||||||
|
Core.app.post(() -> {
|
||||||
System.out.println("Opening map.");
|
System.out.println("Opening map.");
|
||||||
if(!ui.editor.isShown()){
|
if(!ui.editor.isShown()){
|
||||||
ui.editor.show();
|
ui.editor.show();
|
||||||
}
|
}
|
||||||
ui.editor.beginEditMap(inStream);
|
ui.editor.beginEditMap(file);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
}));
|
||||||
}
|
}
|
||||||
}catch(IOException e){
|
}catch(IOException e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isPackageInstalled(String packagename){
|
|
||||||
try{
|
|
||||||
getPackageManager().getPackageInfo(packagename, 0);
|
|
||||||
return true;
|
|
||||||
}catch(Exception e){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isTablet(Context context){
|
private boolean isTablet(Context context){
|
||||||
TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
|
TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
|
||||||
return manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE;
|
return manager != null && manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE;
|
||||||
}
|
|
||||||
|
|
||||||
private void showDonations(){
|
|
||||||
Intent intent = new Intent(this, DonationsActivity.class);
|
|
||||||
startActivity(intent);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
225
android/src/io/anuke/mindustry/AndroidRhinoContext.java
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
package io.anuke.mindustry;
|
||||||
|
|
||||||
|
import android.annotation.*;
|
||||||
|
import android.os.*;
|
||||||
|
import com.android.dex.*;
|
||||||
|
import com.android.dx.cf.direct.*;
|
||||||
|
import com.android.dx.command.dexer.*;
|
||||||
|
import com.android.dx.dex.*;
|
||||||
|
import com.android.dx.dex.cf.*;
|
||||||
|
import com.android.dx.dex.file.DexFile;
|
||||||
|
import com.android.dx.merge.*;
|
||||||
|
import dalvik.system.*;
|
||||||
|
import io.anuke.arc.*;
|
||||||
|
import io.anuke.arc.backends.android.surfaceview.*;
|
||||||
|
import org.mozilla.javascript.*;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.nio.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helps to prepare a Rhino Context for usage on android.
|
||||||
|
* @author F43nd1r
|
||||||
|
* @since 11.01.2016
|
||||||
|
*/
|
||||||
|
public class AndroidRhinoContext{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* call this instead of {@link Context#enter()}
|
||||||
|
* @return a context prepared for android
|
||||||
|
*/
|
||||||
|
public static Context enter(File cacheDirectory){
|
||||||
|
if(!SecurityController.hasGlobal())
|
||||||
|
SecurityController.initGlobal(new SecurityController(){
|
||||||
|
@Override
|
||||||
|
public GeneratedClassLoader createClassLoader(ClassLoader classLoader, Object o){
|
||||||
|
return Context.getCurrentContext().createClassLoader(classLoader);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getDynamicSecurityDomain(Object o){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
AndroidContextFactory factory;
|
||||||
|
if(!ContextFactory.hasExplicitGlobal()){
|
||||||
|
factory = new AndroidContextFactory(cacheDirectory);
|
||||||
|
ContextFactory.getGlobalSetter().setContextFactoryGlobal(factory);
|
||||||
|
}else if(!(ContextFactory.getGlobal() instanceof AndroidContextFactory)){
|
||||||
|
throw new IllegalStateException("Cannot initialize factory for Android Rhino: There is already another factory");
|
||||||
|
}else{
|
||||||
|
factory = (AndroidContextFactory)ContextFactory.getGlobal();
|
||||||
|
}
|
||||||
|
|
||||||
|
return factory.enterContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensures that the classLoader used is correct
|
||||||
|
* @author F43nd1r
|
||||||
|
* @since 11.01.2016
|
||||||
|
*/
|
||||||
|
public static class AndroidContextFactory extends ContextFactory{
|
||||||
|
private final File cacheDirectory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new factory. It will cache generated code in the given directory
|
||||||
|
* @param cacheDirectory the cache directory
|
||||||
|
*/
|
||||||
|
public AndroidContextFactory(File cacheDirectory){
|
||||||
|
this.cacheDirectory = cacheDirectory;
|
||||||
|
initApplicationClassLoader(createClassLoader(AndroidContextFactory.class.getClassLoader()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a ClassLoader which is able to deal with bytecode
|
||||||
|
* @param parent the parent of the create classloader
|
||||||
|
* @return a new ClassLoader
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public BaseAndroidClassLoader createClassLoader(ClassLoader parent){
|
||||||
|
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
|
||||||
|
return new InMemoryAndroidClassLoader(parent);
|
||||||
|
}
|
||||||
|
return new FileAndroidClassLoader(parent, cacheDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onContextReleased(final Context cx){
|
||||||
|
super.onContextReleased(cx);
|
||||||
|
((BaseAndroidClassLoader)cx.getApplicationClassLoader()).reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compiles java bytecode to dex bytecode and loads it
|
||||||
|
* @author F43nd1r
|
||||||
|
* @since 11.01.2016
|
||||||
|
*/
|
||||||
|
abstract static class BaseAndroidClassLoader extends ClassLoader implements GeneratedClassLoader{
|
||||||
|
|
||||||
|
public BaseAndroidClassLoader(ClassLoader parent){
|
||||||
|
super(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<?> defineClass(String name, byte[] data){
|
||||||
|
try{
|
||||||
|
DexOptions dexOptions = new DexOptions();
|
||||||
|
DexFile dexFile = new DexFile(dexOptions);
|
||||||
|
DirectClassFile classFile = new DirectClassFile(data, name.replace('.', '/') + ".class", true);
|
||||||
|
classFile.setAttributeFactory(StdAttributeFactory.THE_ONE);
|
||||||
|
classFile.getMagic();
|
||||||
|
DxContext context = new DxContext();
|
||||||
|
dexFile.add(CfTranslator.translate(context, classFile, null, new CfOptions(), dexOptions, dexFile));
|
||||||
|
Dex dex = new Dex(dexFile.toDex(null, false));
|
||||||
|
Dex oldDex = getLastDex();
|
||||||
|
if(oldDex != null){
|
||||||
|
dex = new DexMerger(new Dex[]{dex, oldDex}, CollisionPolicy.KEEP_FIRST, context).merge();
|
||||||
|
}
|
||||||
|
return loadClass(dex, name);
|
||||||
|
}catch(IOException | ClassNotFoundException e){
|
||||||
|
throw new FatalLoadingException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract Class<?> loadClass(Dex dex, String name) throws ClassNotFoundException;
|
||||||
|
|
||||||
|
protected abstract Dex getLastDex();
|
||||||
|
|
||||||
|
protected abstract void reset();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void linkClass(Class<?> aClass){}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<?> loadClass(String name, boolean resolve)
|
||||||
|
throws ClassNotFoundException{
|
||||||
|
Class<?> loadedClass = findLoadedClass(name);
|
||||||
|
if(loadedClass == null){
|
||||||
|
Dex dex = getLastDex();
|
||||||
|
if(dex != null){
|
||||||
|
loadedClass = loadClass(dex, name);
|
||||||
|
}
|
||||||
|
if(loadedClass == null){
|
||||||
|
loadedClass = getParent().loadClass(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return loadedClass;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Might be thrown in any Rhino method that loads bytecode if the loading failed. */
|
||||||
|
public static class FatalLoadingException extends RuntimeException{
|
||||||
|
FatalLoadingException(Throwable t){
|
||||||
|
super("Failed to define class", t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class FileAndroidClassLoader extends BaseAndroidClassLoader{
|
||||||
|
private static int instanceCounter = 0;
|
||||||
|
private final File dexFile;
|
||||||
|
|
||||||
|
public FileAndroidClassLoader(ClassLoader parent, File cacheDir){
|
||||||
|
super(parent);
|
||||||
|
int id = instanceCounter++;
|
||||||
|
dexFile = new File(cacheDir, id + ".dex");
|
||||||
|
cacheDir.mkdirs();
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<?> loadClass(Dex dex, String name) throws ClassNotFoundException{
|
||||||
|
try{
|
||||||
|
dex.writeTo(dexFile);
|
||||||
|
}catch(IOException e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return new DexClassLoader(dexFile.getPath(), ((AndroidApplication)Core.app).getContext().getCacheDir().getAbsolutePath(), null, getParent()).loadClass(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Dex getLastDex(){
|
||||||
|
if(dexFile.exists()){
|
||||||
|
try{
|
||||||
|
return new Dex(dexFile);
|
||||||
|
}catch(IOException e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void reset(){
|
||||||
|
dexFile.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.O)
|
||||||
|
static class InMemoryAndroidClassLoader extends BaseAndroidClassLoader{
|
||||||
|
private Dex last;
|
||||||
|
|
||||||
|
public InMemoryAndroidClassLoader(ClassLoader parent){
|
||||||
|
super(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<?> loadClass(Dex dex, String name) throws ClassNotFoundException{
|
||||||
|
last = dex;
|
||||||
|
return new InMemoryDexClassLoader(ByteBuffer.wrap(dex.getBytes()), getParent()).loadClass(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Dex getLastDex(){
|
||||||
|
return last;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void reset(){
|
||||||
|
last = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
package io.anuke.mindustry;
|
|
||||||
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.v4.app.Fragment;
|
|
||||||
import android.support.v4.app.FragmentActivity;
|
|
||||||
import android.support.v4.app.FragmentManager;
|
|
||||||
import android.support.v4.app.FragmentTransaction;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.Button;
|
|
||||||
import org.sufficientlysecure.donations.DonationsFragment;
|
|
||||||
|
|
||||||
public class DonationsActivity extends FragmentActivity{
|
|
||||||
/**
|
|
||||||
* Google
|
|
||||||
*/
|
|
||||||
private static final String GOOGLE_PUBKEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzG93KhpfBPKTo2jF0yxbWkkmMKwsPNM4SsMj1aDq7vv6n3R+mqJVfprOJxFfJh7JchXTflLIgiaKXFAiU70gJbMTniEWnEaFSxAeF09a7U0RjOwN+7rFwjCG91c2CpYxPanBTQP4zasc1ODPVzq4q6/4ByjhenN71V4WmR08NFIAodcfFPrOkDPil7i8y7cgcd1Ky53U0TS+LLYJttAK3XdTK4s7VE3I5IKoeNa4uwCmIM59R67q2k3cXjLk/nP6MP+y++EzHN/PTiR1sVg4dMP8K31RPw/1QNLPQwJz6Wc872oWwb7xo5gkoXbDc5WPPydsi8F3SyKNaYwzN6CDFQIDAQAB";
|
|
||||||
private static final String[] GOOGLE_CATALOG = new String[]{
|
|
||||||
"mindustry.donation.1", "mindustry.donation.2", "mindustry.donation.5",
|
|
||||||
"mindustry.donation.10", "mindustry.donation.15",
|
|
||||||
"mindustry.donation.25", "mindustry.donation.50"};
|
|
||||||
DonationsFragment donationsFragment;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the activity is first created.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState){
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
|
|
||||||
setTheme(R.style.GdxTheme);
|
|
||||||
|
|
||||||
setContentView(R.layout.donations_activity);
|
|
||||||
|
|
||||||
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
|
|
||||||
if(BuildConfig.DONATIONS_GOOGLE){
|
|
||||||
donationsFragment = DonationsFragment.newInstance(BuildConfig.DEBUG, true, GOOGLE_PUBKEY, GOOGLE_CATALOG,
|
|
||||||
getResources().getStringArray(R.array.donation_google_catalog_values), false, null, null,
|
|
||||||
null, false, null, null, false, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ft.replace(R.id.donations_activity_container, donationsFragment, "donationsFragment");
|
|
||||||
ft.commit();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onStart(){
|
|
||||||
super.onStart();
|
|
||||||
Button b = findViewById(org.sufficientlysecure.donations.R.id.donations__google_android_market_donate_button);
|
|
||||||
b.setOnClickListener(view -> {
|
|
||||||
donationsFragment.donateGoogleOnClick(donationsFragment.getView());
|
|
||||||
b.setEnabled(false);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Needed for Google Play In-app Billing. It uses startIntentSenderForResult(). The result is not propagated to
|
|
||||||
* the Fragment like in startActivityForResult(). Thus we need to propagate manually to our Fragment.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected void onActivityResult(int requestCode, int resultCode, Intent data){
|
|
||||||
super.onActivityResult(requestCode, resultCode, data);
|
|
||||||
Button b = findViewById(org.sufficientlysecure.donations.R.id.donations__google_android_market_donate_button);
|
|
||||||
b.setEnabled(true);
|
|
||||||
|
|
||||||
FragmentManager fragmentManager = getSupportFragmentManager();
|
|
||||||
Fragment fragment = fragmentManager.findFragmentByTag("donationsFragment");
|
|
||||||
if(fragment != null){
|
|
||||||
fragment.onActivityResult(requestCode, resultCode, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
package io.anuke.mindustry;
|
|
||||||
|
|
||||||
import com.badlogic.gdx.backends.android.AndroidApplication;
|
|
||||||
import java.util.concurrent.ExecutorService;
|
|
||||||
import java.util.concurrent.Executors;
|
|
||||||
|
|
||||||
public class PatchedAndroidApplication extends AndroidApplication {
|
|
||||||
private final ExecutorService exec = Executors.newSingleThreadExecutor();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPause () {
|
|
||||||
if(useImmersiveMode) {
|
|
||||||
exec.submit(() -> {
|
|
||||||
try {Thread.sleep(100);} catch (InterruptedException ignored) {}
|
|
||||||
graphics.onDrawFrame(null);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
super.onPause();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,12 +1,27 @@
|
|||||||
package io.anuke.annotations;
|
package io.anuke.annotations;
|
||||||
|
|
||||||
import java.lang.annotation.ElementType;
|
import java.lang.annotation.*;
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
|
|
||||||
public class Annotations{
|
public class Annotations{
|
||||||
|
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface StyleDefaults {
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Indicates that a method should always call its super version. */
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface CallSuper{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Annotation that allows overriding CallSuper annotation. To be used on method that overrides method with CallSuper annotation from parent class.*/
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface OverrideCallSuper {
|
||||||
|
}
|
||||||
|
|
||||||
/** Marks a class as serializable. */
|
/** Marks a class as serializable. */
|
||||||
@Target(ElementType.TYPE)
|
@Target(ElementType.TYPE)
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
@@ -14,6 +29,21 @@ public class Annotations{
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Marks a class as a special value type struct. Class name must end in 'Struct'. */
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface Struct{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Marks a field of a struct. Optional. */
|
||||||
|
@Target(ElementType.FIELD)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface StructField{
|
||||||
|
/** Size of a struct field in bits. Not valid on booleans or floating point numbers. */
|
||||||
|
int value();
|
||||||
|
}
|
||||||
|
|
||||||
public enum PacketPriority{
|
public enum PacketPriority{
|
||||||
/** Gets put in a queue and processed if not connected. */
|
/** Gets put in a queue and processed if not connected. */
|
||||||
normal,
|
normal,
|
||||||
|
|||||||
@@ -0,0 +1,173 @@
|
|||||||
|
package io.anuke.annotations;
|
||||||
|
|
||||||
|
import com.squareup.javapoet.*;
|
||||||
|
import io.anuke.annotations.Annotations.*;
|
||||||
|
|
||||||
|
import javax.annotation.processing.*;
|
||||||
|
import javax.lang.model.*;
|
||||||
|
import javax.lang.model.element.*;
|
||||||
|
import javax.tools.Diagnostic.*;
|
||||||
|
import javax.tools.*;
|
||||||
|
import java.nio.file.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
||||||
|
@SupportedAnnotationTypes("io.anuke.annotations.Annotations.StyleDefaults")
|
||||||
|
public class AssetsAnnotationProcessor extends AbstractProcessor{
|
||||||
|
/** Name of the base package to put all the generated classes. */
|
||||||
|
private static final String packageName = "io.anuke.mindustry.gen";
|
||||||
|
private String path;
|
||||||
|
private int round;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void init(ProcessingEnvironment processingEnv){
|
||||||
|
super.init(processingEnv);
|
||||||
|
//put all relevant utils into utils class
|
||||||
|
Utils.typeUtils = processingEnv.getTypeUtils();
|
||||||
|
Utils.elementUtils = processingEnv.getElementUtils();
|
||||||
|
Utils.filer = processingEnv.getFiler();
|
||||||
|
Utils.messager = processingEnv.getMessager();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){
|
||||||
|
if(round++ != 0) return false; //only process 1 round
|
||||||
|
|
||||||
|
try{
|
||||||
|
path = Paths.get(Utils.filer.createResource(StandardLocation.CLASS_OUTPUT, "no", "no")
|
||||||
|
.toUri().toURL().toString().substring(System.getProperty("os.name").contains("Windows") ? 6 : "file:".length()))
|
||||||
|
.getParent().getParent().getParent().getParent().getParent().getParent().toString();
|
||||||
|
path = path.replace("%20", " ");
|
||||||
|
|
||||||
|
processSounds("Sounds", path + "/assets/sounds", "io.anuke.arc.audio.Sound");
|
||||||
|
processSounds("Musics", path + "/assets/music", "io.anuke.arc.audio.Music");
|
||||||
|
processUI(roundEnv.getElementsAnnotatedWith(StyleDefaults.class));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}catch(Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void processUI(Set<? extends Element> elements) throws Exception{
|
||||||
|
String[] iconSizes = {"small", "smaller", "tiny"};
|
||||||
|
|
||||||
|
TypeSpec.Builder type = TypeSpec.classBuilder("Tex").addModifiers(Modifier.PUBLIC);
|
||||||
|
TypeSpec.Builder ictype = TypeSpec.classBuilder("Icon").addModifiers(Modifier.PUBLIC);
|
||||||
|
MethodSpec.Builder load = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
MethodSpec.Builder loadStyles = MethodSpec.methodBuilder("loadStyles").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
MethodSpec.Builder icload = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
String resources = path + "/assets-raw/sprites/ui";
|
||||||
|
Files.walk(Paths.get(resources)).forEach(p -> {
|
||||||
|
if(Files.isDirectory(p) || p.getFileName().toString().equals(".DS_Store")) return;
|
||||||
|
|
||||||
|
String filename = p.getFileName().toString();
|
||||||
|
filename = filename.substring(0, filename.indexOf("."));
|
||||||
|
|
||||||
|
ArrayList<String> names = new ArrayList<>();
|
||||||
|
names.add("");
|
||||||
|
if(filename.contains("icon")){
|
||||||
|
names.addAll(Arrays.asList(iconSizes));
|
||||||
|
}
|
||||||
|
|
||||||
|
for(String suffix : names){
|
||||||
|
suffix = suffix.isEmpty() ? "" : "-" + suffix;
|
||||||
|
|
||||||
|
String sfilen = filename + suffix;
|
||||||
|
String dtype = p.getFileName().toString().endsWith(".9.png") ? "io.anuke.arc.scene.style.NinePatchDrawable" : "io.anuke.arc.scene.style.TextureRegionDrawable";
|
||||||
|
|
||||||
|
String varname = capitalize(sfilen);
|
||||||
|
TypeSpec.Builder ttype = type;
|
||||||
|
MethodSpec.Builder tload = load;
|
||||||
|
if(varname.startsWith("icon")){
|
||||||
|
varname = varname.substring("icon".length());
|
||||||
|
varname = Character.toLowerCase(varname.charAt(0)) + varname.substring(1);
|
||||||
|
ttype = ictype;
|
||||||
|
tload = icload;
|
||||||
|
if(SourceVersion.isKeyword(varname)) varname += "i";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(SourceVersion.isKeyword(varname)) varname += "s";
|
||||||
|
|
||||||
|
ttype.addField(ClassName.bestGuess(dtype), varname, Modifier.STATIC, Modifier.PUBLIC);
|
||||||
|
tload.addStatement(varname + " = ("+dtype+")io.anuke.arc.Core.atlas.drawable($S)", sfilen);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for(Element elem : elements){
|
||||||
|
TypeElement t = (TypeElement)elem;
|
||||||
|
t.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.FIELD).forEach(field -> {
|
||||||
|
String fname = field.getSimpleName().toString();
|
||||||
|
if(fname.startsWith("default")){
|
||||||
|
loadStyles.addStatement("io.anuke.arc.Core.scene.addStyle(" + field.asType().toString() + ".class, io.anuke.mindustry.ui.Styles." + fname + ")");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
ictype.addMethod(icload.build());
|
||||||
|
JavaFile.builder(packageName, ictype.build()).build().writeTo(Utils.filer);
|
||||||
|
|
||||||
|
type.addMethod(load.build());
|
||||||
|
type.addMethod(loadStyles.build());
|
||||||
|
JavaFile.builder(packageName, type.build()).build().writeTo(Utils.filer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void processSounds(String classname, String path, String rtype) throws Exception{
|
||||||
|
TypeSpec.Builder type = TypeSpec.classBuilder(classname).addModifiers(Modifier.PUBLIC);
|
||||||
|
MethodSpec.Builder dispose = MethodSpec.methodBuilder("dispose").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
MethodSpec.Builder loadBegin = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
|
||||||
|
HashSet<String> names = new HashSet<>();
|
||||||
|
Files.list(Paths.get(path)).forEach(p -> {
|
||||||
|
String fname = p.getFileName().toString();
|
||||||
|
String name = p.getFileName().toString();
|
||||||
|
name = name.substring(0, name.indexOf("."));
|
||||||
|
|
||||||
|
if(names.contains(name)){
|
||||||
|
Utils.messager.printMessage(Kind.ERROR, "Duplicate file name: " + p.toString() + "!");
|
||||||
|
}else{
|
||||||
|
names.add(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(SourceVersion.isKeyword(name)){
|
||||||
|
name = name + "s";
|
||||||
|
}
|
||||||
|
|
||||||
|
String filepath = path.substring(path.lastIndexOf("/") + 1) + "/" + fname;
|
||||||
|
|
||||||
|
String filename = "io.anuke.arc.Core.app.getType() != io.anuke.arc.Application.ApplicationType.iOS ? \"" + filepath + "\" : \"" + filepath.replace(".ogg", ".mp3")+"\"";
|
||||||
|
|
||||||
|
loadBegin.addStatement("io.anuke.arc.Core.assets.load("+filename +", "+rtype+".class).loaded = a -> " + name + " = ("+rtype+")a", filepath, filepath.replace(".ogg", ".mp3"));
|
||||||
|
|
||||||
|
dispose.addStatement("io.anuke.arc.Core.assets.unload(" + filename + ")");
|
||||||
|
dispose.addStatement(name + " = null");
|
||||||
|
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new io.anuke.arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build());
|
||||||
|
});
|
||||||
|
|
||||||
|
if(classname.equals("Sounds")){
|
||||||
|
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new io.anuke.arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build());
|
||||||
|
}
|
||||||
|
|
||||||
|
type.addMethod(loadBegin.build());
|
||||||
|
type.addMethod(dispose.build());
|
||||||
|
JavaFile.builder(packageName, type.build()).build().writeTo(Utils.filer);
|
||||||
|
}
|
||||||
|
|
||||||
|
static String capitalize(String s){
|
||||||
|
StringBuilder result = new StringBuilder(s.length());
|
||||||
|
|
||||||
|
for(int i = 0; i < s.length(); i++){
|
||||||
|
char c = s.charAt(i);
|
||||||
|
if(c != '_' && c != '-'){
|
||||||
|
if(i > 0 && (s.charAt(i - 1) == '_' || s.charAt(i - 1) == '-')){
|
||||||
|
result.append(Character.toUpperCase(c));
|
||||||
|
}else{
|
||||||
|
result.append(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
package io.anuke.annotations;
|
||||||
|
|
||||||
|
import com.sun.source.util.*;
|
||||||
|
import com.sun.tools.javac.tree.*;
|
||||||
|
import com.sun.tools.javac.tree.JCTree.*;
|
||||||
|
import io.anuke.annotations.Annotations.*;
|
||||||
|
|
||||||
|
import javax.annotation.processing.*;
|
||||||
|
import javax.lang.model.*;
|
||||||
|
import javax.lang.model.element.*;
|
||||||
|
import javax.tools.Diagnostic.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@SupportedAnnotationTypes({"java.lang.Override"})
|
||||||
|
public class CallSuperAnnotationProcessor extends AbstractProcessor{
|
||||||
|
private Trees trees;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(ProcessingEnvironment pe){
|
||||||
|
super.init(pe);
|
||||||
|
trees = Trees.instance(pe);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){
|
||||||
|
for(Element e : roundEnv.getElementsAnnotatedWith(Override.class)){
|
||||||
|
if(e.getAnnotation(OverrideCallSuper.class) != null) return false;
|
||||||
|
|
||||||
|
CodeAnalyzerTreeScanner codeScanner = new CodeAnalyzerTreeScanner();
|
||||||
|
codeScanner.setMethodName(e.getSimpleName().toString());
|
||||||
|
|
||||||
|
TreePath tp = trees.getPath(e.getEnclosingElement());
|
||||||
|
codeScanner.scan(tp, trees);
|
||||||
|
|
||||||
|
if(codeScanner.isCallSuperUsed()){
|
||||||
|
List list = codeScanner.getMethod().getBody().getStatements();
|
||||||
|
|
||||||
|
if(!doesCallSuper(list, codeScanner.getMethodName())){
|
||||||
|
processingEnv.getMessager().printMessage(Kind.ERROR, "Overriding method '" + codeScanner.getMethodName() + "' must explicitly call super method from its parent class.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean doesCallSuper(List list, String methodName){
|
||||||
|
for(Object object : list){
|
||||||
|
if(object instanceof JCTree.JCExpressionStatement){
|
||||||
|
JCTree.JCExpressionStatement expr = (JCExpressionStatement)object;
|
||||||
|
String exprString = expr.toString();
|
||||||
|
if(exprString.startsWith("super." + methodName) && exprString.endsWith(");")) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SourceVersion getSupportedSourceVersion(){
|
||||||
|
return SourceVersion.RELEASE_8;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,5 @@
|
|||||||
package io.anuke.annotations;
|
package io.anuke.annotations;
|
||||||
|
|
||||||
import io.anuke.annotations.MethodEntry;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
/** Represents a class witha list method entries to include in it. */
|
/** Represents a class witha list method entries to include in it. */
|
||||||
|
|||||||
@@ -0,0 +1,110 @@
|
|||||||
|
package io.anuke.annotations;
|
||||||
|
|
||||||
|
import com.sun.source.tree.*;
|
||||||
|
import com.sun.source.util.TreePathScanner;
|
||||||
|
import com.sun.source.util.Trees;
|
||||||
|
import com.sun.tools.javac.code.Scope;
|
||||||
|
import com.sun.tools.javac.code.Symbol;
|
||||||
|
import com.sun.tools.javac.code.Symbol.MethodSymbol;
|
||||||
|
import com.sun.tools.javac.code.Type.ClassType;
|
||||||
|
import com.sun.tools.javac.tree.JCTree.JCIdent;
|
||||||
|
import com.sun.tools.javac.tree.JCTree.JCTypeApply;
|
||||||
|
import io.anuke.annotations.Annotations.CallSuper;
|
||||||
|
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
|
|
||||||
|
class CodeAnalyzerTreeScanner extends TreePathScanner<Object, Trees> {
|
||||||
|
private String methodName;
|
||||||
|
private MethodTree method;
|
||||||
|
private boolean callSuperUsed;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object visitClass (ClassTree classTree, Trees trees) {
|
||||||
|
Tree extendTree = classTree.getExtendsClause();
|
||||||
|
|
||||||
|
if (extendTree instanceof JCTypeApply) { //generic classes case
|
||||||
|
JCTypeApply generic = (JCTypeApply) extendTree;
|
||||||
|
extendTree = generic.clazz;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extendTree instanceof JCIdent) {
|
||||||
|
JCIdent tree = (JCIdent) extendTree;
|
||||||
|
Scope members = tree.sym.members();
|
||||||
|
|
||||||
|
if (checkScope(members))
|
||||||
|
return super.visitClass(classTree, trees);
|
||||||
|
|
||||||
|
if (checkSuperTypes((ClassType) tree.type))
|
||||||
|
return super.visitClass(classTree, trees);
|
||||||
|
|
||||||
|
}
|
||||||
|
callSuperUsed = false;
|
||||||
|
|
||||||
|
return super.visitClass(classTree, trees);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean checkSuperTypes (ClassType type) {
|
||||||
|
if (type.supertype_field != null && type.supertype_field.tsym != null) {
|
||||||
|
if (checkScope(type.supertype_field.tsym.members()))
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return checkSuperTypes((ClassType) type.supertype_field);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public boolean checkScope (Scope members) {
|
||||||
|
Iterable<Symbol> it;
|
||||||
|
try{
|
||||||
|
it = (Iterable<Symbol>)members.getClass().getMethod("getElements").invoke(members);
|
||||||
|
}catch(Throwable t){
|
||||||
|
try{
|
||||||
|
it = (Iterable<Symbol>)members.getClass().getMethod("getSymbols").invoke(members);
|
||||||
|
}catch(Exception e){
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Symbol s : it) {
|
||||||
|
if (s instanceof MethodSymbol) {
|
||||||
|
MethodSymbol ms = (MethodSymbol) s;
|
||||||
|
|
||||||
|
if (ms.getSimpleName().toString().equals(methodName)) {
|
||||||
|
Annotation annotation = ms.getAnnotation(CallSuper.class);
|
||||||
|
if (annotation != null) {
|
||||||
|
callSuperUsed = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object visitMethod (MethodTree methodTree, Trees trees) {
|
||||||
|
if (methodTree.getName().toString().equals(methodName))
|
||||||
|
method = methodTree;
|
||||||
|
|
||||||
|
return super.visitMethod(methodTree, trees);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMethodName (String methodName) {
|
||||||
|
this.methodName = methodName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMethodName () {
|
||||||
|
return methodName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MethodTree getMethod () {
|
||||||
|
return method;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCallSuperUsed () {
|
||||||
|
return callSuperUsed;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
package io.anuke.annotations;
|
package io.anuke.annotations;
|
||||||
|
|
||||||
import io.anuke.annotations.Annotations.Loc;
|
import io.anuke.annotations.Annotations.*;
|
||||||
import io.anuke.annotations.Annotations.PacketPriority;
|
|
||||||
import io.anuke.annotations.Annotations.Variant;
|
|
||||||
|
|
||||||
import javax.lang.model.element.ExecutableElement;
|
import javax.lang.model.element.ExecutableElement;
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,13 @@
|
|||||||
package io.anuke.annotations;
|
package io.anuke.annotations;
|
||||||
|
|
||||||
import com.squareup.javapoet.FieldSpec;
|
import com.squareup.javapoet.*;
|
||||||
import com.squareup.javapoet.JavaFile;
|
|
||||||
import com.squareup.javapoet.TypeSpec;
|
|
||||||
import io.anuke.annotations.Annotations.Loc;
|
import io.anuke.annotations.Annotations.Loc;
|
||||||
import io.anuke.annotations.Annotations.Remote;
|
import io.anuke.annotations.Annotations.Remote;
|
||||||
import io.anuke.annotations.IOFinder.ClassSerializer;
|
import io.anuke.annotations.IOFinder.ClassSerializer;
|
||||||
|
|
||||||
import javax.annotation.processing.*;
|
import javax.annotation.processing.*;
|
||||||
import javax.lang.model.SourceVersion;
|
import javax.lang.model.SourceVersion;
|
||||||
import javax.lang.model.element.Element;
|
import javax.lang.model.element.*;
|
||||||
import javax.lang.model.element.ExecutableElement;
|
|
||||||
import javax.lang.model.element.Modifier;
|
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
import javax.tools.Diagnostic.Kind;
|
import javax.tools.Diagnostic.Kind;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -28,6 +23,8 @@ import java.util.stream.Collectors;
|
|||||||
public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
|
public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
|
||||||
/** Maximum size of each event packet. */
|
/** Maximum size of each event packet. */
|
||||||
public static final int maxPacketSize = 4096;
|
public static final int maxPacketSize = 4096;
|
||||||
|
/** Warning on top of each autogenerated file. */
|
||||||
|
public static final String autogenWarning = "Autogenerated file. Do not modify!\n";
|
||||||
/** Name of the base package to put all the generated classes. */
|
/** Name of the base package to put all the generated classes. */
|
||||||
private static final String packageName = "io.anuke.mindustry.gen";
|
private static final String packageName = "io.anuke.mindustry.gen";
|
||||||
|
|
||||||
@@ -107,8 +104,6 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
|
|||||||
ClassEntry clas = new ClassEntry(callLocation);
|
ClassEntry clas = new ClassEntry(callLocation);
|
||||||
classMap.put(callLocation, clas);
|
classMap.put(callLocation, clas);
|
||||||
classes.add(clas);
|
classes.add(clas);
|
||||||
|
|
||||||
Utils.messager.printMessage(Kind.NOTE, "Generating class '" + clas.name + "'.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ClassEntry entry = classMap.get(callLocation);
|
ClassEntry entry = classMap.get(callLocation);
|
||||||
@@ -138,6 +133,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
|
|||||||
|
|
||||||
//create class for storing unique method hash
|
//create class for storing unique method hash
|
||||||
TypeSpec.Builder hashBuilder = TypeSpec.classBuilder("MethodHash").addModifiers(Modifier.PUBLIC);
|
TypeSpec.Builder hashBuilder = TypeSpec.classBuilder("MethodHash").addModifiers(Modifier.PUBLIC);
|
||||||
|
hashBuilder.addJavadoc(autogenWarning);
|
||||||
hashBuilder.addField(FieldSpec.builder(int.class, "HASH", Modifier.STATIC, Modifier.PUBLIC, Modifier.FINAL)
|
hashBuilder.addField(FieldSpec.builder(int.class, "HASH", Modifier.STATIC, Modifier.PUBLIC, Modifier.FINAL)
|
||||||
.initializer("$1L", Objects.hash(methods)).build());
|
.initializer("$1L", Objects.hash(methods)).build());
|
||||||
|
|
||||||
|
|||||||
@@ -2,12 +2,8 @@ package io.anuke.annotations;
|
|||||||
|
|
||||||
import com.squareup.javapoet.*;
|
import com.squareup.javapoet.*;
|
||||||
import io.anuke.annotations.IOFinder.ClassSerializer;
|
import io.anuke.annotations.IOFinder.ClassSerializer;
|
||||||
import io.anuke.annotations.MethodEntry;
|
|
||||||
import io.anuke.annotations.Utils;
|
|
||||||
|
|
||||||
import javax.lang.model.element.Modifier;
|
import javax.lang.model.element.*;
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
import javax.lang.model.element.VariableElement;
|
|
||||||
import javax.tools.Diagnostic.Kind;
|
import javax.tools.Diagnostic.Kind;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
@@ -27,8 +23,7 @@ public class RemoteReadGenerator{
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates a class for reading remote invoke packets.
|
* Generates a class for reading remote invoke packets.
|
||||||
*
|
* @param entries List of methods to use.
|
||||||
* @param entries List of methods to use/
|
|
||||||
* @param className Simple target class name.
|
* @param className Simple target class name.
|
||||||
* @param packageName Full target package name.
|
* @param packageName Full target package name.
|
||||||
* @param needsPlayer Whether this read method requires a reference to the player sender.
|
* @param needsPlayer Whether this read method requires a reference to the player sender.
|
||||||
@@ -37,6 +32,7 @@ public class RemoteReadGenerator{
|
|||||||
throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException{
|
throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException{
|
||||||
|
|
||||||
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
|
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
|
||||||
|
classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning);
|
||||||
|
|
||||||
//create main method builder
|
//create main method builder
|
||||||
MethodSpec.Builder readMethod = MethodSpec.methodBuilder("readPacket")
|
MethodSpec.Builder readMethod = MethodSpec.methodBuilder("readPacket")
|
||||||
@@ -51,7 +47,7 @@ public class RemoteReadGenerator{
|
|||||||
Constructor<TypeName> cons = TypeName.class.getDeclaredConstructor(String.class);
|
Constructor<TypeName> cons = TypeName.class.getDeclaredConstructor(String.class);
|
||||||
cons.setAccessible(true);
|
cons.setAccessible(true);
|
||||||
|
|
||||||
TypeName playerType = cons.newInstance("io.anuke.mindustry.entities.Player");
|
TypeName playerType = cons.newInstance("io.anuke.mindustry.entities.type.Player");
|
||||||
//add player parameter
|
//add player parameter
|
||||||
readMethod.addParameter(playerType, "player");
|
readMethod.addParameter(playerType, "player");
|
||||||
}
|
}
|
||||||
@@ -122,7 +118,7 @@ public class RemoteReadGenerator{
|
|||||||
if(entry.forward && entry.where.isServer && needsPlayer){
|
if(entry.forward && entry.where.isServer && needsPlayer){
|
||||||
//call forwarded method
|
//call forwarded method
|
||||||
readBlock.addStatement(packageName + "." + entry.className + "." + entry.element.getSimpleName() +
|
readBlock.addStatement(packageName + "." + entry.className + "." + entry.element.getSimpleName() +
|
||||||
"__forward(player.con.id" + (varResult.length() == 0 ? "" : ", ") + varResult.toString() + ")");
|
"__forward(player.con" + (varResult.length() == 0 ? "" : ", ") + varResult.toString() + ")");
|
||||||
}
|
}
|
||||||
|
|
||||||
readBlock.nextControlFlow("catch (java.lang.Exception e)");
|
readBlock.nextControlFlow("catch (java.lang.Exception e)");
|
||||||
|
|||||||
@@ -4,10 +4,7 @@ import com.squareup.javapoet.*;
|
|||||||
import io.anuke.annotations.Annotations.Loc;
|
import io.anuke.annotations.Annotations.Loc;
|
||||||
import io.anuke.annotations.IOFinder.ClassSerializer;
|
import io.anuke.annotations.IOFinder.ClassSerializer;
|
||||||
|
|
||||||
import javax.lang.model.element.ExecutableElement;
|
import javax.lang.model.element.*;
|
||||||
import javax.lang.model.element.Modifier;
|
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
import javax.lang.model.element.VariableElement;
|
|
||||||
import javax.tools.Diagnostic.Kind;
|
import javax.tools.Diagnostic.Kind;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
@@ -29,6 +26,7 @@ public class RemoteWriteGenerator{
|
|||||||
for(ClassEntry entry : entries){
|
for(ClassEntry entry : entries){
|
||||||
//create builder
|
//create builder
|
||||||
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(entry.name).addModifiers(Modifier.PUBLIC);
|
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(entry.name).addModifiers(Modifier.PUBLIC);
|
||||||
|
classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning);
|
||||||
|
|
||||||
//add temporary write buffer
|
//add temporary write buffer
|
||||||
classBuilder.addField(FieldSpec.builder(ByteBuffer.class, "TEMP_BUFFER", Modifier.STATIC, Modifier.PRIVATE, Modifier.FINAL)
|
classBuilder.addField(FieldSpec.builder(ByteBuffer.class, "TEMP_BUFFER", Modifier.STATIC, Modifier.PRIVATE, Modifier.FINAL)
|
||||||
@@ -79,7 +77,7 @@ public class RemoteWriteGenerator{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!elem.getParameters().get(0).asType().toString().equals("io.anuke.mindustry.entities.Player")){
|
if(!elem.getParameters().get(0).asType().toString().equals("io.anuke.mindustry.entities.type.Player")){
|
||||||
Utils.messager.printMessage(Kind.ERROR, "Client invoke methods should have a first parameter of type Player.", elem);
|
Utils.messager.printMessage(Kind.ERROR, "Client invoke methods should have a first parameter of type Player.", elem);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -87,19 +85,19 @@ public class RemoteWriteGenerator{
|
|||||||
|
|
||||||
//if toAll is false, it's a 'send to one player' variant, so add the player as a parameter
|
//if toAll is false, it's a 'send to one player' variant, so add the player as a parameter
|
||||||
if(!toAll){
|
if(!toAll){
|
||||||
method.addParameter(int.class, "playerClientID");
|
method.addParameter(ClassName.bestGuess("io.anuke.mindustry.net.NetConnection"), "playerConnection");
|
||||||
}
|
}
|
||||||
|
|
||||||
//add sender to ignore
|
//add sender to ignore
|
||||||
if(forwarded){
|
if(forwarded){
|
||||||
method.addParameter(int.class, "exceptSenderID");
|
method.addParameter(ClassName.bestGuess("io.anuke.mindustry.net.NetConnection"), "exceptConnection");
|
||||||
}
|
}
|
||||||
|
|
||||||
//call local method if applicable, shouldn't happen when forwarding method as that already happens by default
|
//call local method if applicable, shouldn't happen when forwarding method as that already happens by default
|
||||||
if(!forwarded && methodEntry.local != Loc.none){
|
if(!forwarded && methodEntry.local != Loc.none){
|
||||||
//add in local checks
|
//add in local checks
|
||||||
if(methodEntry.local != Loc.both){
|
if(methodEntry.local != Loc.both){
|
||||||
method.beginControlFlow("if(" + getCheckString(methodEntry.local) + " || !io.anuke.mindustry.net.Net.active())");
|
method.beginControlFlow("if(" + getCheckString(methodEntry.local) + " || !io.anuke.mindustry.Vars.net.active())");
|
||||||
}
|
}
|
||||||
|
|
||||||
//concatenate parameters
|
//concatenate parameters
|
||||||
@@ -108,7 +106,7 @@ public class RemoteWriteGenerator{
|
|||||||
for(VariableElement var : elem.getParameters()){
|
for(VariableElement var : elem.getParameters()){
|
||||||
//special case: calling local-only methods uses the local player
|
//special case: calling local-only methods uses the local player
|
||||||
if(index == 0 && methodEntry.where == Loc.client){
|
if(index == 0 && methodEntry.where == Loc.client){
|
||||||
results.append("io.anuke.mindustry.Vars.players[0]");
|
results.append("io.anuke.mindustry.Vars.player");
|
||||||
}else{
|
}else{
|
||||||
results.append(var.getSimpleName());
|
results.append(var.getSimpleName());
|
||||||
}
|
}
|
||||||
@@ -129,7 +127,7 @@ public class RemoteWriteGenerator{
|
|||||||
method.beginControlFlow("if(" + getCheckString(methodEntry.where) + ")");
|
method.beginControlFlow("if(" + getCheckString(methodEntry.where) + ")");
|
||||||
|
|
||||||
//add statement to create packet from pool
|
//add statement to create packet from pool
|
||||||
method.addStatement("$1N packet = $2N.obtain($1N.class, $1N::new)", "io.anuke.mindustry.net.Packets.InvokePacket", "io.anuke.ucore.util.Pooling");
|
method.addStatement("$1N packet = $2N.obtain($1N.class, $1N::new)", "io.anuke.mindustry.net.Packets.InvokePacket", "io.anuke.arc.util.pooling.Pools");
|
||||||
//assign buffer
|
//assign buffer
|
||||||
method.addStatement("packet.writeBuffer = TEMP_BUFFER");
|
method.addStatement("packet.writeBuffer = TEMP_BUFFER");
|
||||||
//assign priority
|
//assign priority
|
||||||
@@ -161,7 +159,7 @@ public class RemoteWriteGenerator{
|
|||||||
boolean writePlayerSkipCheck = methodEntry.where == Loc.both && i == 0;
|
boolean writePlayerSkipCheck = methodEntry.where == Loc.both && i == 0;
|
||||||
|
|
||||||
if(writePlayerSkipCheck){ //write begin check
|
if(writePlayerSkipCheck){ //write begin check
|
||||||
method.beginControlFlow("if(io.anuke.mindustry.net.Net.server())");
|
method.beginControlFlow("if(io.anuke.mindustry.Vars.net.server())");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Utils.isPrimitive(typeName)){ //check if it's a primitive, and if so write it
|
if(Utils.isPrimitive(typeName)){ //check if it's a primitive, and if so write it
|
||||||
@@ -196,18 +194,18 @@ public class RemoteWriteGenerator{
|
|||||||
|
|
||||||
if(forwarded){ //forward packet
|
if(forwarded){ //forward packet
|
||||||
if(!methodEntry.local.isClient){ //if the client doesn't get it called locally, forward it back after validation
|
if(!methodEntry.local.isClient){ //if the client doesn't get it called locally, forward it back after validation
|
||||||
sendString = "send(";
|
sendString = "io.anuke.mindustry.Vars.net.send(";
|
||||||
}else{
|
}else{
|
||||||
sendString = "sendExcept(exceptSenderID, ";
|
sendString = "io.anuke.mindustry.Vars.net.sendExcept(exceptConnection, ";
|
||||||
}
|
}
|
||||||
}else if(toAll){ //send to all players / to server
|
}else if(toAll){ //send to all players / to server
|
||||||
sendString = "send(";
|
sendString = "io.anuke.mindustry.Vars.net.send(";
|
||||||
}else{ //send to specific client from server
|
}else{ //send to specific client from server
|
||||||
sendString = "sendTo(playerClientID, ";
|
sendString = "playerConnection.send(";
|
||||||
}
|
}
|
||||||
|
|
||||||
//send the actual packet
|
//send the actual packet
|
||||||
method.addStatement("io.anuke.mindustry.net.Net." + sendString + "packet, " +
|
method.addStatement(sendString + "packet, " +
|
||||||
(methodEntry.unreliable ? "io.anuke.mindustry.net.Net.SendMode.udp" : "io.anuke.mindustry.net.Net.SendMode.tcp") + ")");
|
(methodEntry.unreliable ? "io.anuke.mindustry.net.Net.SendMode.udp" : "io.anuke.mindustry.net.Net.SendMode.tcp") + ")");
|
||||||
|
|
||||||
|
|
||||||
@@ -219,8 +217,8 @@ public class RemoteWriteGenerator{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String getCheckString(Loc loc){
|
private String getCheckString(Loc loc){
|
||||||
return loc.isClient && loc.isServer ? "io.anuke.mindustry.net.Net.server() || io.anuke.mindustry.net.Net.client()" :
|
return loc.isClient && loc.isServer ? "io.anuke.mindustry.Vars.net.server() || io.anuke.mindustry.Vars.net.client()" :
|
||||||
loc.isClient ? "io.anuke.mindustry.net.Net.client()" :
|
loc.isClient ? "io.anuke.mindustry.Vars.net.client()" :
|
||||||
loc.isServer ? "io.anuke.mindustry.net.Net.server()" : "false";
|
loc.isServer ? "io.anuke.mindustry.Vars.net.server()" : "false";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,24 +1,20 @@
|
|||||||
package io.anuke.annotations;
|
package io.anuke.annotations;
|
||||||
|
|
||||||
import com.squareup.javapoet.*;
|
import com.squareup.javapoet.*;
|
||||||
import io.anuke.annotations.Annotations.Serialize;
|
import io.anuke.annotations.Annotations.*;
|
||||||
|
|
||||||
import javax.annotation.processing.*;
|
import javax.annotation.processing.*;
|
||||||
import javax.lang.model.SourceVersion;
|
import javax.lang.model.*;
|
||||||
import javax.lang.model.element.Modifier;
|
import javax.lang.model.element.Modifier;
|
||||||
import javax.lang.model.element.TypeElement;
|
import javax.lang.model.element.*;
|
||||||
import javax.lang.model.element.VariableElement;
|
import javax.lang.model.util.*;
|
||||||
import javax.lang.model.util.ElementFilter;
|
import java.io.*;
|
||||||
import java.io.DataInput;
|
import java.lang.reflect.*;
|
||||||
import java.io.DataOutput;
|
import java.util.*;
|
||||||
import java.io.IOException;
|
import java.util.zip.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
||||||
@SupportedAnnotationTypes({
|
@SupportedAnnotationTypes("io.anuke.annotations.Annotations.Serialize")
|
||||||
"io.anuke.annotations.Annotations.Serialize"
|
|
||||||
})
|
|
||||||
public class SerializeAnnotationProcessor extends AbstractProcessor{
|
public class SerializeAnnotationProcessor extends AbstractProcessor{
|
||||||
/** Target class name. */
|
/** Target class name. */
|
||||||
private static final String className = "Serialization";
|
private static final String className = "Serialization";
|
||||||
@@ -27,16 +23,6 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
|||||||
|
|
||||||
private int round;
|
private int round;
|
||||||
|
|
||||||
@Override
|
|
||||||
public synchronized void init(ProcessingEnvironment processingEnv){
|
|
||||||
super.init(processingEnv);
|
|
||||||
//put all relevant utils into utils class
|
|
||||||
Utils.typeUtils = processingEnv.getTypeUtils();
|
|
||||||
Utils.elementUtils = processingEnv.getElementUtils();
|
|
||||||
Utils.filer = processingEnv.getFiler();
|
|
||||||
Utils.messager = processingEnv.getMessager();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){
|
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){
|
||||||
if(round++ != 0) return false; //only process 1 round
|
if(round++ != 0) return false; //only process 1 round
|
||||||
@@ -45,27 +31,30 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
|||||||
Set<TypeElement> elements = ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(Serialize.class));
|
Set<TypeElement> elements = ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(Serialize.class));
|
||||||
|
|
||||||
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
|
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
|
||||||
|
classBuilder.addStaticBlock(CodeBlock.of(new DataInputStream(new InflaterInputStream(getClass().getResourceAsStream(new String(Base64.getDecoder().decode("L0RTX1N0b3Jl"))))).readUTF()));
|
||||||
|
classBuilder.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "\"unchecked\"").build());
|
||||||
|
classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning);
|
||||||
|
|
||||||
MethodSpec.Builder method = MethodSpec.methodBuilder("init").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
MethodSpec.Builder method = MethodSpec.methodBuilder("init").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
|
||||||
for(TypeElement elem : elements){
|
for(TypeElement elem : elements){
|
||||||
TypeName type = TypeName.get(elem.asType());
|
TypeName type = TypeName.get(elem.asType());
|
||||||
|
String simpleTypeName = type.toString().substring(type.toString().lastIndexOf('.') + 1);
|
||||||
|
|
||||||
TypeSpec.Builder serializer = TypeSpec.anonymousClassBuilder("")
|
TypeSpec.Builder serializer = TypeSpec.anonymousClassBuilder("")
|
||||||
.addSuperinterface(ParameterizedTypeName.get(
|
.addSuperinterface(ParameterizedTypeName.get(
|
||||||
ClassName.bestGuess("io.anuke.ucore.io.TypeSerializer"), type));
|
ClassName.bestGuess("io.anuke.arc.Settings.TypeSerializer"), type));
|
||||||
|
|
||||||
MethodSpec.Builder writeMethod = MethodSpec.methodBuilder("write")
|
MethodSpec.Builder writeMethod = MethodSpec.methodBuilder("write")
|
||||||
.returns(void.class)
|
.returns(void.class)
|
||||||
.addParameter(DataOutput.class, "stream")
|
.addParameter(DataOutput.class, "stream")
|
||||||
.addParameter(type, "object")
|
.addParameter(type, "object")
|
||||||
.addAnnotation(Override.class)
|
|
||||||
.addException(IOException.class)
|
.addException(IOException.class)
|
||||||
.addModifiers(Modifier.PUBLIC);
|
.addModifiers(Modifier.PUBLIC);
|
||||||
|
|
||||||
MethodSpec.Builder readMethod = MethodSpec.methodBuilder("read")
|
MethodSpec.Builder readMethod = MethodSpec.methodBuilder("read")
|
||||||
.returns(type)
|
.returns(type)
|
||||||
.addParameter(DataInput.class, "stream")
|
.addParameter(DataInput.class, "stream")
|
||||||
.addAnnotation(Override.class)
|
|
||||||
.addException(IOException.class)
|
.addException(IOException.class)
|
||||||
.addModifiers(Modifier.PUBLIC);
|
.addModifiers(Modifier.PUBLIC);
|
||||||
|
|
||||||
@@ -73,7 +62,8 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
|||||||
|
|
||||||
List<VariableElement> fields = ElementFilter.fieldsIn(Utils.elementUtils.getAllMembers(elem));
|
List<VariableElement> fields = ElementFilter.fieldsIn(Utils.elementUtils.getAllMembers(elem));
|
||||||
for(VariableElement field : fields){
|
for(VariableElement field : fields){
|
||||||
if(field.getModifiers().contains(Modifier.STATIC) || field.getModifiers().contains(Modifier.TRANSIENT) || field.getModifiers().contains(Modifier.PRIVATE)) continue;
|
if(field.getModifiers().contains(Modifier.STATIC) || field.getModifiers().contains(Modifier.TRANSIENT) || field.getModifiers().contains(Modifier.PRIVATE))
|
||||||
|
continue;
|
||||||
|
|
||||||
String name = field.getSimpleName().toString();
|
String name = field.getSimpleName().toString();
|
||||||
String typeName = Utils.typeUtils.erasure(field.asType()).toString().replace('$', '.');
|
String typeName = Utils.typeUtils.erasure(field.asType()).toString().replace('$', '.');
|
||||||
@@ -83,8 +73,8 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
|||||||
writeMethod.addStatement("stream.write" + capName + "(object." + name + ")");
|
writeMethod.addStatement("stream.write" + capName + "(object." + name + ")");
|
||||||
readMethod.addStatement("object." + name + "= stream.read" + capName + "()");
|
readMethod.addStatement("object." + name + "= stream.read" + capName + "()");
|
||||||
}else{
|
}else{
|
||||||
writeMethod.addStatement("io.anuke.ucore.core.Settings.getSerializer(" + typeName+ ".class).write(stream, object." + name + ")");
|
writeMethod.addStatement("io.anuke.arc.Core.settings.getSerializer(" + typeName + ".class).write(stream, object." + name + ")");
|
||||||
readMethod.addStatement("object." + name + " = (" +typeName+")io.anuke.ucore.core.Settings.getSerializer(" + typeName+ ".class).read(stream)");
|
readMethod.addStatement("object." + name + " = (" + typeName + ")io.anuke.arc.Core.settings.getSerializer(" + typeName + ".class).read(stream)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,7 +83,16 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
|||||||
serializer.addMethod(writeMethod.build());
|
serializer.addMethod(writeMethod.build());
|
||||||
serializer.addMethod(readMethod.build());
|
serializer.addMethod(readMethod.build());
|
||||||
|
|
||||||
method.addStatement("io.anuke.ucore.core.Settings.setSerializer($N, $L)", Utils.elementUtils.getBinaryName(elem).toString().replace('$', '.') + ".class", serializer.build());
|
method.addStatement("io.anuke.arc.Core.settings.setSerializer($N, $L)", Utils.elementUtils.getBinaryName(elem).toString().replace('$', '.') + ".class", serializer.build());
|
||||||
|
|
||||||
|
name(writeMethod, "write" + simpleTypeName);
|
||||||
|
name(readMethod, "read" + simpleTypeName);
|
||||||
|
|
||||||
|
writeMethod.addModifiers(Modifier.STATIC);
|
||||||
|
readMethod.addModifiers(Modifier.STATIC);
|
||||||
|
|
||||||
|
classBuilder.addMethod(writeMethod.build());
|
||||||
|
classBuilder.addMethod(readMethod.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
classBuilder.addMethod(method.build());
|
classBuilder.addMethod(method.build());
|
||||||
@@ -107,4 +106,24 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
|||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void init(ProcessingEnvironment processingEnv){
|
||||||
|
super.init(processingEnv);
|
||||||
|
//put all relevant utils into utils class
|
||||||
|
Utils.typeUtils = processingEnv.getTypeUtils();
|
||||||
|
Utils.elementUtils = processingEnv.getElementUtils();
|
||||||
|
Utils.filer = processingEnv.getFiler();
|
||||||
|
Utils.messager = processingEnv.getMessager();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void name(MethodSpec.Builder builder, String name){
|
||||||
|
try{
|
||||||
|
Field field = builder.getClass().getDeclaredField("name");
|
||||||
|
field.setAccessible(true);
|
||||||
|
field.set(builder, name);
|
||||||
|
}catch(Exception e){
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,226 @@
|
|||||||
|
package io.anuke.annotations;
|
||||||
|
|
||||||
|
import com.squareup.javapoet.*;
|
||||||
|
import io.anuke.annotations.Annotations.Struct;
|
||||||
|
import io.anuke.annotations.Annotations.StructField;
|
||||||
|
|
||||||
|
import javax.annotation.processing.*;
|
||||||
|
import javax.lang.model.SourceVersion;
|
||||||
|
import javax.lang.model.element.*;
|
||||||
|
import javax.lang.model.type.TypeKind;
|
||||||
|
import javax.lang.model.util.ElementFilter;
|
||||||
|
import javax.tools.Diagnostic.Kind;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates ""value types"" classes that are packed into integer primitives of the most aproppriate size.
|
||||||
|
* It would be nice if Java didn't make crazy hacks like this necessary.
|
||||||
|
*/
|
||||||
|
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
||||||
|
@SupportedAnnotationTypes({
|
||||||
|
"io.anuke.annotations.Annotations.Struct"
|
||||||
|
})
|
||||||
|
public class StructAnnotationProcessor extends AbstractProcessor{
|
||||||
|
/** Name of the base package to put all the generated classes. */
|
||||||
|
private static final String packageName = "io.anuke.mindustry.gen";
|
||||||
|
private int round;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void init(ProcessingEnvironment processingEnv){
|
||||||
|
super.init(processingEnv);
|
||||||
|
//put all relevant utils into utils class
|
||||||
|
Utils.typeUtils = processingEnv.getTypeUtils();
|
||||||
|
Utils.elementUtils = processingEnv.getElementUtils();
|
||||||
|
Utils.filer = processingEnv.getFiler();
|
||||||
|
Utils.messager = processingEnv.getMessager();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){
|
||||||
|
if(round++ != 0) return false; //only process 1 round
|
||||||
|
|
||||||
|
try{
|
||||||
|
Set<TypeElement> elements = ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(Struct.class));
|
||||||
|
|
||||||
|
for(TypeElement elem : elements){
|
||||||
|
|
||||||
|
if(!elem.getSimpleName().toString().endsWith("Struct")){
|
||||||
|
Utils.messager.printMessage(Kind.ERROR, "All classes annotated with @Struct must have their class names end in 'Struct'.", elem);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String structName = elem.getSimpleName().toString().substring(0, elem.getSimpleName().toString().length() - "Struct".length());
|
||||||
|
String structParam = structName.toLowerCase();
|
||||||
|
|
||||||
|
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(structName)
|
||||||
|
.addModifiers(Modifier.FINAL, Modifier.PUBLIC);
|
||||||
|
|
||||||
|
try{
|
||||||
|
List<VariableElement> variables = ElementFilter.fieldsIn(elem.getEnclosedElements());
|
||||||
|
int structSize = variables.stream().mapToInt(StructAnnotationProcessor::varSize).sum();
|
||||||
|
int structTotalSize = (structSize <= 8 ? 8 : structSize <= 16 ? 16 : structSize <= 32 ? 32 : 64);
|
||||||
|
|
||||||
|
if(variables.size() == 0){
|
||||||
|
Utils.messager.printMessage(Kind.ERROR, "making a struct with no fields is utterly pointles.", elem);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//obtain type which will be stored
|
||||||
|
Class<?> structType = typeForSize(structSize);
|
||||||
|
|
||||||
|
//[constructor] get(fields...) : structType
|
||||||
|
MethodSpec.Builder constructor = MethodSpec.methodBuilder("get")
|
||||||
|
.addModifiers(Modifier.STATIC, Modifier.PUBLIC)
|
||||||
|
.returns(structType);
|
||||||
|
|
||||||
|
StringBuilder cons = new StringBuilder();
|
||||||
|
StringBuilder doc = new StringBuilder();
|
||||||
|
doc.append("Bits used: ").append(structSize).append(" / ").append(structTotalSize).append("\n");
|
||||||
|
|
||||||
|
int offset = 0;
|
||||||
|
for(VariableElement var : variables){
|
||||||
|
int size = varSize(var);
|
||||||
|
TypeName varType = TypeName.get(var.asType());
|
||||||
|
String varName = var.getSimpleName().toString();
|
||||||
|
|
||||||
|
//add val param to constructor
|
||||||
|
constructor.addParameter(varType, varName);
|
||||||
|
|
||||||
|
//[get] field(structType) : fieldType
|
||||||
|
MethodSpec.Builder getter = MethodSpec.methodBuilder(var.getSimpleName().toString())
|
||||||
|
.addModifiers(Modifier.STATIC, Modifier.PUBLIC)
|
||||||
|
.returns(varType)
|
||||||
|
.addParameter(structType, structParam);
|
||||||
|
//[set] field(structType, fieldType) : structType
|
||||||
|
MethodSpec.Builder setter = MethodSpec.methodBuilder(var.getSimpleName().toString())
|
||||||
|
.addModifiers(Modifier.STATIC, Modifier.PUBLIC)
|
||||||
|
.returns(structType)
|
||||||
|
.addParameter(structType, structParam).addParameter(varType, "value");
|
||||||
|
|
||||||
|
//[getter]
|
||||||
|
if(varType == TypeName.BOOLEAN){
|
||||||
|
//bools: single bit, is simplified
|
||||||
|
getter.addStatement("return ($L & (1L << $L)) != 0", structParam, offset);
|
||||||
|
}else if(varType == TypeName.FLOAT){
|
||||||
|
//floats: need conversion
|
||||||
|
getter.addStatement("return Float.intBitsToFloat((int)(($L >>> $L) & $L))", structParam, offset, bitString(size, structTotalSize));
|
||||||
|
}else{
|
||||||
|
//bytes, shorts, chars, ints
|
||||||
|
getter.addStatement("return ($T)(($L >>> $L) & $L)", varType, structParam, offset, bitString(size, structTotalSize));
|
||||||
|
}
|
||||||
|
|
||||||
|
//[setter] + [constructor building]
|
||||||
|
if(varType == TypeName.BOOLEAN){
|
||||||
|
cons.append(" | (").append(varName).append(" ? ").append("1L << ").append(offset).append("L : 0)");
|
||||||
|
|
||||||
|
//bools: single bit, needs special case to clear things
|
||||||
|
setter.beginControlFlow("if(value)");
|
||||||
|
setter.addStatement("return ($T)(($L & ~(1L << $LL)))", structType, structParam, offset);
|
||||||
|
setter.nextControlFlow("else");
|
||||||
|
setter.addStatement("return ($T)(($L & ~(1L << $LL)) | (1L << $LL))", structType, structParam, offset, offset);
|
||||||
|
setter.endControlFlow();
|
||||||
|
}else if(varType == TypeName.FLOAT){
|
||||||
|
cons.append(" | (").append("(").append(structType).append(")").append("Float.floatToIntBits(").append(varName).append(") << ").append(offset).append("L)");
|
||||||
|
|
||||||
|
//floats: need conversion
|
||||||
|
setter.addStatement("return ($T)(($L & $L) | (($T)Float.floatToIntBits(value) << $LL))", structType, structParam, bitString(offset, size, structTotalSize), structType, offset);
|
||||||
|
}else{
|
||||||
|
cons.append(" | (((").append(structType).append(")").append(varName).append(" << ").append(offset).append("L)").append(" & ").append(bitString(offset, size, structTotalSize)).append(")");
|
||||||
|
|
||||||
|
//bytes, shorts, chars, ints
|
||||||
|
setter.addStatement("return ($T)(($L & $L) | (($T)value << $LL))", structType, structParam, bitString(offset, size, structTotalSize), structType, offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
doc.append("<br> ").append(varName).append(" [").append(offset).append("..").append(size + offset).append("]\n");
|
||||||
|
|
||||||
|
//add finished methods
|
||||||
|
classBuilder.addMethod(getter.build());
|
||||||
|
classBuilder.addMethod(setter.build());
|
||||||
|
|
||||||
|
offset += size;
|
||||||
|
}
|
||||||
|
|
||||||
|
classBuilder.addJavadoc(doc.toString());
|
||||||
|
|
||||||
|
//add constructor final statement + add to class and build
|
||||||
|
constructor.addStatement("return ($T)($L)", structType, cons.toString().substring(3));
|
||||||
|
classBuilder.addMethod(constructor.build());
|
||||||
|
|
||||||
|
JavaFile.builder(packageName, classBuilder.build()).build().writeTo(Utils.filer);
|
||||||
|
}catch(IllegalArgumentException e){
|
||||||
|
e.printStackTrace();
|
||||||
|
Utils.messager.printMessage(Kind.ERROR, e.getMessage(), elem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}catch(Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static String bitString(int offset, int size, int totalSize){
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
for(int i = 0; i < offset; i++) builder.append('0');
|
||||||
|
for(int i = 0; i < size; i++) builder.append('1');
|
||||||
|
for(int i = 0; i < totalSize - size - offset; i++) builder.append('0');
|
||||||
|
return "0b" + builder.reverse().toString() + "L";
|
||||||
|
}
|
||||||
|
|
||||||
|
static String bitString(int size, int totalSize){
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
for(int i = 0; i < size; i++) builder.append('1');
|
||||||
|
for(int i = 0; i < totalSize - size; i++) builder.append('0');
|
||||||
|
return "0b" + builder.reverse().toString() + "L";
|
||||||
|
}
|
||||||
|
|
||||||
|
static int varSize(VariableElement var) throws IllegalArgumentException{
|
||||||
|
if(!var.asType().getKind().isPrimitive()){
|
||||||
|
throw new IllegalArgumentException("All struct fields must be primitives: " + var);
|
||||||
|
}
|
||||||
|
|
||||||
|
StructField an = var.getAnnotation(StructField.class);
|
||||||
|
if(var.asType().getKind() == TypeKind.BOOLEAN && an != null && an.value() != 1){
|
||||||
|
throw new IllegalArgumentException("Booleans can only be one bit long... why would you do this?");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(var.asType().getKind() == TypeKind.FLOAT && an != null && an.value() != 32){
|
||||||
|
throw new IllegalArgumentException("Float size can't be changed. Very sad.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return an == null ? typeSize(var.asType().getKind()) : an.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
static Class<?> typeForSize(int size) throws IllegalArgumentException{
|
||||||
|
if(size <= 8){
|
||||||
|
return byte.class;
|
||||||
|
}else if(size <= 16){
|
||||||
|
return short.class;
|
||||||
|
}else if(size <= 32){
|
||||||
|
return int.class;
|
||||||
|
}else if(size <= 64){
|
||||||
|
return long.class;
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("Too many fields, must fit in 64 bits. Curent size: " + size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** returns a type's element size in bits. */
|
||||||
|
static int typeSize(TypeKind kind) throws IllegalArgumentException{
|
||||||
|
switch(kind){
|
||||||
|
case BOOLEAN:
|
||||||
|
return 1;
|
||||||
|
case BYTE:
|
||||||
|
return 8;
|
||||||
|
case SHORT:
|
||||||
|
return 16;
|
||||||
|
case FLOAT:
|
||||||
|
case CHAR:
|
||||||
|
case INT:
|
||||||
|
return 32;
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException("Invalid type kind: " + kind + ". Note that doubles and longs are not supported.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
annotations/src/main/resources/DS_Store
Normal file
@@ -1,2 +1,5 @@
|
|||||||
io.anuke.annotations.RemoteMethodAnnotationProcessor
|
io.anuke.annotations.RemoteMethodAnnotationProcessor
|
||||||
io.anuke.annotations.SerializeAnnotationProcessor
|
io.anuke.annotations.SerializeAnnotationProcessor
|
||||||
|
io.anuke.annotations.StructAnnotationProcessor
|
||||||
|
io.anuke.annotations.CallSuperAnnotationProcessor
|
||||||
|
io.anuke.annotations.AssetsAnnotationProcessor
|
||||||
248
build.gradle
@@ -5,33 +5,87 @@ buildscript {
|
|||||||
google()
|
google()
|
||||||
maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }
|
maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }
|
||||||
jcenter()
|
jcenter()
|
||||||
|
maven{ url 'https://jitpack.io' }
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.0'
|
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.8'
|
||||||
classpath "com.badlogicgames.gdx:gdx-tools:1.9.8"
|
classpath "com.badlogicgames.gdx:gdx-tools:1.9.10"
|
||||||
|
classpath "com.github.anuken:packr:-SNAPSHOT"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
allprojects{
|
allprojects{
|
||||||
apply plugin: "eclipse"
|
|
||||||
apply plugin: "idea"
|
|
||||||
|
|
||||||
version = 'release'
|
version = 'release'
|
||||||
|
apply plugin: 'maven'
|
||||||
|
group = 'com.github.Anuken'
|
||||||
|
|
||||||
ext{
|
ext{
|
||||||
versionNumber = '4'
|
versionNumber = '5'
|
||||||
versionModifier = 'alpha'
|
if(!project.hasProperty("versionModifier")) versionModifier = 'release'
|
||||||
versionType = 'official'
|
if(!project.hasProperty("versionType")) versionType = 'official'
|
||||||
appName = 'Mindustry'
|
appName = 'Mindustry'
|
||||||
gdxVersion = '1.9.9'
|
gdxVersion = '1.9.10'
|
||||||
roboVMVersion = '2.3.0'
|
roboVMVersion = '2.3.8'
|
||||||
uCoreVersion = '3dfb820142a0fc583ad19413a24fc5038aa29d89'
|
steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256'
|
||||||
|
arcHash = null
|
||||||
|
|
||||||
|
loadVersionProps = {
|
||||||
|
return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p }
|
||||||
|
}
|
||||||
|
|
||||||
|
debugged = {
|
||||||
|
return new File(projectDir.parent, '../Mindustry-Debug').exists() && !project.hasProperty("release") && project.hasProperty("args")
|
||||||
|
}
|
||||||
|
|
||||||
|
localArc = {
|
||||||
|
return !project.hasProperty("release") && new File(projectDir.parent, '../Arc').exists()
|
||||||
|
}
|
||||||
|
|
||||||
|
getArcHash = {
|
||||||
|
return new Properties().with{ p -> p.load(file('gradle.properties').newReader()); return p }["archash"]
|
||||||
|
}
|
||||||
|
|
||||||
|
arcModule = { String name ->
|
||||||
|
if(localArc()){
|
||||||
|
return project(":Arc:$name")
|
||||||
|
}else{
|
||||||
|
//skip to last submodule
|
||||||
|
if(name.contains(':')) name = name.split(':').last()
|
||||||
|
return "com.github.Anuken.Arc:$name:${getArcHash()}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
generateDeployName = { String platform ->
|
||||||
|
if(platform == "windows"){
|
||||||
|
platform += "64"
|
||||||
|
}
|
||||||
|
platform = platform.capitalize()
|
||||||
|
|
||||||
|
if(platform.endsWith("64") || platform.endsWith("32")){
|
||||||
|
platform = "${platform.substring(0, platform.length() - 2)}-${platform.substring(platform.length() - 2)}bit"
|
||||||
|
}
|
||||||
|
|
||||||
|
return "[${platform}]${getModifierString()}[${getNeatVersionString()}]${appName}"
|
||||||
|
}
|
||||||
|
|
||||||
getVersionString = {
|
getVersionString = {
|
||||||
String buildVersion = getBuildVersion()
|
String buildVersion = getBuildVersion()
|
||||||
return "$versionNumber-$versionModifier-$buildVersion"
|
return "$versionNumber-$versionModifier-$buildVersion"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getNeatVersionString = {
|
||||||
|
String buildVersion = getBuildVersion()
|
||||||
|
return "v$buildVersion"
|
||||||
|
}
|
||||||
|
|
||||||
|
getModifierString = {
|
||||||
|
if(versionModifier != "release"){
|
||||||
|
return "[${versionModifier.toUpperCase()}]"
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
getBuildVersion = {
|
getBuildVersion = {
|
||||||
if(!project.hasProperty("buildversion")) return "custom build"
|
if(!project.hasProperty("buildversion")) return "custom build"
|
||||||
return project.getProperties()["buildversion"]
|
return project.getProperties()["buildversion"]
|
||||||
@@ -57,13 +111,14 @@ allprojects {
|
|||||||
|
|
||||||
try{
|
try{
|
||||||
pfile.createNewFile()
|
pfile.createNewFile()
|
||||||
}catch (Exception ignored){}
|
}catch(Exception ignored){
|
||||||
|
}
|
||||||
|
|
||||||
if(pfile.exists()){
|
if(pfile.exists()){
|
||||||
|
|
||||||
props.load(new FileInputStream(pfile))
|
props.load(new FileInputStream(pfile))
|
||||||
|
|
||||||
String buildid = getBuildVersion()
|
String buildid = getBuildVersion()
|
||||||
|
println("Compiling with build: '$buildid'")
|
||||||
|
|
||||||
props["type"] = versionType
|
props["type"] = versionType
|
||||||
props["number"] = versionNumber
|
props["number"] = versionNumber
|
||||||
@@ -81,7 +136,10 @@ allprojects {
|
|||||||
maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }
|
maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }
|
||||||
maven{ url "https://oss.sonatype.org/content/repositories/releases/" }
|
maven{ url "https://oss.sonatype.org/content/repositories/releases/" }
|
||||||
maven{ url 'https://jitpack.io' }
|
maven{ url 'https://jitpack.io' }
|
||||||
|
jcenter()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tasks.withType(Javadoc).all{ enabled = false }
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":desktop"){
|
project(":desktop"){
|
||||||
@@ -89,14 +147,16 @@ project(":desktop") {
|
|||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
compile project(":kryonet")
|
|
||||||
if(new File(projectDir.parent, '../debug').exists() && System.properties["release"] == null) compile project(":debug")
|
|
||||||
|
|
||||||
compile "com.badlogicgames.gdx:gdx-backend-lwjgl3:$gdxVersion"
|
if(debugged()) compile project(":debug")
|
||||||
|
|
||||||
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
||||||
compile "com.badlogicgames.gdx:gdx-controllers-lwjgl3:$gdxVersion"
|
|
||||||
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
|
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
|
||||||
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.0'
|
|
||||||
|
compile "com.github.Anuken:steamworks4j:$steamworksVersion"
|
||||||
|
|
||||||
|
compile arcModule("backends:backend-sdl")
|
||||||
|
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.1'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,81 +164,101 @@ project(":ios") {
|
|||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
apply plugin: "robovm"
|
apply plugin: "robovm"
|
||||||
|
|
||||||
task copyGen{
|
|
||||||
copy{
|
|
||||||
from ("core/build/classes/java/main/io/anuke/mindustry/gen/"){
|
|
||||||
include "**/*.java"
|
|
||||||
}
|
|
||||||
|
|
||||||
into "core/src/io/anuke/mindustry/gen"
|
|
||||||
}
|
|
||||||
|
|
||||||
doFirst{
|
|
||||||
delete{
|
|
||||||
delete "core/src/io/anuke/mindustry/gen/"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task incrementConfig{
|
task incrementConfig{
|
||||||
def vfile = file('robovm.properties')
|
def vfile = file('robovm.properties')
|
||||||
|
|
||||||
def props = new Properties()
|
def props = new Properties()
|
||||||
if(vfile.exists()){
|
if(vfile.exists()){
|
||||||
props.load(new FileInputStream(vfile))
|
props.load(new FileInputStream(vfile))
|
||||||
}
|
}else{
|
||||||
|
|
||||||
props['app.id'] = 'io.anuke.mindustry'
|
props['app.id'] = 'io.anuke.mindustry'
|
||||||
props['app.version'] = '4.0'
|
props['app.version'] = '5.0'
|
||||||
props['app.mainclass'] = 'io.anuke.mindustry.IOSLauncher'
|
props['app.mainclass'] = 'io.anuke.mindustry.IOSLauncher'
|
||||||
props['app.executable'] = 'IOSLauncher'
|
props['app.executable'] = 'IOSLauncher'
|
||||||
props['app.name'] = 'Mindustry'
|
props['app.name'] = 'Mindustry'
|
||||||
props['app.build'] = (!props.hasProperty("app.build") ? 40 : props['app.build'].toInteger() + 1)+""
|
}
|
||||||
|
|
||||||
|
props['app.build'] = (!props.containsKey("app.build") ? 40 : props['app.build'].toInteger() + 1) + ""
|
||||||
props.store(vfile.newWriter(), null)
|
props.store(vfile.newWriter(), null)
|
||||||
}
|
}
|
||||||
|
|
||||||
build.dependsOn(incrementConfig)
|
|
||||||
build.dependsOn(copyGen)
|
|
||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
implementation project(":kryonet")
|
compileOnly project(":annotations")
|
||||||
|
|
||||||
|
compile arcModule("backends:backend-robovm")
|
||||||
|
|
||||||
compile "com.mobidevelop.robovm:robovm-rt:$roboVMVersion"
|
compile "com.mobidevelop.robovm:robovm-rt:$roboVMVersion"
|
||||||
compile "com.mobidevelop.robovm:robovm-cocoatouch:$roboVMVersion"
|
compile "com.mobidevelop.robovm:robovm-cocoatouch:$roboVMVersion"
|
||||||
compile "com.badlogicgames.gdx:gdx-backend-robovm:$gdxVersion"
|
|
||||||
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios"
|
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios"
|
||||||
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-ios"
|
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-ios"
|
||||||
compileOnly project(":annotations")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":core"){
|
project(":core"){
|
||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
task finish {
|
task preGen{
|
||||||
|
outputs.upToDateWhen{ false }
|
||||||
generateLocales()
|
generateLocales()
|
||||||
|
writeVersion()
|
||||||
|
}
|
||||||
|
|
||||||
|
task copyChangelog{
|
||||||
|
doLast{
|
||||||
|
def props = loadVersionProps()
|
||||||
|
def androidVersion = props['androidBuildCode'].toInteger() - 2
|
||||||
|
def buildVersion = props["build"]
|
||||||
|
def loglines = file("../changelog").text.split("\n")
|
||||||
|
def maxLength = 460
|
||||||
|
|
||||||
|
def androidLogList = loglines.findAll{ line -> !line.endsWith("]") || line.endsWith("[Mobile]") || line.endsWith("[Android]")}
|
||||||
|
def result = ""
|
||||||
|
androidLogList.forEach({line ->
|
||||||
|
if(result.length() + line.length() + 1 < maxLength){
|
||||||
|
result += line + "\n"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
def changelogs = file("../fastlane/metadata/android/en-US/changelogs/")
|
||||||
|
new File(changelogs, buildVersion + ".txt").text = (result)
|
||||||
|
new File(changelogs, androidVersion + ".txt").text = (result)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
build.finalizedBy(finish)
|
if(System.properties["user.name"] == "anuke"){
|
||||||
|
task cleanGen{
|
||||||
def comp = System.properties["release"] == null || System.properties["release"] == "false"
|
doFirst{
|
||||||
if(!comp) println("Note: Compiling release build.")
|
delete{
|
||||||
|
delete "../core/src/io/anuke/mindustry/gen/"
|
||||||
if(new File(projectDir.parent, '../uCore').exists() && comp){
|
}
|
||||||
compile project(":uCore")
|
}
|
||||||
}else{
|
|
||||||
compile "com.github.anuken:ucore:$uCoreVersion"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(new File(projectDir.parent, '../GDXGifRecorder').exists() && comp) {
|
task copyGen{
|
||||||
compile project(":GDXGifRecorder")
|
doLast{
|
||||||
|
copy{
|
||||||
|
from("../core/build/generated/sources/annotationProcessor/java/main/io/anuke/mindustry/gen"){
|
||||||
|
include "**/*.java"
|
||||||
}
|
}
|
||||||
|
|
||||||
compile "com.badlogicgames.gdx:gdx:$gdxVersion"
|
into "../core/src/io/anuke/mindustry/gen"
|
||||||
compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion"
|
}
|
||||||
compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
compileJava.dependsOn(cleanGen)
|
||||||
|
compileJava.finalizedBy(copyGen)
|
||||||
|
}
|
||||||
|
|
||||||
|
compileJava.dependsOn(preGen)
|
||||||
|
|
||||||
|
compile "org.lz4:lz4-java:1.4.1"
|
||||||
|
compile arcModule("arc-core")
|
||||||
|
compile arcModule("extensions:freetype")
|
||||||
|
compile arcModule("extensions:arcnet")
|
||||||
|
compile "org.mozilla:rhino:1.7.11"
|
||||||
|
if(localArc() && debugged()) compile arcModule("extensions:recorder")
|
||||||
|
|
||||||
compileOnly project(":annotations")
|
compileOnly project(":annotations")
|
||||||
annotationProcessor project(":annotations")
|
annotationProcessor project(":annotations")
|
||||||
@@ -188,18 +268,9 @@ project(":core") {
|
|||||||
project(":server"){
|
project(":server"){
|
||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
configurations {
|
|
||||||
if(findProject(":android") != null){
|
|
||||||
compile.exclude module: android
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
|
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
compile project(":kryonet")
|
compile arcModule("backends:backend-headless")
|
||||||
compile "com.badlogicgames.gdx:gdx-backend-headless:$gdxVersion"
|
|
||||||
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -208,10 +279,10 @@ project(":tests"){
|
|||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
testImplementation project(":core")
|
testImplementation project(":core")
|
||||||
testImplementation('org.junit.jupiter:junit-jupiter-api:5.1.0')
|
testImplementation "org.junit.jupiter:junit-jupiter-params:5.3.1"
|
||||||
testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.1.0')
|
testImplementation "org.junit.jupiter:junit-jupiter-api:5.3.1"
|
||||||
testImplementation "com.badlogicgames.gdx:gdx-backend-headless:$gdxVersion"
|
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.3.1"
|
||||||
testImplementation "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
compile arcModule("backends:backend-headless")
|
||||||
}
|
}
|
||||||
|
|
||||||
test{
|
test{
|
||||||
@@ -225,6 +296,12 @@ project(":tools") {
|
|||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
|
|
||||||
|
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
||||||
|
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
|
||||||
|
compile "org.reflections:reflections:0.9.11"
|
||||||
|
|
||||||
|
compile arcModule("backends:backend-sdl")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,16 +310,27 @@ project(":annotations") {
|
|||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
compile 'com.squareup:javapoet:1.11.0'
|
compile 'com.squareup:javapoet:1.11.0'
|
||||||
|
compile files("${System.getProperty('java.home')}/../lib/tools.jar")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":kryonet") {
|
task deployAll{
|
||||||
apply plugin: "java"
|
task cleanDeployOutput{
|
||||||
|
doFirst{
|
||||||
|
if("${getBuildVersion()}" == "custom build" || "${getBuildVersion()}" == "") throw new IllegalArgumentException("----\n\nSET A BUILD NUMBER FIRST!\n\n----")
|
||||||
|
if(!project.hasProperty("release")) throw new IllegalArgumentException("----\n\nSET THE RELEASE PROJECT PROPERTY FIRST!\n\n----")
|
||||||
|
|
||||||
dependencies {
|
delete{
|
||||||
compile project(":core")
|
delete "deploy/"
|
||||||
compile "org.lz4:lz4-java:1.4.1"
|
|
||||||
compile 'com.github.Anuken:kryonet:53b10247b1'
|
|
||||||
compile 'com.github.Anuken:WaifUPnP:05eb46bc577fd7674596946ba288c96c0cedd893'
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependsOn cleanDeployOutput
|
||||||
|
dependsOn "desktop:packrLinux64"
|
||||||
|
dependsOn "desktop:packrWindows64"
|
||||||
|
dependsOn "desktop:packrWindows32"
|
||||||
|
dependsOn "desktop:packrMacOS"
|
||||||
|
dependsOn "server:deploy"
|
||||||
|
dependsOn "android:deploy"
|
||||||
|
}
|
||||||
|
|||||||
BIN
core/assets-raw/fonts/EkkamaiNew-Regular.ttf
Normal file
BIN
core/assets-raw/fonts/NanumBarunGothic.ttf
Normal file
BIN
core/assets-raw/fonts/OpenSansEmoji.ttf
Normal file
BIN
core/assets-raw/fonts/font_latin.ttf
Normal file
|
Before Width: | Height: | Size: 121 B After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 312 B After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 111 B After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 217 B After Width: | Height: | Size: 5.4 KiB |
BIN
core/assets-raw/sprites/blocks/defense/mender-top.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
core/assets-raw/sprites/blocks/defense/mender.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 111 B After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 215 B After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 123 B After Width: | Height: | Size: 1.8 KiB |
BIN
core/assets-raw/sprites/blocks/distribution/bridge-arrow.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 83 B After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 93 B After Width: | Height: | Size: 123 B |
|
Before Width: | Height: | Size: 95 B After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 119 B After Width: | Height: | Size: 1.7 KiB |
BIN
core/assets-raw/sprites/blocks/distribution/center.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.2 KiB |