mirror of
https://github.com/nodejs/node-v0.x-archive.git
synced 2026-04-28 03:01:10 -04:00
Compare commits
6509 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a69205346b | ||
|
|
eeb08ca496 | ||
|
|
f82652e68e | ||
|
|
737ba482cb | ||
|
|
650d1355a5 | ||
|
|
15f0e0a596 | ||
|
|
066e97867a | ||
|
|
11d21f5b17 | ||
|
|
0dc2f4f82d | ||
|
|
f59ec645cb | ||
|
|
d55702e73d | ||
|
|
654267609b | ||
|
|
b93a51e3a6 | ||
|
|
10b6156bd2 | ||
|
|
1e9ad1f6a4 | ||
|
|
532f9ffca2 | ||
|
|
23c608ad40 | ||
|
|
faa042b4e4 | ||
|
|
4421bebc36 | ||
|
|
78fe7d0592 | ||
|
|
c421a5e66b | ||
|
|
653d4db71f | ||
|
|
826661f33a | ||
|
|
98a9089f5f | ||
|
|
42f926ece7 | ||
|
|
ccad4c7fbc | ||
|
|
ca3976726b | ||
|
|
c86b3815b5 | ||
|
|
1111880df4 | ||
|
|
1a39380ab4 | ||
|
|
7f52ee086a | ||
|
|
0b9bdb2bc7 | ||
|
|
a0837fd32e | ||
|
|
8a3d0c8b91 | ||
|
|
bf16141eeb | ||
|
|
6fad535c63 | ||
|
|
01626461e3 | ||
|
|
c1a1ab0677 | ||
|
|
71091f78f2 | ||
|
|
ba0ed00b5f | ||
|
|
4dc5b13861 | ||
|
|
600cd28167 | ||
|
|
0801a18890 | ||
|
|
49dcab933b | ||
|
|
b36aab16f0 | ||
|
|
c67f8d0500 | ||
|
|
f2f893b2a7 | ||
|
|
b2587b2678 | ||
|
|
1a95ce5214 | ||
|
|
84bb0ec613 | ||
|
|
2c41a80282 | ||
|
|
d5959c5cea | ||
|
|
3446157269 | ||
|
|
95871ac1db | ||
|
|
9c5812574f | ||
|
|
5c3c2ed945 | ||
|
|
d7a5f96fa5 | ||
|
|
67a4cb4fe8 | ||
|
|
80fb580936 | ||
|
|
277a2545d2 | ||
|
|
116d6c4402 | ||
|
|
4d809e297f | ||
|
|
532d9929c7 | ||
|
|
ecf9f606c9 | ||
|
|
a6a1659d85 | ||
|
|
426cbedb44 | ||
|
|
0b70a14abf | ||
|
|
7189b3ed33 | ||
|
|
be770a3839 | ||
|
|
f26362e938 | ||
|
|
50ba0f27d9 | ||
|
|
d032ff4954 | ||
|
|
d879042860 | ||
|
|
522668b5d9 | ||
|
|
82357b87eb | ||
|
|
fafb67c65b | ||
|
|
f8ae4446ee | ||
|
|
33e8e694e8 | ||
|
|
7b92b301fa | ||
|
|
530d8c05d4 | ||
|
|
ff540e19a4 | ||
|
|
b0e7dbf2c0 | ||
|
|
f9a0140ef1 | ||
|
|
22d3eff8f4 | ||
|
|
ef94521909 | ||
|
|
9d45b945f7 | ||
|
|
3267464586 | ||
|
|
3f38069acf | ||
|
|
01bff7e7a7 | ||
|
|
48521f1220 | ||
|
|
e10c75579b | ||
|
|
73be4608d9 | ||
|
|
987338fe31 | ||
|
|
c9dcf5718c | ||
|
|
3e2be6f39f | ||
|
|
aec6e93931 | ||
|
|
2e1ebbf2c5 | ||
|
|
82ad5fbe9a | ||
|
|
6dcadb9fc8 | ||
|
|
c4f418d035 | ||
|
|
2810b1ab00 | ||
|
|
e4d97b1dca | ||
|
|
255bc945c2 | ||
|
|
13897279ae | ||
|
|
ccf2712ee5 | ||
|
|
8caf6572b6 | ||
|
|
53978bdf42 | ||
|
|
5aef65a98a | ||
|
|
a86ebbe288 | ||
|
|
6b99fd2323 | ||
|
|
8d14668992 | ||
|
|
5fe05464cb | ||
|
|
9a488a667c | ||
|
|
1a87776be9 | ||
|
|
5abde8161a | ||
|
|
65249ccd9b | ||
|
|
72dd3b4e25 | ||
|
|
34131af606 | ||
|
|
7f6054ca81 | ||
|
|
13d86a86d6 | ||
|
|
d7bf7ed993 | ||
|
|
1c32eb4ae2 | ||
|
|
9c2c845463 | ||
|
|
4598a4c6dd | ||
|
|
f05cf3bea7 | ||
|
|
2c4eef0d97 | ||
|
|
4d32fc5964 | ||
|
|
1c35ee8695 | ||
|
|
7295bb9435 | ||
|
|
31583be042 | ||
|
|
e70d1bfe64 | ||
|
|
30e237041d | ||
|
|
08ac9fe016 | ||
|
|
498200b87c | ||
|
|
6b4a93577b | ||
|
|
a6b8f63660 | ||
|
|
45024e7b75 | ||
|
|
f3e78bd3c2 | ||
|
|
4c9de9d716 | ||
|
|
4fa3fd1cc0 | ||
|
|
8e37a589a6 | ||
|
|
be54423782 | ||
|
|
6d9ee4b184 | ||
|
|
1388171d96 | ||
|
|
daf4666963 | ||
|
|
c4b080f82d | ||
|
|
c50c33e939 | ||
|
|
ed825f4888 | ||
|
|
aa742ddf80 | ||
|
|
7a2ae4c930 | ||
|
|
ad6769fc92 | ||
|
|
872cb0d7fa | ||
|
|
50e88d0b66 | ||
|
|
acc085e131 | ||
|
|
44ceb5d8f5 | ||
|
|
a7cc53067d | ||
|
|
c2e71dd51d | ||
|
|
54740c8b24 | ||
|
|
6738e68592 | ||
|
|
d30e76e0e8 | ||
|
|
9d0103d22e | ||
|
|
0c867ae618 | ||
|
|
5a19c07c08 | ||
|
|
ba407ce410 | ||
|
|
04adf0e5a1 | ||
|
|
496c0bd936 | ||
|
|
53b826e6ae | ||
|
|
827b2a9b0b | ||
|
|
45cdb0e4c1 | ||
|
|
953673424a | ||
|
|
a18507ce11 | ||
|
|
1c9c6277d5 | ||
|
|
b09f97068e | ||
|
|
d65832ccd0 | ||
|
|
6e97b2cc17 | ||
|
|
65d824b488 | ||
|
|
92e92b0215 | ||
|
|
c79fd0e167 | ||
|
|
276245d26f | ||
|
|
e5649d4b3d | ||
|
|
22965da799 | ||
|
|
4d0fcd515f | ||
|
|
6772308883 | ||
|
|
acad8d9a77 | ||
|
|
c9f2531ae0 | ||
|
|
83161455bd | ||
|
|
122ac4e1f2 | ||
|
|
e773be6f90 | ||
|
|
9f51fd6b84 | ||
|
|
fdf91afb49 | ||
|
|
121ed91331 | ||
|
|
4cb17cb219 | ||
|
|
fb5c7f03a0 | ||
|
|
db008f7cce | ||
|
|
bb867c0fa6 | ||
|
|
7716828166 | ||
|
|
b3bfb6fbb6 | ||
|
|
9b22944b68 | ||
|
|
44dd2c392a | ||
|
|
326bce91d6 | ||
|
|
5f0a10ad21 | ||
|
|
7fe1671727 | ||
|
|
54e88b3d61 | ||
|
|
4379e49818 | ||
|
|
b00527fcf0 | ||
|
|
45a13d9674 | ||
|
|
d130bb060e | ||
|
|
648e38771e | ||
|
|
d269f7e48c | ||
|
|
ff4c974873 | ||
|
|
e1bdde05c7 | ||
|
|
822e13d375 | ||
|
|
c7b2e29e5e | ||
|
|
4b8629db37 | ||
|
|
28e6403a56 | ||
|
|
de0303d3ad | ||
|
|
82a72e9591 | ||
|
|
f34f1e30a6 | ||
|
|
626db18635 | ||
|
|
76a6c4bf2e | ||
|
|
29d12c7342 | ||
|
|
7413df0c1f | ||
|
|
b6b881378a | ||
|
|
49f0f618a9 | ||
|
|
9fa953d3e7 | ||
|
|
844a0058d0 | ||
|
|
de18e29784 | ||
|
|
82df345fbb | ||
|
|
627f0d27e8 | ||
|
|
cca15e8e33 | ||
|
|
1205734e69 | ||
|
|
28b0cc08b8 | ||
|
|
a7b5938715 | ||
|
|
4a23add90f | ||
|
|
b1e78cef09 | ||
|
|
323bbdb0cb | ||
|
|
58db21e6c5 | ||
|
|
b3536ae0a8 | ||
|
|
d411622814 | ||
|
|
38c72d4e29 | ||
|
|
218f08dbde | ||
|
|
99b2368a6c | ||
|
|
6a128e037e | ||
|
|
87518f1e3c | ||
|
|
eec8c2edaf | ||
|
|
be5a8e24c2 | ||
|
|
8c5f269f90 | ||
|
|
59c166cfba | ||
|
|
f826b3269d | ||
|
|
fbb0ee6f24 | ||
|
|
bf0bc3565b | ||
|
|
b0d04ffbd8 | ||
|
|
f624be4093 | ||
|
|
b90c1502e5 | ||
|
|
3b7312d23a | ||
|
|
f1722a280c | ||
|
|
fa912c246c | ||
|
|
d3e818cf8f | ||
|
|
33a5c8a814 | ||
|
|
c08320c957 | ||
|
|
dcc01df968 | ||
|
|
9877b8f414 | ||
|
|
a9429052c2 | ||
|
|
e1f39468fa | ||
|
|
b5db5fc9dc | ||
|
|
ec03c47c19 | ||
|
|
8ca44f9928 | ||
|
|
37869f1c9a | ||
|
|
02897bd8de | ||
|
|
0bc273da4f | ||
|
|
d05d6a35b6 | ||
|
|
ea2ceb731c | ||
|
|
411d46087f | ||
|
|
2a9a5e2318 | ||
|
|
e0e9f0c15a | ||
|
|
823e807b5b | ||
|
|
62c3879cfa | ||
|
|
202ecbc9c7 | ||
|
|
66638a4435 | ||
|
|
d2fb507556 | ||
|
|
09ac9d0b2c | ||
|
|
3568edf711 | ||
|
|
7651228ab2 | ||
|
|
83d39c8d53 | ||
|
|
d5e9895ce0 | ||
|
|
0f2ed2bc2c | ||
|
|
4a2670740c | ||
|
|
f536eb176b | ||
|
|
4165f736e6 | ||
|
|
0400571676 | ||
|
|
43a2b29182 | ||
|
|
39a0836d5c | ||
|
|
a08271c7a8 | ||
|
|
96ca59fbf3 | ||
|
|
db5c26e3b5 | ||
|
|
07804c7c9a | ||
|
|
1d52968d1d | ||
|
|
25c2940a08 | ||
|
|
451ff1540a | ||
|
|
58a5bc1ec7 | ||
|
|
4870a4e3da | ||
|
|
362189a5d3 | ||
|
|
d80de98e91 | ||
|
|
72d3124841 | ||
|
|
b88c3902b2 | ||
|
|
1c2982b94f | ||
|
|
6e0b8b169c | ||
|
|
e35cec5c05 | ||
|
|
005ae23250 | ||
|
|
41e1b171ec | ||
|
|
54a4c639e9 | ||
|
|
608898c15b | ||
|
|
fb383a0ad0 | ||
|
|
9a3521cb25 | ||
|
|
0087bc6370 | ||
|
|
052e63f27f | ||
|
|
c5e554dc7e | ||
|
|
4899116d4b | ||
|
|
6174ea6b4c | ||
|
|
9f57e422cf | ||
|
|
7dfa587d18 | ||
|
|
7d0543c128 | ||
|
|
d1eff9ab68 | ||
|
|
ea1cba6246 | ||
|
|
37f0eb8df3 | ||
|
|
6c5fdd5223 | ||
|
|
6b9425fe37 | ||
|
|
f347077e78 | ||
|
|
9603f08f21 | ||
|
|
b0d2795fe9 | ||
|
|
355c148427 | ||
|
|
a57d31595d | ||
|
|
dec16aa5c2 | ||
|
|
0ef1e5b5eb | ||
|
|
ef3617c6f8 | ||
|
|
2418434568 | ||
|
|
2786737417 | ||
|
|
84590f3fe9 | ||
|
|
2d0c1da975 | ||
|
|
752ac320ae | ||
|
|
59011448c0 | ||
|
|
7142b260c6 | ||
|
|
f8fd9aca8b | ||
|
|
985fdf2cb3 | ||
|
|
6c371c6a8c | ||
|
|
31ddd9516e | ||
|
|
1eab51412f | ||
|
|
45cd4e211e | ||
|
|
81b711ba0b | ||
|
|
422772f23b | ||
|
|
1597ce0eb3 | ||
|
|
99ad52ecbe | ||
|
|
0407ecfcfb | ||
|
|
0ccdedab79 | ||
|
|
0ee1760ee1 | ||
|
|
f90c9ce0e2 | ||
|
|
a299c97bbc | ||
|
|
c259499945 | ||
|
|
ee200942dd | ||
|
|
2e1f2b535e | ||
|
|
2f1985ca7d | ||
|
|
024f4b12a5 | ||
|
|
2bcb9ab7bc | ||
|
|
badbd1af27 | ||
|
|
7c75ca7182 | ||
|
|
ef0ca2affd | ||
|
|
2d9239359d | ||
|
|
d38d7bea6c | ||
|
|
b1ffbdc975 | ||
|
|
0844e2359b | ||
|
|
be3a77bd42 | ||
|
|
9918e5d4f6 | ||
|
|
9263213d8e | ||
|
|
e8fd808dfb | ||
|
|
060141c58a | ||
|
|
b7223abbdc | ||
|
|
73976b6c9d | ||
|
|
226d37bb68 | ||
|
|
f9df96b950 | ||
|
|
c0558ff774 | ||
|
|
073c7b4d08 | ||
|
|
25de1c1feb | ||
|
|
b6cf0454a9 | ||
|
|
f640c5d35c | ||
|
|
24ff8f4c79 | ||
|
|
86778607c9 | ||
|
|
afa57799e4 | ||
|
|
15c6c0eecc | ||
|
|
3ccee08759 | ||
|
|
2c13cbbc0b | ||
|
|
bcb5bdebe7 | ||
|
|
786e1e8712 | ||
|
|
100e163dda | ||
|
|
9f26130a0e | ||
|
|
6b18e88b68 | ||
|
|
4ef808ec0a | ||
|
|
64ac54a64d | ||
|
|
c82e2889e8 | ||
|
|
e8bc2edabf | ||
|
|
e8834dc1a1 | ||
|
|
0544a586ca | ||
|
|
f11a3dfcd6 | ||
|
|
093be8b16b | ||
|
|
caf69aa91a | ||
|
|
9badc002b4 | ||
|
|
a23df7710a | ||
|
|
cc6034ac86 | ||
|
|
dc818135a5 | ||
|
|
8b11f29cf3 | ||
|
|
dc9ae01ef7 | ||
|
|
eadc2ec5c8 | ||
|
|
bd10bf4418 | ||
|
|
42aac41b93 | ||
|
|
7a9db6cfb1 | ||
|
|
6bdd4d0205 | ||
|
|
bc7479d232 | ||
|
|
4ff56aa15e | ||
|
|
7bb814f9db | ||
|
|
93be4ffd4b | ||
|
|
3254caceef | ||
|
|
f4a4ef7a2d | ||
|
|
b48684c6f1 | ||
|
|
a7f3288a87 | ||
|
|
57f785151a | ||
|
|
110e499fe7 | ||
|
|
b21c8e0bfd | ||
|
|
5fdeebd94d | ||
|
|
585388bbd8 | ||
|
|
575c12bba3 | ||
|
|
02dae998c3 | ||
|
|
2bee3aeee9 | ||
|
|
9b86a4453f | ||
|
|
2dd710e7ea | ||
|
|
9315377693 | ||
|
|
37537d5720 | ||
|
|
f5c07b65a0 | ||
|
|
50e00de92a | ||
|
|
34c750d7a9 | ||
|
|
6db9e12de5 | ||
|
|
53f3b128f5 | ||
|
|
f1fba8d1f5 | ||
|
|
23f09d7e02 | ||
|
|
fd56981b4c | ||
|
|
fe659a6017 | ||
|
|
f70be41d80 | ||
|
|
cccce60b3e | ||
|
|
285a46d1ca | ||
|
|
af699c47d1 | ||
|
|
2981f01b46 | ||
|
|
9e2319f977 | ||
|
|
80ab9a891a | ||
|
|
de16da532e | ||
|
|
2eb6a62f4f | ||
|
|
f8dab6acb6 | ||
|
|
5b37da2ac0 | ||
|
|
b3cf3f35fc | ||
|
|
72bc4dcda4 | ||
|
|
aa0650f444 | ||
|
|
879d329a5a | ||
|
|
d559bed0d5 | ||
|
|
f70b138fcb | ||
|
|
90efdb3a5b | ||
|
|
b0c0111b04 | ||
|
|
9eddaebb79 | ||
|
|
b207e24bcd | ||
|
|
3d34590fba | ||
|
|
32141844f1 | ||
|
|
8656c2654e | ||
|
|
f98562fcd7 | ||
|
|
7fd3cb666b | ||
|
|
5809426d75 | ||
|
|
1513848f88 | ||
|
|
e4c9c9f412 | ||
|
|
2c487669f7 | ||
|
|
f4f0daa44d | ||
|
|
0a0002b480 | ||
|
|
43a0c88116 | ||
|
|
688859afc0 | ||
|
|
e06b5d7af7 | ||
|
|
bc30c90af6 | ||
|
|
42c6952edb | ||
|
|
50122fed8a | ||
|
|
5950db197c | ||
|
|
4aa09d1e0e | ||
|
|
e43fe5c833 | ||
|
|
eb2ca10462 | ||
|
|
53716eb0b5 | ||
|
|
1fa0bca2ad | ||
|
|
d9057cc090 | ||
|
|
f6484842b3 | ||
|
|
02ff9741cc | ||
|
|
4439f7b879 | ||
|
|
60bf2d6cb3 | ||
|
|
0c91b0e48e | ||
|
|
845b9e92d8 | ||
|
|
b2648934f0 | ||
|
|
5a5e128165 | ||
|
|
98b1ce91f6 | ||
|
|
beb7425c18 | ||
|
|
f6f2d42ee9 | ||
|
|
e8af340557 | ||
|
|
e1fb7b76e9 | ||
|
|
648fdc56a0 | ||
|
|
868ffed77c | ||
|
|
a0a0062d61 | ||
|
|
7397ab2cf1 | ||
|
|
c383befd25 | ||
|
|
d6b78d0e37 | ||
|
|
19aa05fab8 | ||
|
|
23dc099299 | ||
|
|
8721667a2f | ||
|
|
ef1b7dd3d7 | ||
|
|
9d4362403c | ||
|
|
acbfc40888 | ||
|
|
713b9249e1 | ||
|
|
3a6314dbe1 | ||
|
|
5d97d72753 | ||
|
|
c6bb361b84 | ||
|
|
202df30aab | ||
|
|
d2e40f66cc | ||
|
|
b6e916db58 | ||
|
|
1d99441d37 | ||
|
|
b40f813bab | ||
|
|
bf561c52a5 | ||
|
|
952e513379 | ||
|
|
17061d981e | ||
|
|
ae5a209b11 | ||
|
|
fecebe1dbf | ||
|
|
8146f2e607 | ||
|
|
71078f91ed | ||
|
|
a4da6300c8 | ||
|
|
9547ee90db | ||
|
|
6530310ed5 | ||
|
|
2a8380ce57 | ||
|
|
f4369d76c8 | ||
|
|
fba1e48fae | ||
|
|
63c2391984 | ||
|
|
5b5362aa8d | ||
|
|
bf539f9bfd | ||
|
|
d3d83d7b90 | ||
|
|
26f1bc8e8c | ||
|
|
cc6084b9ac | ||
|
|
c4e9226bdb | ||
|
|
1c1ad9bcf4 | ||
|
|
5b5c8b6005 | ||
|
|
3e5139fd2f | ||
|
|
c6843f40c8 | ||
|
|
c49888bd84 | ||
|
|
59a40fc8ed | ||
|
|
559a98f0d7 | ||
|
|
7accaeb490 | ||
|
|
8a9e8d60d2 | ||
|
|
2297d638c1 | ||
|
|
a9b0bcfafe | ||
|
|
c7bc4cacde | ||
|
|
4cfdc57712 | ||
|
|
7e7d5d38ea | ||
|
|
0b0b72c2fa | ||
|
|
e5bb8391a8 | ||
|
|
93d4259cf0 | ||
|
|
e11b6b8f75 | ||
|
|
ed7fb149a2 | ||
|
|
0dba28b5c2 | ||
|
|
0c47219a72 | ||
|
|
9126dd2d90 | ||
|
|
6a11f3edf4 | ||
|
|
4fbe7a5fab | ||
|
|
fc4e12b8f1 | ||
|
|
5da78905a6 | ||
|
|
b1cce04646 | ||
|
|
b731c96679 | ||
|
|
a0add91987 | ||
|
|
a25a27817f | ||
|
|
b53cd9798f | ||
|
|
f78ce087ba | ||
|
|
f315029268 | ||
|
|
7e5aeac28f | ||
|
|
b9abb64fbb | ||
|
|
bc71874262 | ||
|
|
cb64adaadc | ||
|
|
2134aa3d5c | ||
|
|
40f70673c6 | ||
|
|
b919e29871 | ||
|
|
5193d59219 | ||
|
|
103921dac0 | ||
|
|
1747eeff1a | ||
|
|
3e0757c101 | ||
|
|
3644b0bc96 | ||
|
|
c721604d25 | ||
|
|
f2a9ed4873 | ||
|
|
3ea2a618ad | ||
|
|
37bdd36d70 | ||
|
|
6531f187d8 | ||
|
|
be3afd0bec | ||
|
|
d5f13f6c08 | ||
|
|
9e72b7b65c | ||
|
|
0cdeb8ed96 | ||
|
|
f00c8bcef8 | ||
|
|
21aa0df8b2 | ||
|
|
1e50282ae8 | ||
|
|
69f594d22c | ||
|
|
10448487e5 | ||
|
|
401ff10295 | ||
|
|
06c82c5069 | ||
|
|
07e5877144 | ||
|
|
f60def5e9a | ||
|
|
74872b0dc9 | ||
|
|
3d51646c4b | ||
|
|
41a4b734d3 | ||
|
|
3f932c52b0 | ||
|
|
d7825b3c1d | ||
|
|
7823474022 | ||
|
|
b07b391304 | ||
|
|
5feea97b53 | ||
|
|
8b8a7a7f9b | ||
|
|
9a7158de18 | ||
|
|
839bf025a8 | ||
|
|
8a946c2ee7 | ||
|
|
38250f6403 | ||
|
|
1b114162ab | ||
|
|
2603cc564d | ||
|
|
d34fea59e1 | ||
|
|
91835966eb | ||
|
|
5565366a33 | ||
|
|
a1b274108f | ||
|
|
399731e3a0 | ||
|
|
2dccebd4b8 | ||
|
|
3bab12197f | ||
|
|
de89bbb00c | ||
|
|
441e792849 | ||
|
|
6014a62b3e | ||
|
|
ff2a1b86c3 | ||
|
|
38250f9aef | ||
|
|
9df5fda777 | ||
|
|
8f1a38d916 | ||
|
|
ddf52bd347 | ||
|
|
c6f7fd7e47 | ||
|
|
5ec056633f | ||
|
|
af52bc4fe6 | ||
|
|
fce7c958ed | ||
|
|
8988af58f4 | ||
|
|
48c3d20041 | ||
|
|
5b39929d47 | ||
|
|
260695afd0 | ||
|
|
6e5217d320 | ||
|
|
1bf704a571 | ||
|
|
8708bb0280 | ||
|
|
ef1ffcb717 | ||
|
|
f0ce98441f | ||
|
|
d98a8578d6 | ||
|
|
09150b0616 | ||
|
|
ae7a3cddae | ||
|
|
57d53a47e8 | ||
|
|
81a889fd88 | ||
|
|
6b8ae8e66d | ||
|
|
6b26583e84 | ||
|
|
fe464a2fea | ||
|
|
1d3d02c70d | ||
|
|
7887e68ff7 | ||
|
|
e4017402ef | ||
|
|
fbc2ad5815 | ||
|
|
26b11915b1 | ||
|
|
7a4dfb6aa8 | ||
|
|
3795d77113 | ||
|
|
41d5fefc10 | ||
|
|
a72120190a | ||
|
|
f105f2f2fd | ||
|
|
252f034b30 | ||
|
|
067be2b3fe | ||
|
|
3f687dbddf | ||
|
|
5e1d844f3d | ||
|
|
6ba1c625cd | ||
|
|
8a6ef65c2c | ||
|
|
7282ce9014 | ||
|
|
f94b85db83 | ||
|
|
bf682afb98 | ||
|
|
8966480c0e | ||
|
|
7de6eba061 | ||
|
|
edb62dd902 | ||
|
|
10fa526fa0 | ||
|
|
5cfe0b86d5 | ||
|
|
dd1c3d72e2 | ||
|
|
1b22f5376b | ||
|
|
f405517de1 | ||
|
|
1df222f179 | ||
|
|
de65ba7aba | ||
|
|
196207c228 | ||
|
|
0ef6cfd39b | ||
|
|
d0111aa0c4 | ||
|
|
0a89e8b838 | ||
|
|
057b80611f | ||
|
|
30ab1f567d | ||
|
|
1b7d23e81e | ||
|
|
f80513974e | ||
|
|
ff552ddbaa | ||
|
|
eef57dddf4 | ||
|
|
ae5b0e1fc1 | ||
|
|
6d70a4ae16 | ||
|
|
3db2e034c4 | ||
|
|
71a2a2caa6 | ||
|
|
b0b707cb6e | ||
|
|
d614d161c7 | ||
|
|
41421ff9da | ||
|
|
55ef9ef680 | ||
|
|
a90bc78534 | ||
|
|
91bf18fcc5 | ||
|
|
3a5798b097 | ||
|
|
e74a733024 | ||
|
|
8a068ce849 | ||
|
|
bc18bf4ec0 | ||
|
|
8d5c1201f2 | ||
|
|
bdd57f0756 | ||
|
|
145612c2f5 | ||
|
|
c49f3b5df6 | ||
|
|
2b15cf57dd | ||
|
|
de2eb600b3 | ||
|
|
1f93aa5d5d | ||
|
|
911b0fddd3 | ||
|
|
1e0ce5d1bd | ||
|
|
c6185c8484 | ||
|
|
a111390c56 | ||
|
|
8ccb3cbdba | ||
|
|
283d735e2b | ||
|
|
e72addcf8e | ||
|
|
032fc42e64 | ||
|
|
c9a1b5d162 | ||
|
|
13400e3e58 | ||
|
|
412c1ab5bc | ||
|
|
00247d53db | ||
|
|
c231321cd3 | ||
|
|
7f896889ba | ||
|
|
a0a5c4c5af | ||
|
|
8bec3febd8 | ||
|
|
f70fa3bae6 | ||
|
|
58b8b3fa07 | ||
|
|
ca003f4f3e | ||
|
|
c2c08196d8 | ||
|
|
dd85a8c183 | ||
|
|
34b0b6a613 | ||
|
|
39d2337859 | ||
|
|
05fe70b582 | ||
|
|
c752f6c013 | ||
|
|
511e328727 | ||
|
|
4a1698c6ba | ||
|
|
54b74b8e85 | ||
|
|
2701a6bd48 | ||
|
|
fac6c69456 | ||
|
|
ac64c9e546 | ||
|
|
48893af7bb | ||
|
|
50464cd4f4 | ||
|
|
09be360a0f | ||
|
|
37d75ba241 | ||
|
|
029e01bb80 | ||
|
|
6a8b5b36b4 | ||
|
|
35a1421e96 | ||
|
|
74c8041fb6 | ||
|
|
e733dc3bc3 | ||
|
|
0187b657ae | ||
|
|
a11bf99ce0 | ||
|
|
0dba4ad0f9 | ||
|
|
5209dad907 | ||
|
|
e4f4c63370 | ||
|
|
b866a96cfa | ||
|
|
10f85fadfe | ||
|
|
b53b8b8ae7 | ||
|
|
8963a5228d | ||
|
|
900196e135 | ||
|
|
a55faeac18 | ||
|
|
cbeeea62cf | ||
|
|
b615077bab | ||
|
|
0385b17ce0 | ||
|
|
408bfece51 | ||
|
|
bb2ce1a108 | ||
|
|
e3a2dd1b13 | ||
|
|
4eb2804db9 | ||
|
|
517cea3636 | ||
|
|
b27a4cbe2a | ||
|
|
094f742657 | ||
|
|
00ba1cbce1 | ||
|
|
6ce013dd4b | ||
|
|
d53cdc5378 | ||
|
|
cfa28690db | ||
|
|
2301eb69b1 | ||
|
|
33be3016fb | ||
|
|
2eb181d28c | ||
|
|
25e8ea17e1 | ||
|
|
1358632e67 | ||
|
|
e9aa57e8bd | ||
|
|
4f235ef87f | ||
|
|
8d9766a9df | ||
|
|
76f6a4abb4 | ||
|
|
5432a1d985 | ||
|
|
54a4f99c4e | ||
|
|
13198357e9 | ||
|
|
284816ee9f | ||
|
|
65242abc3b | ||
|
|
131a67e7ef | ||
|
|
424bca15c8 | ||
|
|
6332a4cf00 | ||
|
|
60b45dcbb6 | ||
|
|
535e109a3a | ||
|
|
77cfbd9f2d | ||
|
|
26f754d9dd | ||
|
|
c08357c32f | ||
|
|
940a6863ea | ||
|
|
569acea0ee | ||
|
|
4b021a3541 | ||
|
|
5046f8501c | ||
|
|
f62441367f | ||
|
|
0435f9b28c | ||
|
|
bd33fea732 | ||
|
|
1fb9cfcdb1 | ||
|
|
43ff46becf | ||
|
|
46b09e4190 | ||
|
|
3116522e7c | ||
|
|
f482236665 | ||
|
|
c45522df4c | ||
|
|
f9abf5e0e2 | ||
|
|
463d6bac8b | ||
|
|
c381662cac | ||
|
|
1285cd9011 | ||
|
|
79d77cfd81 | ||
|
|
b9c5eee7d9 | ||
|
|
5f41140535 | ||
|
|
debf552ed2 | ||
|
|
e5d3ea7771 | ||
|
|
28e851c169 | ||
|
|
c69d7f1a6c | ||
|
|
cb76999bad | ||
|
|
0a2076b26a | ||
|
|
27061cc9f4 | ||
|
|
cc0e7efb37 | ||
|
|
208d1715a7 | ||
|
|
0742f5629c | ||
|
|
b9e40fbaac | ||
|
|
cc36cc5999 | ||
|
|
4f6882e898 | ||
|
|
01432403af | ||
|
|
04e484c484 | ||
|
|
f0a561fe67 | ||
|
|
7161ecd31b | ||
|
|
0699f5bfb4 | ||
|
|
943448772e | ||
|
|
e2126e05e7 | ||
|
|
3b6a00b664 | ||
|
|
e0f5d8e86d | ||
|
|
eabf3c8d0f | ||
|
|
7946ad2634 | ||
|
|
cbdf3393a2 | ||
|
|
0262b6d2a5 | ||
|
|
9a998d5e24 | ||
|
|
9fe39ede9f | ||
|
|
8a52a16847 | ||
|
|
434404e3bb | ||
|
|
af98fc9d5f | ||
|
|
30a0e58d63 | ||
|
|
ccc854d14e | ||
|
|
b337577cf1 | ||
|
|
dc8b488bbe | ||
|
|
a9e40281e7 | ||
|
|
761e0c460a | ||
|
|
2ae9b69871 | ||
|
|
fa9aa1c961 | ||
|
|
782277f11a | ||
|
|
8a411bae66 | ||
|
|
719376730d | ||
|
|
0bd410a66a | ||
|
|
f721d02c8a | ||
|
|
c96df0e37a | ||
|
|
0fd2834539 | ||
|
|
1f3e4a76f9 | ||
|
|
82bcdbb8aa | ||
|
|
1fc2c3823c | ||
|
|
578f69bcf4 | ||
|
|
5ff2ae8389 | ||
|
|
7535e3930a | ||
|
|
24de89bd0e | ||
|
|
b4ed3c1969 | ||
|
|
66e12dbd69 | ||
|
|
078763a94c | ||
|
|
39e25528eb | ||
|
|
a2fcc47772 | ||
|
|
f079c0bd9f | ||
|
|
1358bac6d1 | ||
|
|
dff467d982 | ||
|
|
6e435da7f9 | ||
|
|
0888cdd412 | ||
|
|
989ae81c71 | ||
|
|
039fac633e | ||
|
|
a608f65b24 | ||
|
|
3f69c71157 | ||
|
|
2b9967fbcc | ||
|
|
45de259b43 | ||
|
|
81a4edcf6a | ||
|
|
968b49ba0a | ||
|
|
7865c5c51d | ||
|
|
ca642b020d | ||
|
|
75670d3f63 | ||
|
|
d0c010e39b | ||
|
|
b48f7f7eac | ||
|
|
a039bad299 | ||
|
|
18b94ea838 | ||
|
|
ccc4e547ea | ||
|
|
1a2255ab44 | ||
|
|
ee6c11876a | ||
|
|
a3753b496e | ||
|
|
9fc7283a40 | ||
|
|
c393853b4e | ||
|
|
564172510d | ||
|
|
3b95d88bf2 | ||
|
|
2cca7488bf | ||
|
|
3f3f958c14 | ||
|
|
4099d1eeba | ||
|
|
05b81f333c | ||
|
|
1665b4a2a3 | ||
|
|
dfcdd5b8aa | ||
|
|
643f00d3f9 | ||
|
|
faa4d9ff5f | ||
|
|
c9676c9147 | ||
|
|
9ae6d8fee3 | ||
|
|
f8519e10b8 | ||
|
|
9611354f08 | ||
|
|
e813e3491e | ||
|
|
88d7a10128 | ||
|
|
5f0406534c | ||
|
|
636add246c | ||
|
|
5164ae3838 | ||
|
|
01103d077b | ||
|
|
a98e845516 | ||
|
|
f19f980724 | ||
|
|
2498d15dde | ||
|
|
a3908f47f1 | ||
|
|
4ec77e2e28 | ||
|
|
f66f793c07 | ||
|
|
25aea2a072 | ||
|
|
d2eaabd0df | ||
|
|
4bc1d395de | ||
|
|
8068f9bf38 | ||
|
|
14a5b45c06 | ||
|
|
ea4b1c1c0c | ||
|
|
9b42d7daaf | ||
|
|
fb7348ae06 | ||
|
|
dceebbfa31 | ||
|
|
49f16c4575 | ||
|
|
d40415912f | ||
|
|
bd907174e8 | ||
|
|
a475e62a3e | ||
|
|
d91004a73d | ||
|
|
d8351a2ef4 | ||
|
|
5f9ffa17b1 | ||
|
|
38542f76a9 | ||
|
|
9239088e87 | ||
|
|
07d8a4650e | ||
|
|
884499d37e | ||
|
|
a811a4a130 | ||
|
|
cc8cfb145a | ||
|
|
12fc9fa8a7 | ||
|
|
68f63fe9ec | ||
|
|
928d28a7b3 | ||
|
|
52f0c37d09 | ||
|
|
07be9fc3a6 | ||
|
|
493beb23f2 | ||
|
|
3883f22ad1 | ||
|
|
bf9d8e9214 | ||
|
|
814033365b | ||
|
|
5979f096d1 | ||
|
|
e85927119c | ||
|
|
7d2e68fdbd | ||
|
|
b673d0670f | ||
|
|
ee437c0557 | ||
|
|
4624cf1214 | ||
|
|
27ddd14e9f | ||
|
|
726ebad9bc | ||
|
|
0e57aafbb1 | ||
|
|
4ddafbd563 | ||
|
|
7f68f256cf | ||
|
|
bb675baaa9 | ||
|
|
29b2fdb0c5 | ||
|
|
78e831a31c | ||
|
|
8c758e127c | ||
|
|
b4fbf6d275 | ||
|
|
e02af94947 | ||
|
|
1eb9fc5f33 | ||
|
|
34f05a3195 | ||
|
|
33a9ac6087 | ||
|
|
1858d1c340 | ||
|
|
3d84c3db25 | ||
|
|
1930772693 | ||
|
|
792d9a921d | ||
|
|
9f3c639a9c | ||
|
|
40c4beeb57 | ||
|
|
5871c81181 | ||
|
|
ceb51ddaa1 | ||
|
|
eaf607e88b | ||
|
|
8cd2b0e778 | ||
|
|
a62dd44b20 | ||
|
|
c1bf810108 | ||
|
|
cd8f82c007 | ||
|
|
436a9b69f3 | ||
|
|
c33d3174b8 | ||
|
|
01d146c29f | ||
|
|
1de43149bb | ||
|
|
a9fc63f7a1 | ||
|
|
0abe42a0f4 | ||
|
|
e63c7821d5 | ||
|
|
e4dd8dc28e | ||
|
|
5eac8d6739 | ||
|
|
2f93eb6102 | ||
|
|
0a414f4caa | ||
|
|
9164fa6aaa | ||
|
|
992e3464b8 | ||
|
|
fbe143d9cb | ||
|
|
4ced23deaf | ||
|
|
711ecdd54f | ||
|
|
aaf0453b7c | ||
|
|
719cd461d3 | ||
|
|
ab60efb535 | ||
|
|
d1effbb338 | ||
|
|
2fc528ce00 | ||
|
|
62c12d2161 | ||
|
|
ebd0f98e2b | ||
|
|
e3ceee2dce | ||
|
|
91120e0429 | ||
|
|
b7e8e35c0e | ||
|
|
ebbd4039bc | ||
|
|
75f2365558 | ||
|
|
e4a8d2617b | ||
|
|
6f82b9f482 | ||
|
|
df2c5fa81d | ||
|
|
4e290e48b2 | ||
|
|
47d6a94656 | ||
|
|
6b426a2edd | ||
|
|
c9be1d5ffd | ||
|
|
880219645e | ||
|
|
c3898f3c1f | ||
|
|
ee2291eb0d | ||
|
|
fb400b4868 | ||
|
|
bce68134b6 | ||
|
|
bfe9cdb7f2 | ||
|
|
b894521bd2 | ||
|
|
acf19500ee | ||
|
|
9f9c333cbc | ||
|
|
4bd54dad33 | ||
|
|
6ba3e68bd2 | ||
|
|
b45a10818e | ||
|
|
e747daf604 | ||
|
|
94f1feeb59 | ||
|
|
f4403f90f8 | ||
|
|
6cacb9a21e | ||
|
|
e02d5c9d41 | ||
|
|
c9e6d3696c | ||
|
|
f1f5de1c8d | ||
|
|
4e4860579e | ||
|
|
75c6255d16 | ||
|
|
89e311b1ae | ||
|
|
518d28c23a | ||
|
|
a1d193963d | ||
|
|
e5ef103b05 | ||
|
|
35bcb1d6a9 | ||
|
|
1ac05cc5ad | ||
|
|
248f552ab4 | ||
|
|
77c18d1e1b | ||
|
|
3bcbd14bb1 | ||
|
|
d2dd9d108d | ||
|
|
c8a10e97c8 | ||
|
|
db844b152a | ||
|
|
3546383cf0 | ||
|
|
ab072ee416 | ||
|
|
12a90e98bf | ||
|
|
55e4d54927 | ||
|
|
51e66ec410 | ||
|
|
0b75eee364 | ||
|
|
e221cd4a53 | ||
|
|
4e84dfa683 | ||
|
|
70635753a3 | ||
|
|
76de7c0c26 | ||
|
|
f405daa922 | ||
|
|
98b4596a46 | ||
|
|
5648d95c4a | ||
|
|
df6c12cdcc | ||
|
|
6292df659f | ||
|
|
ef3a874f41 | ||
|
|
0b5235e68c | ||
|
|
d9bad09ede | ||
|
|
48cdbffd24 | ||
|
|
ebfb8a5613 | ||
|
|
4359e8154d | ||
|
|
491c8d92b8 | ||
|
|
a64acd8baa | ||
|
|
ea50ebd36d | ||
|
|
e16021340d | ||
|
|
c0a9985da7 | ||
|
|
525253d50e | ||
|
|
da56c72f59 | ||
|
|
27dfb1d4c0 | ||
|
|
77c1cc0482 | ||
|
|
d91ef153e7 | ||
|
|
642945cc00 | ||
|
|
c21c51a6fc | ||
|
|
e67a0f80e0 | ||
|
|
c9a231db0e | ||
|
|
57148f54e1 | ||
|
|
c56d1559fc | ||
|
|
12f77440ef | ||
|
|
ecfe32e3a0 | ||
|
|
605927fbd9 | ||
|
|
3d69bbfa87 | ||
|
|
b12b2b83fc | ||
|
|
33c76f19de | ||
|
|
e5b787e84d | ||
|
|
ecca7525cc | ||
|
|
0fcb124602 | ||
|
|
889cbf9ada | ||
|
|
c2b47097c0 | ||
|
|
7b3fb22290 | ||
|
|
6bb9868271 | ||
|
|
6ed5ef5fe0 | ||
|
|
c8bbd13ea8 | ||
|
|
d2860a6c7d | ||
|
|
20143b359c | ||
|
|
d8b33dc147 | ||
|
|
37fd953378 | ||
|
|
079b81358b | ||
|
|
8559a4ae0f | ||
|
|
8673a4aa25 | ||
|
|
d4ed2e61f7 | ||
|
|
45c1d4f96f | ||
|
|
10ce3d129d | ||
|
|
963459d736 | ||
|
|
a26bee8fa1 | ||
|
|
db45b2ca02 | ||
|
|
e1dd570585 | ||
|
|
35c0cd219d | ||
|
|
91701c2db1 | ||
|
|
88f94fa28c | ||
|
|
ac1aaddc00 | ||
|
|
7407be896e | ||
|
|
80a55e9c83 | ||
|
|
e621250116 | ||
|
|
e28eb6de30 | ||
|
|
327286dbcd | ||
|
|
c5d35aca33 | ||
|
|
9c3559f0ad | ||
|
|
86bd9b6e70 | ||
|
|
718aa505c4 | ||
|
|
7cd1690f3d | ||
|
|
5bc07cc90b | ||
|
|
70005be4ff | ||
|
|
540a441259 | ||
|
|
b4626afb61 | ||
|
|
59e6b14395 | ||
|
|
0f95a93a2c | ||
|
|
0d13142332 | ||
|
|
21d2683976 | ||
|
|
48d52d85c3 | ||
|
|
5d69bbfbdb | ||
|
|
0f74729758 | ||
|
|
0c0f13eda4 | ||
|
|
69ca83f755 | ||
|
|
0a83b78ba8 | ||
|
|
3f4261276e | ||
|
|
f065c87bcf | ||
|
|
c945eae942 | ||
|
|
7ee15457ed | ||
|
|
d03b80bc12 | ||
|
|
93cefab1a3 | ||
|
|
b7b7b29f50 | ||
|
|
46acb09ed8 | ||
|
|
1444801374 | ||
|
|
16fca262be | ||
|
|
5b43c63c88 | ||
|
|
04271a5e93 | ||
|
|
1c88c3b3b5 | ||
|
|
916b5d1fff | ||
|
|
6cbed959e6 | ||
|
|
2639566c6e | ||
|
|
3694b6914a | ||
|
|
0f9d201183 | ||
|
|
30e7fb7307 | ||
|
|
aa5961a445 | ||
|
|
e9dcfd4bd2 | ||
|
|
3ec84a11f8 | ||
|
|
9b7a6c5238 | ||
|
|
fdeeabba78 | ||
|
|
e0660740d9 | ||
|
|
3ba9519faf | ||
|
|
8b82abb953 | ||
|
|
d0365fd21f | ||
|
|
7b71fd0c68 | ||
|
|
70a5b53e03 | ||
|
|
0db4dc0024 | ||
|
|
e8067cb685 | ||
|
|
163d3cdf14 | ||
|
|
f160a45b25 | ||
|
|
c75f71dd72 | ||
|
|
06ada03ed9 | ||
|
|
93eca95aec | ||
|
|
45b772d8cb | ||
|
|
08e2e570a7 | ||
|
|
57d722011a | ||
|
|
e81a5e9c9c | ||
|
|
ba055115e0 | ||
|
|
1330419446 | ||
|
|
c9f17305e6 | ||
|
|
cf75619bc3 | ||
|
|
331cd7c251 | ||
|
|
78eb174ea2 | ||
|
|
8652c11031 | ||
|
|
8752ceef13 | ||
|
|
ca8dea83a9 | ||
|
|
aab7cb7dfe | ||
|
|
e28f77cbad | ||
|
|
37ac5e52bf | ||
|
|
b9bfb1bc91 | ||
|
|
0b57fee3f8 | ||
|
|
1042a8d887 | ||
|
|
40b7302af8 | ||
|
|
f178f2ae3f | ||
|
|
d73b257d65 | ||
|
|
b6d6a54f80 | ||
|
|
052aaa4c4d | ||
|
|
3e8857271b | ||
|
|
2728dcc95b | ||
|
|
930fabe43f | ||
|
|
30994aad30 | ||
|
|
55e971e33d | ||
|
|
92c0c6953a | ||
|
|
ffee873941 | ||
|
|
08109367e8 | ||
|
|
01d46f3a20 | ||
|
|
cc15299c32 | ||
|
|
7bdeed2039 | ||
|
|
0965d2d9f6 | ||
|
|
a4a04f932e | ||
|
|
dee8c51547 | ||
|
|
bc834c395b | ||
|
|
1e577f347b | ||
|
|
2726c22f0b | ||
|
|
c26a0b5aab | ||
|
|
90ce5b3d41 | ||
|
|
407181538b | ||
|
|
7c02b5a58d | ||
|
|
1ab95a536a | ||
|
|
1e13a2d242 | ||
|
|
08032efed0 | ||
|
|
a58659cd4a | ||
|
|
9d1fde7519 | ||
|
|
036d907df7 | ||
|
|
3005965266 | ||
|
|
1a49df5fa9 | ||
|
|
9eacf93928 | ||
|
|
f86359cc3f | ||
|
|
32b2964eed | ||
|
|
8d3278b962 | ||
|
|
69ae75c66c | ||
|
|
6aa7f6f732 | ||
|
|
17524432ff | ||
|
|
db0a1dc7d9 | ||
|
|
8c97ad4c30 | ||
|
|
6986d9316c | ||
|
|
b82b4f2993 | ||
|
|
0f0557d78d | ||
|
|
5cda2542fd | ||
|
|
9a70d99980 | ||
|
|
7abbda8ba2 | ||
|
|
6ebe9e0c1d | ||
|
|
304f1fcf86 | ||
|
|
6aa755070a | ||
|
|
11770bf5e2 | ||
|
|
d7c96cf289 | ||
|
|
daa6b95b08 | ||
|
|
5e7cb68be9 | ||
|
|
44eb279ef8 | ||
|
|
26b6da134f | ||
|
|
238e12af22 | ||
|
|
b521ff3b4f | ||
|
|
af90faf198 | ||
|
|
4b64542fe0 | ||
|
|
8a15147bc5 | ||
|
|
cda3b6ff52 | ||
|
|
b031671138 | ||
|
|
973bbecf1a | ||
|
|
285d8c6589 | ||
|
|
67fc1dafd0 | ||
|
|
48bbdde66b | ||
|
|
eb1ff03418 | ||
|
|
208b230744 | ||
|
|
a33d1c959a | ||
|
|
b187e96ec9 | ||
|
|
228ddddc1c | ||
|
|
e7065eaa93 | ||
|
|
f41901cdf6 | ||
|
|
00224771e3 | ||
|
|
5e8c2b0768 | ||
|
|
698e795a5f | ||
|
|
aad12d0b26 | ||
|
|
ab518ae50e | ||
|
|
e7792e5d46 | ||
|
|
0dd8e0167d | ||
|
|
83aae35b8e | ||
|
|
066789a6e3 | ||
|
|
a7dce47854 | ||
|
|
dbd0e2b386 | ||
|
|
4515987058 | ||
|
|
75face6139 | ||
|
|
8727e5f2be | ||
|
|
2cf5f040a5 | ||
|
|
e513ffef75 | ||
|
|
d497bf845b | ||
|
|
76f31faa3b | ||
|
|
0dcc43316f | ||
|
|
249c3c165a | ||
|
|
d227084339 | ||
|
|
a7cd76bb3b | ||
|
|
67f1778065 | ||
|
|
e1199fa335 | ||
|
|
d1255914df | ||
|
|
ef046bf4f6 | ||
|
|
ea44d3031d | ||
|
|
feaa8a41c7 | ||
|
|
d2389f8fab | ||
|
|
c781f17742 | ||
|
|
81cd3a3cd6 | ||
|
|
4b1d492561 | ||
|
|
f2ebf2469b | ||
|
|
7817f48322 | ||
|
|
06a058d731 | ||
|
|
8517089b3e | ||
|
|
253ec6a63d | ||
|
|
415bff26fe | ||
|
|
18240193ba | ||
|
|
891f9defeb | ||
|
|
dce8682827 | ||
|
|
94d337eb0f | ||
|
|
d927fbc9ab | ||
|
|
ab32e9e043 | ||
|
|
89653cb32f | ||
|
|
7418905aef | ||
|
|
b6cb6ce0d3 | ||
|
|
f61d4b7a87 | ||
|
|
d8c4ecea0b | ||
|
|
fb47a337ba | ||
|
|
70e68893fe | ||
|
|
815169383e | ||
|
|
7bee98bae2 | ||
|
|
851b3970e7 | ||
|
|
d980620010 | ||
|
|
03077db45d | ||
|
|
44527e6023 | ||
|
|
5abcdc9671 | ||
|
|
76a771b749 | ||
|
|
46376888cd | ||
|
|
ec735cbce0 | ||
|
|
534264d209 | ||
|
|
90b785c09a | ||
|
|
6628a3b6ea | ||
|
|
0fb4fb4797 | ||
|
|
7cb0f5f84a | ||
|
|
11d8823791 | ||
|
|
95fd517431 | ||
|
|
bea2e15864 | ||
|
|
c7b8073afc | ||
|
|
928ea564d1 | ||
|
|
761a82bc9a | ||
|
|
78dc13fbf9 | ||
|
|
f9aa01de32 | ||
|
|
dc752327bb | ||
|
|
1a97998644 | ||
|
|
702b46c80d | ||
|
|
7fc835afe3 | ||
|
|
9a35656210 | ||
|
|
0113f5a72d | ||
|
|
19fd5301bf | ||
|
|
96e3be3aa3 | ||
|
|
b9bd2d3eb9 | ||
|
|
9726a259bf | ||
|
|
9f7f86b534 | ||
|
|
06bf0707f7 | ||
|
|
571a51989e | ||
|
|
f631c1d73b | ||
|
|
ad5a108dfd | ||
|
|
c834ef409e | ||
|
|
c12a1dc5d8 | ||
|
|
d2fba2bf35 | ||
|
|
35043ad8ac | ||
|
|
bda08bfa04 | ||
|
|
73c874698b | ||
|
|
f06abda6f5 | ||
|
|
10dc129a4b | ||
|
|
884a209ccf | ||
|
|
f9da776b33 | ||
|
|
f214758dd1 | ||
|
|
6b5a34cdf3 | ||
|
|
b7ddd30181 | ||
|
|
659d449460 | ||
|
|
4f63f9f327 | ||
|
|
109b16d488 | ||
|
|
8b79a31333 | ||
|
|
1cdadb1e3b | ||
|
|
1cecfee634 | ||
|
|
943c396b86 | ||
|
|
c15e6905c4 | ||
|
|
4e85257c6e | ||
|
|
e4fc2cbfd3 | ||
|
|
bcb0cc0b18 | ||
|
|
9701f1c4b2 | ||
|
|
531eba18a6 | ||
|
|
677c2c112c | ||
|
|
a10cfba766 | ||
|
|
c450ac343f | ||
|
|
f8ce384446 | ||
|
|
4472f7bbc3 | ||
|
|
79cbe1fdbb | ||
|
|
407ecc6b5f | ||
|
|
9b672bcaa2 | ||
|
|
36761b2055 | ||
|
|
ff4a9d381d | ||
|
|
8c02f9b7c8 | ||
|
|
2589d55611 | ||
|
|
296b7a580b | ||
|
|
9d72a742e3 | ||
|
|
0c68604823 | ||
|
|
31ad1d29c7 | ||
|
|
3733a85d8d | ||
|
|
daaccc7cb7 | ||
|
|
5ad0140f48 | ||
|
|
f82ef0f7c3 | ||
|
|
024451c65c | ||
|
|
c84b3c4b73 | ||
|
|
408f450286 | ||
|
|
150053b3fa | ||
|
|
fb53986a80 | ||
|
|
17da4242b0 | ||
|
|
d5fca08da4 | ||
|
|
b72d43cbf9 | ||
|
|
b6023905ff | ||
|
|
07c886f944 | ||
|
|
544e5ee1fb | ||
|
|
443071db57 | ||
|
|
1e9bcf26ce | ||
|
|
9ea5a4c468 | ||
|
|
59c3923672 | ||
|
|
39ce94276a | ||
|
|
1520c7bf5b | ||
|
|
e10bd5177f | ||
|
|
33f9074a62 | ||
|
|
8258bd467a | ||
|
|
5ebc05f560 | ||
|
|
5062741bd7 | ||
|
|
707863c1fb | ||
|
|
c97b4f1971 | ||
|
|
e0796b6f1f | ||
|
|
959a19e118 | ||
|
|
1d5b6f26fe | ||
|
|
5ca5ec33cc | ||
|
|
f1742c93d7 | ||
|
|
a42b4ad44e | ||
|
|
1d59a73fef | ||
|
|
cf6e4d82e7 | ||
|
|
2e487379ad | ||
|
|
f70be203e4 | ||
|
|
c368e46e7f | ||
|
|
3dfa98c991 | ||
|
|
2d44dcc8be | ||
|
|
4053c01b53 | ||
|
|
61be6844aa | ||
|
|
578ba76e6c | ||
|
|
d6f0ecc622 | ||
|
|
b6595c4d60 | ||
|
|
78db18739a | ||
|
|
2f256af412 | ||
|
|
353bfbaf93 | ||
|
|
48a2d34cfe | ||
|
|
ef5b0f4c8e | ||
|
|
b47ba2c431 | ||
|
|
2d6a076ab3 | ||
|
|
c0c4e008aa | ||
|
|
1bf3a14353 | ||
|
|
054127112c | ||
|
|
edea94c332 | ||
|
|
30b29d8f87 | ||
|
|
d8c5ba2185 | ||
|
|
0613af0a20 | ||
|
|
5e803219d8 | ||
|
|
9be20afeb5 | ||
|
|
67b10f816c | ||
|
|
3aa2fd3b2c | ||
|
|
8cdbf014bd | ||
|
|
a63ce6ea94 | ||
|
|
4ca3fd0a01 | ||
|
|
86d077da00 | ||
|
|
17db291b5c | ||
|
|
7bfa5cf284 | ||
|
|
674416fbc9 | ||
|
|
b34feeeb86 | ||
|
|
169b0820f0 | ||
|
|
3c195d04f3 | ||
|
|
c417de409d | ||
|
|
c2f6405a0f | ||
|
|
c0446edcc2 | ||
|
|
4ed05da2be | ||
|
|
8d1e5d3ae1 | ||
|
|
774c289ba8 | ||
|
|
8e22004cb5 | ||
|
|
d39297251f | ||
|
|
3b6c1d74c7 | ||
|
|
798f8a0dc1 | ||
|
|
e083720d54 | ||
|
|
3ce782b7f2 | ||
|
|
8a121fa0e7 | ||
|
|
e8ad5b9c1c | ||
|
|
e88a1ba74a | ||
|
|
c205d3b53a | ||
|
|
4f24b20fcb | ||
|
|
a62ec4437b | ||
|
|
2a6ff3f56b | ||
|
|
14d4fbb002 | ||
|
|
cacb28c92c | ||
|
|
db8c55e77c | ||
|
|
f775c5cea4 | ||
|
|
032b877f31 | ||
|
|
6738d82e38 | ||
|
|
03d6aa07ea | ||
|
|
d383954ffe | ||
|
|
5d4e3d2d0c | ||
|
|
df5be65415 | ||
|
|
d71f9944cc | ||
|
|
f28d482cd4 | ||
|
|
5824881e4a | ||
|
|
1a181315eb | ||
|
|
63629614cb | ||
|
|
8cd13eb74e | ||
|
|
ffcdcc7ff0 | ||
|
|
4051c2843b | ||
|
|
217bb47b02 | ||
|
|
bab59f33e7 | ||
|
|
ebb79cdaba | ||
|
|
7343f8e776 | ||
|
|
56cfcea4b4 | ||
|
|
4065b241e8 | ||
|
|
af7960b295 | ||
|
|
18acdff8d3 | ||
|
|
cd5d2473a4 | ||
|
|
63431796f4 | ||
|
|
44daa9836b | ||
|
|
29463cb60c | ||
|
|
692bcbe559 | ||
|
|
493a6bb19a | ||
|
|
7f58d207f3 | ||
|
|
ba0892ba91 | ||
|
|
483edbdf1a | ||
|
|
cacd651ec6 | ||
|
|
50cfeef65e | ||
|
|
412cebec9e | ||
|
|
2e24ded6d2 | ||
|
|
70a393ea9a | ||
|
|
4f8d7328a4 | ||
|
|
fde26002f1 | ||
|
|
f4641bd4de | ||
|
|
82ad1f87fa | ||
|
|
0e7dad3f6e | ||
|
|
7af2d6b985 | ||
|
|
909ea3008e | ||
|
|
5571c1aaa4 | ||
|
|
f9df88c6da | ||
|
|
f9e464f95a | ||
|
|
9fe92590b2 | ||
|
|
f4720d8dbd | ||
|
|
8e6086b403 | ||
|
|
a54b70a355 | ||
|
|
cf4700aff4 | ||
|
|
c9b35b9923 | ||
|
|
c4d6c7f829 | ||
|
|
f0694e1e0c | ||
|
|
03968739c5 | ||
|
|
94c6bcfdad | ||
|
|
dfdf09d43d | ||
|
|
728386bfb2 | ||
|
|
628bc835ae | ||
|
|
a52254d0d7 | ||
|
|
aef61ee367 | ||
|
|
0e752246d3 | ||
|
|
2fd5cb3d2e | ||
|
|
0cf7156f08 | ||
|
|
2806c6ce28 | ||
|
|
02e288b640 | ||
|
|
af7314e190 | ||
|
|
40190b7c92 | ||
|
|
ec02e82760 | ||
|
|
2f148845e8 | ||
|
|
9a0495a4b0 | ||
|
|
dd1b3b6dfd | ||
|
|
ab294ad93d | ||
|
|
6e51db1268 | ||
|
|
60aa852a03 | ||
|
|
97ee38707b | ||
|
|
44559a3211 | ||
|
|
24a2706a3b | ||
|
|
11d27367cd | ||
|
|
bd880e7f3f | ||
|
|
3bec62b012 | ||
|
|
3d5f7594b5 | ||
|
|
ac5e7072c9 | ||
|
|
7aee49d967 | ||
|
|
7d6d5e263e | ||
|
|
964d03bc3f | ||
|
|
cd4cb8e795 | ||
|
|
90fd70d284 | ||
|
|
aa35564ca1 | ||
|
|
3f1f2d1497 | ||
|
|
d03b8487c6 | ||
|
|
3c68c85f18 | ||
|
|
2d7b43f466 | ||
|
|
ae762b620e | ||
|
|
2f5e084147 | ||
|
|
db8940dae2 | ||
|
|
ca0986fbd1 | ||
|
|
d4d45a1757 | ||
|
|
27a937bcf8 | ||
|
|
b73ec84ce1 | ||
|
|
a84adad078 | ||
|
|
59ecf2ccf7 | ||
|
|
f492baa61d | ||
|
|
c5cbc3db47 | ||
|
|
d384b8b0d2 | ||
|
|
a9130222bd | ||
|
|
c1fcb1db99 | ||
|
|
491ec171ec | ||
|
|
58e5d69250 | ||
|
|
680d75af34 | ||
|
|
b92a919500 | ||
|
|
1b5048b288 | ||
|
|
d3b8372615 | ||
|
|
73806b56e5 | ||
|
|
9a6f936c8a | ||
|
|
92cb684e78 | ||
|
|
3502e45b6c | ||
|
|
defa637378 | ||
|
|
fd61bfc731 | ||
|
|
ac9fa2b846 | ||
|
|
e004721b48 | ||
|
|
e60b18bbdf | ||
|
|
7f94b5ccca | ||
|
|
35c1f682c1 | ||
|
|
3d1b670640 | ||
|
|
21374c3903 | ||
|
|
634b4de2c8 | ||
|
|
27d8b059fa | ||
|
|
5e3ca98155 | ||
|
|
186960fefb | ||
|
|
3817b12fec | ||
|
|
bae4018b30 | ||
|
|
c6019b8b4e | ||
|
|
080ffb8b2c | ||
|
|
b9127eb0a5 | ||
|
|
feff9bbb67 | ||
|
|
c6a04ce78f | ||
|
|
19133cac02 | ||
|
|
da908364a8 | ||
|
|
c6c6f98f1c | ||
|
|
3f4062309e | ||
|
|
f116e17a23 | ||
|
|
86f4846c21 | ||
|
|
0cebfc8ddb | ||
|
|
de5e3f6a6f | ||
|
|
f0c5165f81 | ||
|
|
b0c1541227 | ||
|
|
1109c8fc4e | ||
|
|
c3a9733ac1 | ||
|
|
b72277183f | ||
|
|
8d3c46daa8 | ||
|
|
999757983c | ||
|
|
7f4aba91d3 | ||
|
|
028043dd02 | ||
|
|
546870edd8 | ||
|
|
af4a96ce6e | ||
|
|
4af673e161 | ||
|
|
7ae0d473a6 | ||
|
|
d530ee62cd | ||
|
|
96338432e2 | ||
|
|
0cdf85e28d | ||
|
|
96a137a18a | ||
|
|
31721da4b1 | ||
|
|
c1f474010e | ||
|
|
0787287021 | ||
|
|
7864bb9eb8 | ||
|
|
23c4278e06 | ||
|
|
dfed2cef75 | ||
|
|
f73f07e126 | ||
|
|
1eb1fe3225 | ||
|
|
a2851b6234 | ||
|
|
4672872ddd | ||
|
|
977e211421 | ||
|
|
ae5e23310e | ||
|
|
9764bea97d | ||
|
|
4ed7b035bd | ||
|
|
a118f21728 | ||
|
|
7a1a62ec6e | ||
|
|
30e462e919 | ||
|
|
83fd1c1de5 | ||
|
|
2c07712860 | ||
|
|
8f2694bb53 | ||
|
|
d52f5020ce | ||
|
|
9364699be1 | ||
|
|
3415427dbf | ||
|
|
ef50bd2e54 | ||
|
|
ce485791db | ||
|
|
3bc3af0276 | ||
|
|
d91bc7cb09 | ||
|
|
077f9d7293 | ||
|
|
71e975669c | ||
|
|
1e425e3fa7 | ||
|
|
d653732157 | ||
|
|
6a2cb6c506 | ||
|
|
6141386f7e | ||
|
|
0685707bc6 | ||
|
|
de21de920c | ||
|
|
0a4f5e8473 | ||
|
|
14b20ffc30 | ||
|
|
b19b8836c3 | ||
|
|
1ce14eca44 | ||
|
|
9a0d90793e | ||
|
|
df236e75a2 | ||
|
|
a7af84f988 | ||
|
|
e7e4f2f3aa | ||
|
|
ef032cbe85 | ||
|
|
3a915b02e8 | ||
|
|
5041bc1b6c | ||
|
|
68a0c56a7d | ||
|
|
09ccbef3bb | ||
|
|
2e6ad62047 | ||
|
|
c3f176222a | ||
|
|
3f43b1c039 | ||
|
|
8a6576f764 | ||
|
|
a27320e00f | ||
|
|
2f759a7090 | ||
|
|
d3f6b094c7 | ||
|
|
e9adb7fbbc | ||
|
|
830d0fe95a | ||
|
|
c7771bc2ec | ||
|
|
c9f58cc595 | ||
|
|
a8f357629d | ||
|
|
38eec57aef | ||
|
|
d4ccdeaf00 | ||
|
|
cacd3ae004 | ||
|
|
163900dc68 | ||
|
|
9da830e895 | ||
|
|
e5ed6b91f4 | ||
|
|
02c1cb54aa | ||
|
|
9a6012edd9 | ||
|
|
e612143a89 | ||
|
|
99059aad8d | ||
|
|
349cab0b48 | ||
|
|
81d18398a8 | ||
|
|
09c296b44d | ||
|
|
0a347559bf | ||
|
|
986785c9d2 | ||
|
|
116835561d | ||
|
|
e5db01ee29 | ||
|
|
8be699494e | ||
|
|
23514fc946 | ||
|
|
1595a6e885 | ||
|
|
a20872045a | ||
|
|
5e1471c806 | ||
|
|
c2dc673eb5 | ||
|
|
832efb1e01 | ||
|
|
2e2df04b35 | ||
|
|
74a8215a86 | ||
|
|
7543c38dca | ||
|
|
a2cd31cbf1 | ||
|
|
0f0af55a0a | ||
|
|
11d1eca9f3 | ||
|
|
f64989e63b | ||
|
|
07a983a602 | ||
|
|
4671e54495 | ||
|
|
68db20656e | ||
|
|
9fb088e3ab | ||
|
|
74a2528bd7 | ||
|
|
051908e023 | ||
|
|
5937d02aed | ||
|
|
71527e3a55 | ||
|
|
465f57c56f | ||
|
|
30fd2f7bb2 | ||
|
|
7e40c7ddc9 | ||
|
|
f101f7c9ba | ||
|
|
67cd05472e | ||
|
|
e5ea6ad0f0 | ||
|
|
a661830569 | ||
|
|
5166758927 | ||
|
|
3deceaf6e7 | ||
|
|
a9723df1b7 | ||
|
|
ec79acb3a6 | ||
|
|
a3efcd2006 | ||
|
|
05471f5c2a | ||
|
|
bd21038078 | ||
|
|
18d179c2d8 | ||
|
|
7e0bf7d57d | ||
|
|
840229a825 | ||
|
|
db3c4efd1d | ||
|
|
35b3d15194 | ||
|
|
33b7fc250f | ||
|
|
fa490f6497 | ||
|
|
0ad2a9a2e0 | ||
|
|
03c4aa6aef | ||
|
|
42ea068a1a | ||
|
|
279e7e7341 | ||
|
|
88b919ea56 | ||
|
|
a94ffdaec5 | ||
|
|
26bfb6bea4 | ||
|
|
ff40253566 | ||
|
|
e97b961815 | ||
|
|
836344c90e | ||
|
|
3fd13c6426 | ||
|
|
b221fe9b29 | ||
|
|
52bd0f93bb | ||
|
|
5403a8ce4c | ||
|
|
e3c0c86b28 | ||
|
|
e4afb2f724 | ||
|
|
ca4b91a1d0 | ||
|
|
5756d7916a | ||
|
|
f19e20d33f | ||
|
|
4b6164ab49 | ||
|
|
22e23473ea | ||
|
|
38651521a8 | ||
|
|
14b7c4327f | ||
|
|
8a413b076e | ||
|
|
f98999cc16 | ||
|
|
85a86b5fd6 | ||
|
|
ff0f0aeb40 | ||
|
|
a0119af0e4 | ||
|
|
5c0f039c9c | ||
|
|
352febe251 | ||
|
|
f89beaf3ac | ||
|
|
c80abfa0e4 | ||
|
|
ccf7b41a69 | ||
|
|
27c85727ed | ||
|
|
e806ad39d0 | ||
|
|
5988872ff1 | ||
|
|
a6f3451e25 | ||
|
|
77f2cb66d1 | ||
|
|
a74354735a | ||
|
|
40879f33cd | ||
|
|
b1b16d117e | ||
|
|
2775c0e97e | ||
|
|
46e86aa803 | ||
|
|
986e612557 | ||
|
|
57ddf5f50a | ||
|
|
aef62a03ee | ||
|
|
9037decb28 | ||
|
|
6999fb3d1e | ||
|
|
fc6a9673c8 | ||
|
|
ed111975a0 | ||
|
|
f33a35e293 | ||
|
|
7b93eb0000 | ||
|
|
6768d2fc93 | ||
|
|
5c0d11b12a | ||
|
|
5d7577c71a | ||
|
|
4fd315192a | ||
|
|
831c8199f6 | ||
|
|
667aae596c | ||
|
|
2433eeb385 | ||
|
|
6c0c00a205 | ||
|
|
f5e742b264 | ||
|
|
ff512634ac | ||
|
|
9edb984274 | ||
|
|
827180097c | ||
|
|
93298afc4e | ||
|
|
f9014438c7 | ||
|
|
3df7c90c30 | ||
|
|
6d00c089e3 | ||
|
|
e10ed097cb | ||
|
|
56e34c2f81 | ||
|
|
f2b1f57f74 | ||
|
|
f749338e1e | ||
|
|
a38fd6056c | ||
|
|
08ab306afd | ||
|
|
de78922b12 | ||
|
|
35fe3eb5c7 | ||
|
|
40c93486e8 | ||
|
|
f9a47debfc | ||
|
|
f25ec0782e | ||
|
|
6b5853794d | ||
|
|
4e5247772d | ||
|
|
2156e5eca1 | ||
|
|
ec1d1ee61f | ||
|
|
d18cebaf8a | ||
|
|
4afc46d7bc | ||
|
|
0f33768059 | ||
|
|
90587b1ccb | ||
|
|
4fdec07bd8 | ||
|
|
e282c0a081 | ||
|
|
0ca30187cf | ||
|
|
f7b612550a | ||
|
|
d489a01f81 | ||
|
|
ad42a82df5 | ||
|
|
d44ce97909 | ||
|
|
091ab850aa | ||
|
|
29ce743385 | ||
|
|
e493b29598 | ||
|
|
4a38795b6f | ||
|
|
54ad2f6cbb | ||
|
|
892056bf97 | ||
|
|
4865063924 | ||
|
|
70884875c9 | ||
|
|
ca6ededbd1 | ||
|
|
1695332941 | ||
|
|
534df2f8d2 | ||
|
|
549443a7cc | ||
|
|
21dd53f9d3 | ||
|
|
6e76a7cb45 | ||
|
|
72cbb7492c | ||
|
|
9cc55dca6f | ||
|
|
716f5bc66b | ||
|
|
317ba9fb64 | ||
|
|
2c1025706b | ||
|
|
ab18d72b35 | ||
|
|
ca2a047b8e | ||
|
|
7584225873 | ||
|
|
25410096b4 | ||
|
|
95844451b6 | ||
|
|
60040a4f36 | ||
|
|
1afd0b52fe | ||
|
|
3d1476a316 | ||
|
|
d5047f5fe6 | ||
|
|
f0c629a36b | ||
|
|
03e689fae4 | ||
|
|
df62005ece | ||
|
|
23de33968f | ||
|
|
f1678bfc65 | ||
|
|
03cb903e7e | ||
|
|
8a98c2f1d8 | ||
|
|
93465d3051 | ||
|
|
220288725f | ||
|
|
e03b42d1bb | ||
|
|
f0c1376e07 | ||
|
|
766f609838 | ||
|
|
bd9fa2e841 | ||
|
|
f2ba4cef2a | ||
|
|
9ff86a2848 | ||
|
|
465e22e62f | ||
|
|
7dffbaf2ce | ||
|
|
247d0da188 | ||
|
|
71ae175319 | ||
|
|
89556f5a2f | ||
|
|
9e6957b0a5 | ||
|
|
07701e7cc8 | ||
|
|
8abb73ef58 | ||
|
|
b073989e17 | ||
|
|
c8108aad83 | ||
|
|
8cca30f31b | ||
|
|
290bc0c067 | ||
|
|
4d49469d0d | ||
|
|
e1b829d2a5 | ||
|
|
0ad2717fd8 | ||
|
|
2d8af39acc | ||
|
|
d4ee61ffc7 | ||
|
|
e6a30bd107 | ||
|
|
4cbcdb4b2c | ||
|
|
7cee968c21 | ||
|
|
6b2091b58a | ||
|
|
99679c6430 | ||
|
|
44e7033279 | ||
|
|
a5f74b4da7 | ||
|
|
97e4b3a7bf | ||
|
|
787f62de8c | ||
|
|
b28e700ebd | ||
|
|
b07acb3808 | ||
|
|
d5d043f2d7 | ||
|
|
8b28d599a7 | ||
|
|
cc5cea35b0 | ||
|
|
22d7fe1206 | ||
|
|
08a91acd76 | ||
|
|
c1a63a9e90 | ||
|
|
70033bd960 | ||
|
|
9a79bb694e | ||
|
|
472a72d27f | ||
|
|
0321adbcf4 | ||
|
|
39484f49ef | ||
|
|
df0edf5fe6 | ||
|
|
4b4d059791 | ||
|
|
9ef3c6238b | ||
|
|
57653added | ||
|
|
ff4096f958 | ||
|
|
d5a189acef | ||
|
|
d84a6ba3d1 | ||
|
|
bca88b2dc1 | ||
|
|
8e5674fb5c | ||
|
|
be67fa7e09 | ||
|
|
8bd80f4911 | ||
|
|
4a899c9274 | ||
|
|
dd9593ccc4 | ||
|
|
42281124d4 | ||
|
|
1e73e4c62f | ||
|
|
dadc30318f | ||
|
|
075acfa2d6 | ||
|
|
aa67b1f375 | ||
|
|
5b05429bf0 | ||
|
|
78dbb4b5b1 | ||
|
|
55c21970fd | ||
|
|
a993d22c0f | ||
|
|
760928bfad | ||
|
|
baebd30eee | ||
|
|
e2f1e50c60 | ||
|
|
5f08c3cfa1 | ||
|
|
3452477dcb | ||
|
|
e21643d618 | ||
|
|
f3da6c6c04 | ||
|
|
2cde498319 | ||
|
|
557fc396b4 | ||
|
|
c123ac05dc | ||
|
|
6f8839d2ac | ||
|
|
884f689efe | ||
|
|
41f2725639 | ||
|
|
c2fb062f60 | ||
|
|
8e57398b20 | ||
|
|
539598b11f | ||
|
|
8b2abed03d | ||
|
|
432a2e4d39 | ||
|
|
4b3824b682 | ||
|
|
c24276f008 | ||
|
|
3f5bb15f35 | ||
|
|
744ed46970 | ||
|
|
8c3a757ffc | ||
|
|
0c3b357985 | ||
|
|
add4cfcf5f | ||
|
|
fa43f04f6a | ||
|
|
25ca13ec1a | ||
|
|
cdb5864fc3 | ||
|
|
4428b70cba | ||
|
|
649dbbbd83 | ||
|
|
5fc0c27d5c | ||
|
|
20ba454ef9 | ||
|
|
dd0188ec08 | ||
|
|
40c98a977b | ||
|
|
f168f7d702 | ||
|
|
2c560c5405 | ||
|
|
a0f3eb015a | ||
|
|
268476549e | ||
|
|
4d02e77f44 | ||
|
|
4f46ee4400 | ||
|
|
863f17f68c | ||
|
|
45bb10cc32 | ||
|
|
6eeb59abf6 | ||
|
|
809fdf26fb | ||
|
|
ca19e792c6 | ||
|
|
ea97d6ed5f | ||
|
|
5866f1a9aa | ||
|
|
2df81c57f6 | ||
|
|
828bf50a0e | ||
|
|
eb6e60432b | ||
|
|
09dc577931 | ||
|
|
b3d4938e3e | ||
|
|
66116924ed | ||
|
|
356992fe4d | ||
|
|
e9f8e28426 | ||
|
|
bc7bae1d6b | ||
|
|
5427311ae6 | ||
|
|
9143b43e98 | ||
|
|
2afd20b542 | ||
|
|
59faab4330 | ||
|
|
b7c05e1b75 | ||
|
|
448c5e07ca | ||
|
|
d483acc5d9 | ||
|
|
b037c16f55 | ||
|
|
a848a3efbf | ||
|
|
b319699132 | ||
|
|
036e59394a | ||
|
|
533a455274 | ||
|
|
9d792f3183 | ||
|
|
c481f97a9c | ||
|
|
02f24f54ba | ||
|
|
87bb848268 | ||
|
|
8c476371f5 | ||
|
|
a8506c41c6 | ||
|
|
41062e71a7 | ||
|
|
2d8c1fe1ed | ||
|
|
1a433b9637 | ||
|
|
78a25696f1 | ||
|
|
39a492799d | ||
|
|
469cb1b7b7 | ||
|
|
d329fc7b09 | ||
|
|
3063ba0800 | ||
|
|
9d71e74491 | ||
|
|
3aadd4fe76 | ||
|
|
8a538ce372 | ||
|
|
9caeceef6d | ||
|
|
edbec3f8f3 | ||
|
|
a778a25cab | ||
|
|
39e2c469db | ||
|
|
2a7a2ca986 | ||
|
|
c3346f6760 | ||
|
|
0d5a6b2d9d | ||
|
|
e1c043f43a | ||
|
|
a337ac7584 | ||
|
|
b962ff35dd | ||
|
|
70e6f3f115 | ||
|
|
e6b6075024 | ||
|
|
7aa5924dc6 | ||
|
|
0de6ec5f08 | ||
|
|
ed5bad754c | ||
|
|
48a9a2d355 | ||
|
|
c2d9e62f16 | ||
|
|
e4731f8168 | ||
|
|
d85c85aac1 | ||
|
|
624f70e88f | ||
|
|
c6347dcfb4 | ||
|
|
cf2513e1aa | ||
|
|
b261e37a34 | ||
|
|
5976d58796 | ||
|
|
045bfe0da5 | ||
|
|
d8c178bc16 | ||
|
|
892ba87866 | ||
|
|
ef659192a1 | ||
|
|
6ac22bfb04 | ||
|
|
60a9e1e40f | ||
|
|
6029127cea | ||
|
|
f7f8af8420 | ||
|
|
73cf8e82e7 | ||
|
|
4eaf4ce26a | ||
|
|
07c27e040e | ||
|
|
a82f5389d9 | ||
|
|
b24c515dbf | ||
|
|
7a7f1062bf | ||
|
|
18b92201be | ||
|
|
7edfb02984 | ||
|
|
6c5f1f58f3 | ||
|
|
f4e34f1b76 | ||
|
|
b603578b53 | ||
|
|
348d8cd04a | ||
|
|
aac717da8d | ||
|
|
45605c9b39 | ||
|
|
f9994114ab | ||
|
|
5c7532e5b3 | ||
|
|
a805012d6f | ||
|
|
213b8af2f6 | ||
|
|
15d0fa6dc1 | ||
|
|
c65a91c96f | ||
|
|
d87f551f36 | ||
|
|
802c4c6a61 | ||
|
|
3966e4e7a5 | ||
|
|
21e7292ea0 | ||
|
|
07b1997388 | ||
|
|
80858761a8 | ||
|
|
a239ea0d40 | ||
|
|
b00b2f08bf | ||
|
|
b0388ccad0 | ||
|
|
07ad11916f | ||
|
|
c07edd90f5 | ||
|
|
d9377f5eb0 | ||
|
|
855f46677c | ||
|
|
ec11525d33 | ||
|
|
3f987cd925 | ||
|
|
926365c9f8 | ||
|
|
bb8f73419c | ||
|
|
ee0a7b928b | ||
|
|
4b455bafd0 | ||
|
|
f322bbe729 | ||
|
|
ec51bfc995 | ||
|
|
f2f30286bf | ||
|
|
6df7bdd954 | ||
|
|
b084322f52 | ||
|
|
10d92b3dcd | ||
|
|
c4d2244a09 | ||
|
|
a9f2c4aa30 | ||
|
|
d75de86e6d | ||
|
|
90fb81ad54 | ||
|
|
e61de70c96 | ||
|
|
64de69c1a4 | ||
|
|
1865b11dcb | ||
|
|
67e12a0f84 | ||
|
|
01e4fe5fbc | ||
|
|
a599aeb2a8 | ||
|
|
b9049d2f90 | ||
|
|
d6bae2cb95 | ||
|
|
666aa0a343 | ||
|
|
c744e925df | ||
|
|
4b123f9ca2 | ||
|
|
45822da46a | ||
|
|
500c8f45f5 | ||
|
|
cc2861ee44 | ||
|
|
88cc688731 | ||
|
|
da3356bb38 | ||
|
|
de5ba2db25 | ||
|
|
ee7313266a | ||
|
|
dd8018de95 | ||
|
|
9a059ea69e | ||
|
|
56f65e3c3e | ||
|
|
ae17e2d90a | ||
|
|
2240486d3d | ||
|
|
de3c16afae | ||
|
|
2255efa171 | ||
|
|
b04d4fff35 | ||
|
|
b3a7de15b7 | ||
|
|
be23c51f69 | ||
|
|
bb9316da28 | ||
|
|
f490934c33 | ||
|
|
1c3883bef2 | ||
|
|
97900776bb | ||
|
|
d29be0dfa2 | ||
|
|
43e91da074 | ||
|
|
ef12fa1bf7 | ||
|
|
bdd19ab40b | ||
|
|
321ec97d95 | ||
|
|
77f21787d4 | ||
|
|
d70ef199f1 | ||
|
|
b1b3dc62ff | ||
|
|
e90db17392 | ||
|
|
6e76fc2866 | ||
|
|
19a18add4e | ||
|
|
95b034e484 | ||
|
|
93188918ea | ||
|
|
8295c80618 | ||
|
|
e698dd38c3 | ||
|
|
5bbb4cadc3 | ||
|
|
06a22e2ea1 | ||
|
|
8e2c014e43 | ||
|
|
429efdd974 | ||
|
|
c5e51cead8 | ||
|
|
3d3f29cf06 | ||
|
|
cced79d4a8 | ||
|
|
b24cdb3d36 | ||
|
|
871194d5fd | ||
|
|
e10fd321e4 | ||
|
|
59055b227a | ||
|
|
e53e9c72cb | ||
|
|
22c2c34952 | ||
|
|
06d86ebe84 | ||
|
|
f8c335d0ca | ||
|
|
eef5d3257d | ||
|
|
e0a207c27a | ||
|
|
ebe0fb697a | ||
|
|
7547c7df1a | ||
|
|
fd29448be0 | ||
|
|
70bc2e32af | ||
|
|
23bb5986d4 | ||
|
|
57d2857938 | ||
|
|
2003593143 | ||
|
|
580e67015c | ||
|
|
e609195202 | ||
|
|
89e894b17a | ||
|
|
9023b0b3a2 | ||
|
|
cf20b6bf65 | ||
|
|
21d081fd7f | ||
|
|
6f86b9cb70 | ||
|
|
db273818f6 | ||
|
|
36815e4179 | ||
|
|
1a89c8d061 | ||
|
|
fdf180f9ce | ||
|
|
aeb124f7f3 | ||
|
|
a0fdd5f3f6 | ||
|
|
c50b0c9237 | ||
|
|
6cc94db653 | ||
|
|
60e26668b3 | ||
|
|
1cf26e2bf1 | ||
|
|
e90623edc2 | ||
|
|
46b6954acd | ||
|
|
ffc8110659 | ||
|
|
49ba55b100 | ||
|
|
3ebbdc6320 | ||
|
|
a29a7c72fa | ||
|
|
9170077f13 | ||
|
|
641f2bedf3 | ||
|
|
ded97eb892 | ||
|
|
e84edd2593 | ||
|
|
823a443321 | ||
|
|
1ad30a2af4 | ||
|
|
99c9d19184 | ||
|
|
dd4b280d8c | ||
|
|
ae648a44c4 | ||
|
|
9b4e8e0a0d | ||
|
|
0f6d3e22d9 | ||
|
|
3e7f4b0f82 | ||
|
|
d5f401147a | ||
|
|
61764613d1 | ||
|
|
d5feb1c280 | ||
|
|
3d22dbf27b | ||
|
|
03eb41c2ec | ||
|
|
3ca0517749 | ||
|
|
456dafc3c6 | ||
|
|
cf89beec6f | ||
|
|
f44d0b9044 | ||
|
|
b204006105 | ||
|
|
bbd976b8c4 | ||
|
|
754e23db27 | ||
|
|
260383215b | ||
|
|
eda15387a0 | ||
|
|
5fea00581b | ||
|
|
a033261f39 | ||
|
|
6ed721afd2 | ||
|
|
aab958b713 | ||
|
|
1c62e807e1 | ||
|
|
eba1f7b1a4 | ||
|
|
a5c51b4858 | ||
|
|
216019b72d | ||
|
|
e85a95dfa3 | ||
|
|
fc0a4c2781 | ||
|
|
5451ba3aa8 | ||
|
|
2445fb8bdd | ||
|
|
6392eba3f9 | ||
|
|
34f34e4411 | ||
|
|
1cf13bca19 | ||
|
|
3a160646df | ||
|
|
cffd0bb68d | ||
|
|
b159c6d62e | ||
|
|
2335c4bb41 | ||
|
|
b480cfaf34 | ||
|
|
a056ef1f39 | ||
|
|
5b014e0725 | ||
|
|
1f16a7b6e5 | ||
|
|
319580953d | ||
|
|
232e8e19a1 | ||
|
|
95eb729e6f | ||
|
|
236b217cd7 | ||
|
|
d51a0c353b | ||
|
|
55a8a3aad4 | ||
|
|
7244b9cee8 | ||
|
|
a639cf7d84 | ||
|
|
83152d174c | ||
|
|
86fba381fd | ||
|
|
cbcf4fe768 | ||
|
|
1db9a2adbe | ||
|
|
16889e22cc | ||
|
|
ce3ccc8d5a | ||
|
|
b906e85996 | ||
|
|
055a933fa9 | ||
|
|
e5cf3f9751 | ||
|
|
3ab15cde25 | ||
|
|
0ba78d5f36 | ||
|
|
6e1e9e2fcb | ||
|
|
246805d386 | ||
|
|
8595981195 | ||
|
|
3abebfea98 | ||
|
|
38c49fbc4a | ||
|
|
2cd5adc28b | ||
|
|
6035651fad | ||
|
|
b3f91f15b2 | ||
|
|
e543b0e95e | ||
|
|
7defbd27ef | ||
|
|
b488be127a | ||
|
|
05de01d707 | ||
|
|
4d05f56dcd | ||
|
|
3f862cf179 | ||
|
|
9d1bdbcf05 | ||
|
|
61e796decc | ||
|
|
a4402f0b2e | ||
|
|
975f1930b1 | ||
|
|
f004d5aeac | ||
|
|
3f92031aeb | ||
|
|
585936157c | ||
|
|
8bdf6bae30 | ||
|
|
a808ab4ac4 | ||
|
|
1b2d333ee3 | ||
|
|
59a9a9b5b0 | ||
|
|
48d21dd541 | ||
|
|
06d71ad457 | ||
|
|
4f8d6d0834 | ||
|
|
29d8ff51c8 | ||
|
|
9d3faf4f9a | ||
|
|
3ac5f1106d | ||
|
|
1cb6fe47fc | ||
|
|
534e41b474 | ||
|
|
bed405cfea | ||
|
|
b0030af135 | ||
|
|
e258169666 | ||
|
|
4f8a0cd2f9 | ||
|
|
2c52ccea80 | ||
|
|
4f38c5ece3 | ||
|
|
8f15582ef3 | ||
|
|
960ccdc72c | ||
|
|
3e696d189c | ||
|
|
9c70b09e0a | ||
|
|
5e3b0095de | ||
|
|
40cb398867 | ||
|
|
93dc713670 | ||
|
|
44314ccf48 | ||
|
|
3b852d7fab | ||
|
|
5d0b5a00aa | ||
|
|
cf2ee19049 | ||
|
|
b9e1bb3d92 | ||
|
|
14b04b06b4 | ||
|
|
17a82e72f4 | ||
|
|
4b0241d589 | ||
|
|
2cd51ef5d4 | ||
|
|
3222a04d5e | ||
|
|
897208e06d | ||
|
|
3421f43351 | ||
|
|
b00f5e2e14 | ||
|
|
098fef6740 | ||
|
|
8082858ee7 | ||
|
|
170f2addb2 | ||
|
|
5bc1809b43 | ||
|
|
d214576d2b | ||
|
|
2095eea3da | ||
|
|
2af6431619 | ||
|
|
895fa3a56b | ||
|
|
e0f10ecfd9 | ||
|
|
4e2343c6b5 | ||
|
|
10d4bd8266 | ||
|
|
326b2cb34e | ||
|
|
426298c8c1 | ||
|
|
74f39041d4 | ||
|
|
dc39ab3bbf | ||
|
|
ec90ede1cf | ||
|
|
13324bf844 | ||
|
|
09329e7833 | ||
|
|
78ca555845 | ||
|
|
0757c73a20 | ||
|
|
e34a2c170c | ||
|
|
8dd4fcbe8f | ||
|
|
f84d86b660 | ||
|
|
5d89540b77 | ||
|
|
4fc0fdc6ee | ||
|
|
cdcb1118c8 | ||
|
|
0fa3cf94a3 | ||
|
|
da9bf0ee80 | ||
|
|
3ae644d48c | ||
|
|
2a462abf5f | ||
|
|
05727f6e3e | ||
|
|
2d13cdfd2a | ||
|
|
efb833f342 | ||
|
|
409915e955 | ||
|
|
97cada0e6a | ||
|
|
0ba8f05a42 | ||
|
|
0d19d82498 | ||
|
|
6f96e78dea | ||
|
|
b1bb17fd2b | ||
|
|
04958e88a4 | ||
|
|
105d1787dc | ||
|
|
69d3bf1068 | ||
|
|
d7bcf21340 | ||
|
|
6a83df04b6 | ||
|
|
a9366818a1 | ||
|
|
edcfea5d02 | ||
|
|
1001cf412c | ||
|
|
da82daf54c | ||
|
|
febe5c44c0 | ||
|
|
099c717baf | ||
|
|
8f2b03242d | ||
|
|
9e00b7d3d0 | ||
|
|
865b077819 | ||
|
|
96fe50400d | ||
|
|
10edbbb927 | ||
|
|
7335a4234a | ||
|
|
1a9286c6e9 | ||
|
|
6545a6dc5d | ||
|
|
b54da8a10f | ||
|
|
5c3954aa6f | ||
|
|
c1472ac105 | ||
|
|
89014c9d40 | ||
|
|
1e3e6b7c15 | ||
|
|
5496e67f83 | ||
|
|
d42006c80a | ||
|
|
86528489ec | ||
|
|
44a5452a4f | ||
|
|
5213c39038 | ||
|
|
8ef2c13d6c | ||
|
|
b5d32d4a9e | ||
|
|
829735e738 | ||
|
|
35f4182cee | ||
|
|
6ee73a2fee | ||
|
|
189dd8f803 | ||
|
|
358f0ce96b | ||
|
|
5fd012e67a | ||
|
|
8974ba31a3 | ||
|
|
cf78d04ae2 | ||
|
|
b904a078d8 | ||
|
|
a936768890 | ||
|
|
4a8088a603 | ||
|
|
9c11e8a1ca | ||
|
|
481c17504d | ||
|
|
2dd68af334 | ||
|
|
0e9c1ca673 | ||
|
|
a6dbe0ff23 | ||
|
|
11d68eb3fc | ||
|
|
52eaac4382 | ||
|
|
818f0cba55 | ||
|
|
434ccd2e20 | ||
|
|
24a69d22a0 | ||
|
|
359a65a6db | ||
|
|
143aeb9ea7 | ||
|
|
850609ea2d | ||
|
|
1ba834bd3f | ||
|
|
9ad27f7853 | ||
|
|
c8646e0c41 | ||
|
|
6bd0bcd5af | ||
|
|
60818b957c | ||
|
|
672b453a76 | ||
|
|
edea4122b1 | ||
|
|
cc92234068 | ||
|
|
fc61134b1a | ||
|
|
3060266ff1 | ||
|
|
21b64dc7c9 | ||
|
|
37bb37d151 | ||
|
|
b4afe605f4 | ||
|
|
362b5a6c40 | ||
|
|
f5a01d1764 | ||
|
|
06190928c0 | ||
|
|
4d4900fc65 | ||
|
|
5fee1ff7bc | ||
|
|
f53d092a2a | ||
|
|
b6c582a3a3 | ||
|
|
a1fa3efd2b | ||
|
|
26874e2e07 | ||
|
|
8a729270c1 | ||
|
|
52c2988f16 | ||
|
|
a7803c58e4 | ||
|
|
12cf730b69 | ||
|
|
6d7aa65399 | ||
|
|
60efa608d6 | ||
|
|
a56a95b652 | ||
|
|
4a1efb2b9c | ||
|
|
dd93c53c4e | ||
|
|
2f22024806 | ||
|
|
c0c4bd4efa | ||
|
|
889620dcd2 | ||
|
|
1e2d777601 | ||
|
|
6a6a70e80e | ||
|
|
56315494dd | ||
|
|
f35a396c54 | ||
|
|
ccd8b55b01 | ||
|
|
004e6fbe1f | ||
|
|
e35ce7baa1 | ||
|
|
1d94d4fa70 | ||
|
|
3dee0e4cd8 | ||
|
|
cc2ac1ccc7 | ||
|
|
173f91c791 | ||
|
|
b9529545e1 | ||
|
|
92f5a5d3ca | ||
|
|
528c28587f | ||
|
|
c5d54010bc | ||
|
|
4fb2ac5be1 | ||
|
|
ebefe77bc0 | ||
|
|
d4379fcee3 | ||
|
|
2dbb470ea1 | ||
|
|
194511ff1a | ||
|
|
3524f41a27 | ||
|
|
a6a04fb1ec | ||
|
|
b8f3e18a5d | ||
|
|
b3ddb895d2 | ||
|
|
3961b5a131 | ||
|
|
7fb8c7c37f | ||
|
|
cbcaeedba9 | ||
|
|
0e8a55d2a2 | ||
|
|
13871fa2f8 | ||
|
|
15628f6735 | ||
|
|
d7dff34bad | ||
|
|
b8847e9ac6 | ||
|
|
0a5708c3e9 | ||
|
|
680765abec | ||
|
|
dddfd0f8b8 | ||
|
|
58cb0fa639 | ||
|
|
239b3d62de | ||
|
|
4c5751ba97 | ||
|
|
7ee29d1d5b | ||
|
|
00aa8935d7 | ||
|
|
216570b5e1 | ||
|
|
a2eaddaa51 | ||
|
|
1ead20f274 | ||
|
|
005d607aed | ||
|
|
be4576de7a | ||
|
|
ed744ecbfd | ||
|
|
bdb9d09aef | ||
|
|
7e2d799328 | ||
|
|
9b808c2d1b | ||
|
|
220e61c1f6 | ||
|
|
dd6faa5adf | ||
|
|
ac379b3be1 | ||
|
|
401c073dd2 | ||
|
|
493d3b9f7c | ||
|
|
8498ee03bc | ||
|
|
8f1ba251dd | ||
|
|
d5a21a29f8 | ||
|
|
efa95c2718 | ||
|
|
3c3ec7b2d7 | ||
|
|
9b2335a356 | ||
|
|
de09168e5a | ||
|
|
2d02e6a992 | ||
|
|
caf70f5e94 | ||
|
|
0ae98dfc66 | ||
|
|
69b73f9cf0 | ||
|
|
fafb584881 | ||
|
|
84d0b1bcc5 | ||
|
|
c83dda89a4 | ||
|
|
fb3cccc257 | ||
|
|
00bbe958c4 | ||
|
|
145aa636b9 | ||
|
|
be2320d408 | ||
|
|
95d530f2b4 | ||
|
|
b43eb9678b | ||
|
|
9bb3a683fe | ||
|
|
6cc42927d8 | ||
|
|
88af0c8635 | ||
|
|
67b235735e | ||
|
|
9d27faa2c4 | ||
|
|
b0f78afe58 | ||
|
|
6a72e52520 | ||
|
|
b70fed48a7 | ||
|
|
200df8641b | ||
|
|
d9bc8455cb | ||
|
|
6cc0c9e6a9 | ||
|
|
dbfc8198a6 | ||
|
|
5783a52a9c | ||
|
|
d77ce4b998 | ||
|
|
d2698d1822 | ||
|
|
f90ba61478 | ||
|
|
cdec7e3ae5 | ||
|
|
5ca3dcd127 | ||
|
|
d6191f593d | ||
|
|
86a67f15a0 | ||
|
|
68cc173c6d | ||
|
|
0b92fa0e93 | ||
|
|
6df574b744 | ||
|
|
971c3d90eb | ||
|
|
107b05772a | ||
|
|
2f8596ee10 | ||
|
|
4908e5bf7a | ||
|
|
e6f147141e | ||
|
|
b6a869ef4f | ||
|
|
018e110cd1 | ||
|
|
3108a9ee38 | ||
|
|
19a855382c | ||
|
|
a09b747f30 | ||
|
|
e0297ca59b | ||
|
|
87b34c94fa | ||
|
|
9193062e70 | ||
|
|
0dc844de17 | ||
|
|
dc0b7364b5 | ||
|
|
f1d3ae7753 | ||
|
|
33b5f2f779 | ||
|
|
59a5262041 | ||
|
|
66a10b6e58 | ||
|
|
683c1c6583 | ||
|
|
4b0e36810a | ||
|
|
fab68aa1ed | ||
|
|
5faff9ebdf | ||
|
|
1b55010a04 | ||
|
|
f243ca199b | ||
|
|
3a34972672 | ||
|
|
39987cbc80 | ||
|
|
e3d2ae0bfd | ||
|
|
e911171e03 | ||
|
|
7b4370e5f8 | ||
|
|
651b8a06d6 | ||
|
|
9557020dc1 | ||
|
|
59be975322 | ||
|
|
73b4b86d29 | ||
|
|
de7fb33879 | ||
|
|
08cb8fce67 | ||
|
|
25ff181300 | ||
|
|
16e1d5b5ce | ||
|
|
b8966872b3 | ||
|
|
6ed8d41ddd | ||
|
|
bc96302fae | ||
|
|
c82828ec27 | ||
|
|
752571c7ba | ||
|
|
87339a22b1 | ||
|
|
99757cbeb2 | ||
|
|
2b46959075 | ||
|
|
f164704383 | ||
|
|
e0b59e7dbc | ||
|
|
7085a04a1e | ||
|
|
83fce75700 | ||
|
|
0e2bbac4e0 | ||
|
|
9631e29933 | ||
|
|
c8dbaf579c | ||
|
|
4f59041990 | ||
|
|
cdf5d91fe5 | ||
|
|
71cce3f45b | ||
|
|
58e892dadd | ||
|
|
96e423a665 | ||
|
|
be0bb2dc13 | ||
|
|
d2b8037ed0 | ||
|
|
178e2ce65f | ||
|
|
49c3a910c6 | ||
|
|
53c163cd5b | ||
|
|
728b04067d | ||
|
|
6fadbec797 | ||
|
|
b280a2d44d | ||
|
|
4f4f6dfce8 | ||
|
|
a29421bcfd | ||
|
|
6a371834d8 | ||
|
|
6cb1d26924 | ||
|
|
c215262db4 | ||
|
|
24dabec039 | ||
|
|
3bd9b08fb1 | ||
|
|
07703fa78e | ||
|
|
3b1d656da5 | ||
|
|
9bbca99107 | ||
|
|
75cfc77527 | ||
|
|
8c738fa90c | ||
|
|
ca4a0fce65 | ||
|
|
982b19dbd7 | ||
|
|
2c25507b81 | ||
|
|
6b9f559984 | ||
|
|
e6092f337c | ||
|
|
7cf787a2d1 | ||
|
|
4f91b72dbe | ||
|
|
56e6952e63 | ||
|
|
ff942c6b39 | ||
|
|
0fec213656 | ||
|
|
025f5c89c7 | ||
|
|
326ba25451 | ||
|
|
eb40dcb097 | ||
|
|
d3f3f2e455 | ||
|
|
af014c1a5e | ||
|
|
12486a6437 | ||
|
|
a23d8ad313 | ||
|
|
26c08a3f35 | ||
|
|
153629c99a | ||
|
|
29ec850478 | ||
|
|
1bb820a339 | ||
|
|
ed65b7b375 | ||
|
|
10f97f9424 | ||
|
|
fcad5e35fd | ||
|
|
899358e797 | ||
|
|
4561d9e07b | ||
|
|
698455384f | ||
|
|
b413c77583 | ||
|
|
d2ab314e08 | ||
|
|
51f7ba4147 | ||
|
|
26c5905a99 | ||
|
|
08c12de8e2 | ||
|
|
f6d889523d | ||
|
|
471c5701c3 | ||
|
|
f018be3b5f | ||
|
|
c344fbc285 | ||
|
|
311fe737e8 | ||
|
|
4c1d441159 | ||
|
|
9797482568 | ||
|
|
87286cc737 | ||
|
|
627f379f22 | ||
|
|
bc7cfd7cd7 | ||
|
|
976c6b0826 | ||
|
|
d9c67aebff | ||
|
|
f1ca485357 | ||
|
|
365fdbfc64 | ||
|
|
f4f037aa64 | ||
|
|
8c8d518723 | ||
|
|
234afa5be1 | ||
|
|
f30cba2ba4 | ||
|
|
8f23fd545d | ||
|
|
7cc17a0cea | ||
|
|
360ce526fd | ||
|
|
4e43afd973 | ||
|
|
d1e6a13179 | ||
|
|
007ddcd2cd | ||
|
|
49806864e4 | ||
|
|
530082932d | ||
|
|
4cdf9d4158 | ||
|
|
49ac083dc1 | ||
|
|
84641fcdf0 | ||
|
|
005448bdeb | ||
|
|
3fc01d9770 | ||
|
|
fa44659c66 | ||
|
|
dea49e3d19 | ||
|
|
1b8b097fad | ||
|
|
542156a6a1 | ||
|
|
416c14f644 | ||
|
|
7e62bc9828 | ||
|
|
0a42266824 | ||
|
|
f63a1f8409 | ||
|
|
41d811f41f | ||
|
|
c06af229dc | ||
|
|
81425598db | ||
|
|
73fcd43b85 | ||
|
|
2e389c6531 | ||
|
|
e1dc6e6d73 | ||
|
|
1de156abb1 | ||
|
|
74b6426ec6 | ||
|
|
f5bdce9cc0 | ||
|
|
95866a6445 | ||
|
|
0f8f863043 | ||
|
|
abfcd1fb00 | ||
|
|
413d38c43b | ||
|
|
c4eaf7e5a9 | ||
|
|
67706b8bb7 | ||
|
|
f4124e18cb | ||
|
|
fa2eaeafda | ||
|
|
040cf02724 | ||
|
|
c828ded0c2 | ||
|
|
c26cf84a08 | ||
|
|
02e0a0aa10 | ||
|
|
82d0ac7ac7 | ||
|
|
26aab0dc5d | ||
|
|
9b6acc27aa | ||
|
|
2c9bcb28be | ||
|
|
9e09fc0508 | ||
|
|
942b92a06e | ||
|
|
aff91f79ae | ||
|
|
d91f64fcbb | ||
|
|
6ee676c0e4 | ||
|
|
f9fec3a2d6 | ||
|
|
f6bce20e5e | ||
|
|
d157131439 | ||
|
|
fcba1459f2 | ||
|
|
43cb4ec76b | ||
|
|
39fec6003e | ||
|
|
e406613ee5 | ||
|
|
78d91ff074 | ||
|
|
2010071339 | ||
|
|
a4e10cdb07 | ||
|
|
94bedc60f4 | ||
|
|
1e37efb08b | ||
|
|
66293f6e98 | ||
|
|
9ad334085f | ||
|
|
8fe5712477 | ||
|
|
8d37b6c92b | ||
|
|
74c02066fe | ||
|
|
93aad55342 | ||
|
|
fdb0eb5825 | ||
|
|
3a9b08f156 | ||
|
|
9ef962f9ee | ||
|
|
de0066c697 | ||
|
|
8efe7a8304 | ||
|
|
79fd1f7f0b | ||
|
|
3148f1400e | ||
|
|
97d355c273 | ||
|
|
320cf729db | ||
|
|
b185751c3f | ||
|
|
b93a7cc99e | ||
|
|
ed44098cf6 | ||
|
|
b31d5ac639 | ||
|
|
cfe0f4226b | ||
|
|
771ba34ca7 | ||
|
|
6312e889b1 | ||
|
|
e06ce7562c | ||
|
|
b3af074a02 | ||
|
|
98990b9779 | ||
|
|
5724b54d2e | ||
|
|
8b2a3354f9 | ||
|
|
fdbfc9ceb7 | ||
|
|
3e853e627e | ||
|
|
96ede8cc9b | ||
|
|
ef27d56cc1 | ||
|
|
0c91a835ff | ||
|
|
827b9c5f1f | ||
|
|
509a676128 | ||
|
|
ce9caa237f | ||
|
|
e150bc4f2b | ||
|
|
b4712bf1ac | ||
|
|
dc578724b1 | ||
|
|
a745d19ce7 | ||
|
|
9cd510846e | ||
|
|
decd81838a | ||
|
|
52037d897d | ||
|
|
0f077a78ad | ||
|
|
1e7a0aa883 | ||
|
|
ae0dd0d89c | ||
|
|
c1ae6ea2f2 | ||
|
|
6b98a63974 | ||
|
|
b20c98e427 | ||
|
|
a0556fcbe1 | ||
|
|
41a41825f6 | ||
|
|
292e2ea5ad | ||
|
|
c8ffbcd9f1 | ||
|
|
4ff15512f5 | ||
|
|
ff05beeef3 | ||
|
|
44bebc0d52 | ||
|
|
6326b04b07 | ||
|
|
3aa1975c58 | ||
|
|
243c218c7a | ||
|
|
12798c620d | ||
|
|
100fc27ebb | ||
|
|
f90264d246 | ||
|
|
d104bfd5a6 | ||
|
|
5b8e1dabbc | ||
|
|
dcd911e24b | ||
|
|
558241166c | ||
|
|
145fac7fb1 | ||
|
|
4a537c1b88 | ||
|
|
d6088b2667 | ||
|
|
cde81a6675 | ||
|
|
d750927b36 | ||
|
|
8b754a9e02 | ||
|
|
0ad28fdd37 | ||
|
|
2d0b1ed7ad | ||
|
|
1b0a5cbaaa | ||
|
|
b281171030 | ||
|
|
5cb1fd2e32 | ||
|
|
763059ee09 | ||
|
|
3e667804eb | ||
|
|
a1bafc5566 | ||
|
|
1b15af9dd2 | ||
|
|
f8b90946ae | ||
|
|
6cb15403d3 | ||
|
|
a6ef3eb271 | ||
|
|
70966002c0 | ||
|
|
d2dadf32db | ||
|
|
1dd3b68c4f | ||
|
|
19194f87c5 | ||
|
|
3a7713ff10 | ||
|
|
f2ec46a7a7 | ||
|
|
0e0fbf7e6a | ||
|
|
92d4ed397b | ||
|
|
244675cab1 | ||
|
|
e7f64a7d41 | ||
|
|
70a5659a46 | ||
|
|
9fb186892c | ||
|
|
57388d8b2e | ||
|
|
69c35f990f | ||
|
|
dc8f4eed53 | ||
|
|
cb6b9eb19e | ||
|
|
8c87250816 | ||
|
|
0928f0f290 | ||
|
|
0aad61e802 | ||
|
|
190abcac9d | ||
|
|
8b6277a460 | ||
|
|
718032777d | ||
|
|
caaa59c559 | ||
|
|
51f2e8439e | ||
|
|
77e4abbc3e | ||
|
|
d104e5b91c | ||
|
|
c18ef0fed5 | ||
|
|
e4e1917936 | ||
|
|
d7c16fa372 | ||
|
|
12351a2591 | ||
|
|
9f986981f8 | ||
|
|
fe7e00d51a | ||
|
|
0d80040adf | ||
|
|
7e7e983781 | ||
|
|
7dc2c492e9 | ||
|
|
e58c036c27 | ||
|
|
e4ebeb630e | ||
|
|
389e2a07e6 | ||
|
|
df480e0357 | ||
|
|
55c1546f01 | ||
|
|
10e7c52a70 | ||
|
|
0f211048a0 | ||
|
|
67cc5c9218 | ||
|
|
b942c6339a | ||
|
|
8c2c7bb8a9 | ||
|
|
fe4b0f40d6 | ||
|
|
54520981a4 | ||
|
|
db6526f962 | ||
|
|
69fa7ef65d | ||
|
|
79265fe389 | ||
|
|
5a3639985a | ||
|
|
3dd573e858 | ||
|
|
03adceec62 | ||
|
|
8821eb24c2 | ||
|
|
0be4812c35 | ||
|
|
b49bec5580 | ||
|
|
0a72ac3770 | ||
|
|
79ce48d3f0 | ||
|
|
fa334ef0b7 | ||
|
|
97cf216c74 | ||
|
|
b5db0767d5 | ||
|
|
f810998871 | ||
|
|
85357abba1 | ||
|
|
03c2f62020 | ||
|
|
0a127d6a69 | ||
|
|
b6e0433755 | ||
|
|
26834b0524 | ||
|
|
8d7aade663 | ||
|
|
65e6ba9cce | ||
|
|
01349bbd70 | ||
|
|
46382a728a | ||
|
|
d36d5c34df | ||
|
|
199f90b138 | ||
|
|
22eb2d5084 | ||
|
|
3b593c9ec5 | ||
|
|
e13ed4a8d0 | ||
|
|
2c2397d333 | ||
|
|
00343a9af0 | ||
|
|
77eb8eabe2 | ||
|
|
0d4dc3a8b5 | ||
|
|
f549f2bf1d | ||
|
|
3b2577b4fe | ||
|
|
e01635eb9b | ||
|
|
eab65e214e | ||
|
|
134ab61131 | ||
|
|
71a9aefa0f | ||
|
|
42b8b77d9f | ||
|
|
bd69afbc83 | ||
|
|
4527de8cba | ||
|
|
bb3a1d5b67 | ||
|
|
6139459d45 | ||
|
|
98b64422bb | ||
|
|
ee2c12d48e | ||
|
|
0bca54444a | ||
|
|
526c54c979 | ||
|
|
52044fd1b1 | ||
|
|
638773628c | ||
|
|
eb99083d0b | ||
|
|
b66d225c6e | ||
|
|
4cf0ce5bb4 | ||
|
|
fb93ab4125 | ||
|
|
d0552949b9 | ||
|
|
56efe9cbc5 | ||
|
|
94b0481a56 | ||
|
|
8153a21613 | ||
|
|
2d9ab49239 | ||
|
|
554dc63328 | ||
|
|
de978991d8 | ||
|
|
061811f328 | ||
|
|
ece5c64504 | ||
|
|
ef523e5719 | ||
|
|
fcfec075e3 | ||
|
|
39ea27470c | ||
|
|
f5e486ebab | ||
|
|
7272dbdbc6 | ||
|
|
b5d58f11cb | ||
|
|
01bf209a3d | ||
|
|
e20d0c1cd0 | ||
|
|
ae2ac4fb1b | ||
|
|
d01b87d9c4 | ||
|
|
17021ea631 | ||
|
|
3742aeea4c | ||
|
|
c82ab45ee6 | ||
|
|
cb1a21b1d4 | ||
|
|
766430c743 | ||
|
|
bc0a552a84 | ||
|
|
908ee33f2d | ||
|
|
29e929de1e | ||
|
|
a3d7782c08 | ||
|
|
ee048aa3ab | ||
|
|
0df8ffe472 | ||
|
|
087d210679 | ||
|
|
3bf20e43cf | ||
|
|
197628846d | ||
|
|
c28f20f880 | ||
|
|
28a908471d | ||
|
|
5ded5e274f | ||
|
|
b7e36f8584 | ||
|
|
7b2536a1a2 | ||
|
|
cafcc7e67a | ||
|
|
44574bc39b | ||
|
|
2b0a7d63a8 | ||
|
|
65c27638ec | ||
|
|
3efcbadf6b | ||
|
|
cf24f561a3 | ||
|
|
84cf0c5280 | ||
|
|
c91ec225e6 | ||
|
|
8d70cc607c | ||
|
|
f013f15c89 | ||
|
|
21cc4c4985 | ||
|
|
6f60683802 | ||
|
|
d8f7a8655f | ||
|
|
6b6f2b1d2c | ||
|
|
8039086470 | ||
|
|
fe4b7420a3 | ||
|
|
b68c6bac96 | ||
|
|
2823ab47dc | ||
|
|
bce41fac94 | ||
|
|
1088638725 | ||
|
|
da00ff4999 | ||
|
|
59fa16f648 | ||
|
|
ff7f7ae386 | ||
|
|
b5144b245b | ||
|
|
7c87e092fb | ||
|
|
1a0edbca86 | ||
|
|
b5643cb2a6 | ||
|
|
d2defa3012 | ||
|
|
a4eee3d28f | ||
|
|
186364e24f | ||
|
|
779c93c523 | ||
|
|
8342f31af9 | ||
|
|
d2d53d4bb2 | ||
|
|
790f13df9c | ||
|
|
7d38a3b81c | ||
|
|
f1996ffebc | ||
|
|
028908ab7c | ||
|
|
8af0abde3f | ||
|
|
16b3f2c3ff | ||
|
|
5e765fe5e8 | ||
|
|
43cdbec3be | ||
|
|
6ab4a4c05c | ||
|
|
576b11662e | ||
|
|
64b41680fd | ||
|
|
90da5339c1 | ||
|
|
48918f5503 | ||
|
|
06f750c466 | ||
|
|
f9dae9e8d6 | ||
|
|
8f245486aa | ||
|
|
accc34c50f | ||
|
|
52a40e0fd5 | ||
|
|
2876141c42 | ||
|
|
2513538109 | ||
|
|
48f4b2be2b | ||
|
|
bba432f00e | ||
|
|
11e3cfce8b | ||
|
|
cbd4033619 | ||
|
|
9cb624986c | ||
|
|
2aefea5a2f | ||
|
|
28998a8cfe | ||
|
|
7003d6eff5 | ||
|
|
cdbecc48a1 | ||
|
|
19ff87a9db | ||
|
|
06428d853c | ||
|
|
4e1d6fca8e | ||
|
|
4fa13152af | ||
|
|
8ec31a3362 | ||
|
|
b15ab5de51 | ||
|
|
42529ddfb5 | ||
|
|
ea156359e9 | ||
|
|
a7300c8297 | ||
|
|
879eb16280 | ||
|
|
85f7b78e9b | ||
|
|
8a29e5ea5b | ||
|
|
a916d888f2 | ||
|
|
485d5b5dff | ||
|
|
e3413f08fd | ||
|
|
c4454d2efc | ||
|
|
80dd818290 | ||
|
|
c2ae39b8d6 | ||
|
|
cf2e68d960 | ||
|
|
b8d40be611 | ||
|
|
103990b640 | ||
|
|
94963ab39a | ||
|
|
2e5a8e071e | ||
|
|
0110c90382 | ||
|
|
e80cac6225 | ||
|
|
1adfd48448 | ||
|
|
f5db3f1f85 | ||
|
|
962a9e808c | ||
|
|
05e6f318c6 | ||
|
|
63607a0304 | ||
|
|
8e8f36f958 | ||
|
|
711a356468 | ||
|
|
8320af7ef3 | ||
|
|
d72c6940f8 | ||
|
|
4cf931db17 | ||
|
|
8293bb8a32 | ||
|
|
c05936ca13 | ||
|
|
72246d97a2 | ||
|
|
e57ed540e6 | ||
|
|
b433c42a56 | ||
|
|
584ae7b084 | ||
|
|
721f26520d | ||
|
|
66f77963a3 | ||
|
|
25a5e90289 | ||
|
|
5e37e10e41 | ||
|
|
54b409d650 | ||
|
|
e8d268fd5f | ||
|
|
9728723508 | ||
|
|
4d186f270f | ||
|
|
16788f461a | ||
|
|
a5d90c435c | ||
|
|
bfc2982f10 | ||
|
|
eaac88163a | ||
|
|
59b815b097 | ||
|
|
c0d8311f6b | ||
|
|
a38bda9fb2 | ||
|
|
97b0000c53 | ||
|
|
cbea40eaf2 | ||
|
|
4726504663 | ||
|
|
efcbe3b21a | ||
|
|
83b211ecb2 | ||
|
|
7cab4d6870 | ||
|
|
04122ad2d3 | ||
|
|
01b64fc36b | ||
|
|
b7c23ac3f5 | ||
|
|
a002f4f453 | ||
|
|
028b33b18a | ||
|
|
4e204f37fd | ||
|
|
e00c2ec5e3 | ||
|
|
3cac57658f | ||
|
|
fa378ee4d8 | ||
|
|
7ba30a4c2e | ||
|
|
5b58473b40 | ||
|
|
cfba1f5922 | ||
|
|
6c614fe585 | ||
|
|
89bed19513 | ||
|
|
fb7faefbf5 | ||
|
|
2c11718d79 | ||
|
|
3a219de586 | ||
|
|
3cd694c9f3 | ||
|
|
ac4791393e | ||
|
|
3210809d0a | ||
|
|
eb09b0644b | ||
|
|
3d4ae3ab4d | ||
|
|
d1a2628499 | ||
|
|
79f064f565 | ||
|
|
f52a8db280 | ||
|
|
0d8d04e585 | ||
|
|
b9d777734d | ||
|
|
74e8fa2e57 | ||
|
|
fcf9cfa137 | ||
|
|
ef496dc39d | ||
|
|
e6b06bc6c5 | ||
|
|
e62cdd0488 | ||
|
|
c4549b8573 | ||
|
|
460614125b | ||
|
|
46b0654347 | ||
|
|
72c412767d | ||
|
|
c171a0851a | ||
|
|
4f03f1bead | ||
|
|
35d0df919a | ||
|
|
4983bd348d | ||
|
|
43da0e6fe4 | ||
|
|
c96ef84427 | ||
|
|
942f8b5afb | ||
|
|
27ef0b0903 | ||
|
|
764dfbb1bf | ||
|
|
3ce4adf3c6 | ||
|
|
b3bc009a89 | ||
|
|
501b0b91be | ||
|
|
3b0f2cecff | ||
|
|
665a4e4a1d | ||
|
|
03a119eb70 | ||
|
|
421b6e89aa | ||
|
|
25118b0a26 | ||
|
|
94db871ecf | ||
|
|
a8692a0154 | ||
|
|
0696e78d64 | ||
|
|
fd1fc5080f | ||
|
|
acc120a37b | ||
|
|
bf6b5299b4 | ||
|
|
cbecd88199 | ||
|
|
9e5cd012e2 | ||
|
|
2689d262ec | ||
|
|
7332c4022f | ||
|
|
ab0b1f9f13 | ||
|
|
2126989a32 | ||
|
|
0df08c6a0c | ||
|
|
f145e35a93 | ||
|
|
df22ccb0de | ||
|
|
587f6c3117 | ||
|
|
71435ede81 | ||
|
|
c110fbcc99 | ||
|
|
09f2d386df | ||
|
|
03b5831f90 | ||
|
|
d53fccbce5 | ||
|
|
db1bf679d8 | ||
|
|
f03ea7045c | ||
|
|
f57d70d3c9 | ||
|
|
f69822c70e | ||
|
|
d439c092c2 | ||
|
|
24a1f6ecc5 | ||
|
|
ef35f4d6c1 | ||
|
|
fc57df283c | ||
|
|
b267dc458d | ||
|
|
d5c95f02af | ||
|
|
13d685bdab | ||
|
|
b031429dc3 | ||
|
|
54bb53bf32 | ||
|
|
e38fc6cc84 | ||
|
|
588ef72ce0 | ||
|
|
bcff53dfb5 | ||
|
|
79d9f62946 | ||
|
|
cafe446f42 | ||
|
|
6ac8c55989 | ||
|
|
b88c48177a | ||
|
|
71333b3f5b | ||
|
|
5aa75ebe71 | ||
|
|
ad31e5af56 | ||
|
|
3056c2ca76 | ||
|
|
3ebbf6ebf7 | ||
|
|
610436f242 | ||
|
|
88afc406ca | ||
|
|
13d6a1f67f | ||
|
|
bd270b48a7 | ||
|
|
bef9f56cac | ||
|
|
466cbfef1b | ||
|
|
7a38b63358 | ||
|
|
4eeeb756bc | ||
|
|
f038252ba5 | ||
|
|
51ffed1cd0 | ||
|
|
43d7cfca18 | ||
|
|
a979ab9d99 | ||
|
|
f55f478523 | ||
|
|
bea4827de0 | ||
|
|
518430db3a | ||
|
|
81a999c954 | ||
|
|
4f3c8b3972 | ||
|
|
c3ccbea5cd | ||
|
|
bbb38b8918 | ||
|
|
891a6f24a0 | ||
|
|
9e8d812ce9 | ||
|
|
567470b136 | ||
|
|
69ce415d38 | ||
|
|
ae77b4d553 | ||
|
|
0878293120 | ||
|
|
30d20cf405 | ||
|
|
2fe4558c10 | ||
|
|
5a49522ba7 | ||
|
|
eeece4f5ea | ||
|
|
b8c8e9c113 | ||
|
|
2bbb468428 | ||
|
|
ac722bbed6 | ||
|
|
f9cfd70946 | ||
|
|
0c4e735401 | ||
|
|
88f416a5ed | ||
|
|
12c8b27e24 | ||
|
|
09bb1d64dc | ||
|
|
6efc86df6a | ||
|
|
38f948a373 | ||
|
|
48dcb905f6 | ||
|
|
a962cca390 | ||
|
|
91ecfbcae8 | ||
|
|
158bfab922 | ||
|
|
4585330afe | ||
|
|
21964fa779 | ||
|
|
8ace421bfd | ||
|
|
3ce671284b | ||
|
|
6d5218bc7d | ||
|
|
a6e0a91a70 | ||
|
|
89b14fc0ff | ||
|
|
1c09cc1550 | ||
|
|
70bf121f21 | ||
|
|
2908f323e1 | ||
|
|
a44748b3d7 | ||
|
|
bceab40b02 | ||
|
|
e1bb241b51 | ||
|
|
e0d7c2cfa3 | ||
|
|
99c15e5661 | ||
|
|
ced0b14185 | ||
|
|
e3ac47771c | ||
|
|
707b1dee84 | ||
|
|
76fd364dfe | ||
|
|
925b467a4e | ||
|
|
1710bea355 | ||
|
|
7c07e75db9 | ||
|
|
c48b2a98d8 | ||
|
|
9166f85285 | ||
|
|
b30ad11b59 | ||
|
|
8da4831ed0 | ||
|
|
f0f941a59e | ||
|
|
baa6a925c2 | ||
|
|
624dd38d89 | ||
|
|
ef767a152b | ||
|
|
19a62589b2 | ||
|
|
4ac633bf21 | ||
|
|
7772f21b60 | ||
|
|
d3d8f1b972 | ||
|
|
5501a5a641 | ||
|
|
f01b241057 | ||
|
|
874260b40f | ||
|
|
9010f5fbab | ||
|
|
9dd979228d | ||
|
|
de0b8d601c | ||
|
|
703a1ffe52 | ||
|
|
c72223e2a9 | ||
|
|
bffb758243 | ||
|
|
62aaf56d1b | ||
|
|
8b3ba47f88 | ||
|
|
759fb36df3 | ||
|
|
799c7bdcb6 | ||
|
|
8527f00c3c | ||
|
|
ea9ee1fb7e | ||
|
|
bca6e35b2b | ||
|
|
497fe79f97 | ||
|
|
1ca5b6cd05 | ||
|
|
eab8bebced | ||
|
|
8430148ccb | ||
|
|
562bef5ff3 | ||
|
|
83b82f900f | ||
|
|
187fe27a6e | ||
|
|
de261713bf | ||
|
|
d3a84bea7b | ||
|
|
2d65f3c59a | ||
|
|
a7bdaabf60 | ||
|
|
1b3ebc32d7 | ||
|
|
0082ef271e | ||
|
|
2ed23314c3 | ||
|
|
915fa1e44f | ||
|
|
2b929c7f19 | ||
|
|
09ee29318f | ||
|
|
df3a8fcb62 | ||
|
|
d32971a8cb | ||
|
|
deb100fb17 | ||
|
|
216829e752 | ||
|
|
14b75a126f | ||
|
|
c050d0fa19 | ||
|
|
bf0802402d | ||
|
|
db993956d6 | ||
|
|
aa0308d618 | ||
|
|
50e147bd03 | ||
|
|
fa829b0fd3 | ||
|
|
2fe780b36c | ||
|
|
e357acc55b | ||
|
|
b8e9bf0993 | ||
|
|
3eb246485a | ||
|
|
7a6a77e07c | ||
|
|
82905fa3aa | ||
|
|
78487b6256 | ||
|
|
08ffce1a00 | ||
|
|
9e77b1a82e | ||
|
|
0ed1354119 | ||
|
|
daead5f5bb | ||
|
|
8eb1edc8ea | ||
|
|
fea524e145 | ||
|
|
f319e12621 | ||
|
|
984dc057e3 | ||
|
|
345df289eb | ||
|
|
8ddb334c2a | ||
|
|
07bcdc2f51 | ||
|
|
59b04427d3 | ||
|
|
20ced0ea1e | ||
|
|
a6a3bf6d47 | ||
|
|
a0198d065d | ||
|
|
4b77626add | ||
|
|
725fcf5587 | ||
|
|
bff9602966 | ||
|
|
691497babe | ||
|
|
4d3a907f73 | ||
|
|
3de406cc58 | ||
|
|
bbf7e8ed5e | ||
|
|
a8f96d3314 | ||
|
|
d3d776f978 | ||
|
|
3c4c36068e | ||
|
|
133036fdad | ||
|
|
1b89323e92 | ||
|
|
53aac9dde6 | ||
|
|
0c396c05fd | ||
|
|
37cbc355d5 | ||
|
|
588d885e81 | ||
|
|
1b0e054737 | ||
|
|
6f0740e67b | ||
|
|
0599cb7afa | ||
|
|
9cc2bd11d3 | ||
|
|
effc4469d0 | ||
|
|
1b8dd65d6e | ||
|
|
58655da3aa | ||
|
|
e3c1cf3b5b | ||
|
|
ddfc6b78cc | ||
|
|
dcecfc5f1b | ||
|
|
973153d1cc | ||
|
|
87d974bb8f | ||
|
|
62f7c7961d | ||
|
|
6050af4fd7 | ||
|
|
061ce7b0ac | ||
|
|
4ef8f06fe6 | ||
|
|
0a3fc1d9c8 | ||
|
|
2e16ae703e | ||
|
|
85404c5c55 | ||
|
|
e5cceffe6a | ||
|
|
bd2d90feff | ||
|
|
61cda1e34e | ||
|
|
0c7bf8132e | ||
|
|
cc0f608c7c | ||
|
|
1ae148909a | ||
|
|
404a4db611 | ||
|
|
448eab2587 | ||
|
|
93899cb0cb | ||
|
|
9f9a4cb928 | ||
|
|
61dfe5d2a9 | ||
|
|
292345fe62 | ||
|
|
4662ace916 | ||
|
|
562b469b35 | ||
|
|
d798866917 | ||
|
|
5709643289 | ||
|
|
ef1be160d6 | ||
|
|
e8bc80cf15 | ||
|
|
f3f3b12364 | ||
|
|
17bff6082a | ||
|
|
442c5c95ad | ||
|
|
1c2dd454db | ||
|
|
7f0047c2d5 | ||
|
|
ebc4d5cd29 | ||
|
|
eb7d762c55 | ||
|
|
f4154d2940 | ||
|
|
3a96469319 | ||
|
|
130be31cff | ||
|
|
f5a7de1ea7 | ||
|
|
48f65b3d57 | ||
|
|
25c1a5e804 | ||
|
|
9a16f1c7d0 | ||
|
|
3c733c57b7 | ||
|
|
e70702c620 | ||
|
|
306af25325 | ||
|
|
f8bfa54d0f | ||
|
|
041c983290 | ||
|
|
ab0d88142e | ||
|
|
b5e7b7870a | ||
|
|
612875765d | ||
|
|
77ecc5a41a | ||
|
|
6d8b082eed | ||
|
|
7a782164b9 | ||
|
|
b722aaa8c5 | ||
|
|
9b5098f509 | ||
|
|
876712a074 | ||
|
|
a13506b48f | ||
|
|
8adc6b8921 | ||
|
|
8caf7fdb05 | ||
|
|
5b02d564c3 | ||
|
|
901ebed8ff | ||
|
|
7097eca5a7 | ||
|
|
a3e3ad40b1 | ||
|
|
5208abe723 | ||
|
|
5f97c9a005 | ||
|
|
128d1bab2a | ||
|
|
701ae3c995 | ||
|
|
8cc9ac0df2 | ||
|
|
d05afa50e6 | ||
|
|
92057554d5 | ||
|
|
9057d3f17e | ||
|
|
fad91d16ea | ||
|
|
6bcd96c253 | ||
|
|
360f4b78dd | ||
|
|
b1c90a4e22 | ||
|
|
09130147cf | ||
|
|
7e8735b3fe | ||
|
|
87b6dc21c8 | ||
|
|
13a521e698 | ||
|
|
dcf6955c10 | ||
|
|
a58b6439de | ||
|
|
d38fac2230 | ||
|
|
8faf941109 | ||
|
|
91f1b250ec | ||
|
|
e5564a3f29 | ||
|
|
0df2f74d36 | ||
|
|
19f248400f | ||
|
|
fc80ee947a | ||
|
|
ff49299b48 | ||
|
|
15286c8361 | ||
|
|
1018e7d23f | ||
|
|
e81a89b116 | ||
|
|
3c52fd006e | ||
|
|
b6f6a1ca11 | ||
|
|
b62ecdc5bb | ||
|
|
3e8667d829 | ||
|
|
395b670e58 | ||
|
|
132ae752fa | ||
|
|
6b78b6bf72 | ||
|
|
8a9fdedc9e | ||
|
|
a2f2aa97ad | ||
|
|
cc83455534 | ||
|
|
3dbb3cdb6a | ||
|
|
073fbea0f5 | ||
|
|
87900b14da | ||
|
|
8475e1527d | ||
|
|
2a848fa727 | ||
|
|
08a334fa45 | ||
|
|
2dfed9f69a | ||
|
|
ae7ed8482e | ||
|
|
111305c1bd | ||
|
|
a845bf74ae | ||
|
|
82cfdb88fa | ||
|
|
d1eba2b18b | ||
|
|
8b2f5af2a0 | ||
|
|
64a06c5ffd | ||
|
|
149562555c | ||
|
|
f087206067 | ||
|
|
b74d119b34 | ||
|
|
72e18d7f19 | ||
|
|
c0d3f1f485 | ||
|
|
32a0752d49 | ||
|
|
6054dcc130 | ||
|
|
9c77169112 | ||
|
|
ede1acc1ed | ||
|
|
e8542b6220 | ||
|
|
d964b4c5aa | ||
|
|
f1b7c42524 | ||
|
|
1c174cc1aa | ||
|
|
4062a42aae | ||
|
|
0c3a7c075e | ||
|
|
1e6b72e8cb | ||
|
|
1e29fe65c3 | ||
|
|
3e2a2a76fd | ||
|
|
f91988979f | ||
|
|
c6846565cf | ||
|
|
1037f5c113 | ||
|
|
222f85fdf4 | ||
|
|
8dc87731c7 | ||
|
|
092fc42fbf | ||
|
|
24a671a8aa | ||
|
|
858f23094e | ||
|
|
c953ecfb9e | ||
|
|
3b16a89b3a | ||
|
|
7f30f13543 | ||
|
|
04c9169892 | ||
|
|
a3e5da07b4 | ||
|
|
38f3bf6610 | ||
|
|
f6fa20fd55 | ||
|
|
ff50310cc5 | ||
|
|
20d7c47d6e | ||
|
|
02ebcd8e26 | ||
|
|
7962eeef22 | ||
|
|
8cecc50b9d | ||
|
|
075605f304 | ||
|
|
220e2281e4 | ||
|
|
c60cdcda4e | ||
|
|
bd0baf2338 | ||
|
|
8e0d788842 | ||
|
|
d6188bdd27 | ||
|
|
bcf3c7d31c | ||
|
|
3e2abd12d3 | ||
|
|
38a0145869 | ||
|
|
432d54900e | ||
|
|
6d8b43c366 | ||
|
|
44d30f2d65 | ||
|
|
69d20f5352 | ||
|
|
a1e8fcc5ae | ||
|
|
5a2155dc71 | ||
|
|
56ec4e4f3c | ||
|
|
efca5456b8 | ||
|
|
f78f654131 | ||
|
|
70a8927a93 | ||
|
|
2cfab04037 | ||
|
|
17ac0316d0 | ||
|
|
412e413edc | ||
|
|
4c480551c3 | ||
|
|
99b210d7ea | ||
|
|
e38ae476ef | ||
|
|
2e1af6df49 | ||
|
|
1cb7b67ac3 | ||
|
|
dd175a4ede | ||
|
|
be1b55289f | ||
|
|
33af2720f2 | ||
|
|
6afdca885a | ||
|
|
20996dbc2b | ||
|
|
d64e070e26 | ||
|
|
d005cc5cc9 | ||
|
|
263e33a738 | ||
|
|
23b8931b62 | ||
|
|
e286480e34 | ||
|
|
de44eafd78 | ||
|
|
1e7769dfa3 | ||
|
|
61553ccdda | ||
|
|
09b8a5e2cf | ||
|
|
4e1e60fbf0 | ||
|
|
8cb5338f35 | ||
|
|
47a5d93256 | ||
|
|
f657d58fe1 | ||
|
|
6c121edc60 | ||
|
|
c626f8bd8f | ||
|
|
c95da949ec | ||
|
|
02699a3a8e | ||
|
|
d0a9e64245 | ||
|
|
d6ec8f668e | ||
|
|
5c38163787 | ||
|
|
d627083ed5 | ||
|
|
feb26d6c74 | ||
|
|
b057770f8a | ||
|
|
95b409c578 | ||
|
|
f6ce86af04 | ||
|
|
dc0556c8cd | ||
|
|
e697cfb6fc | ||
|
|
52b517c6ab | ||
|
|
710f8e2acc | ||
|
|
312ed83827 | ||
|
|
8bf5b8d352 | ||
|
|
9696c27c45 | ||
|
|
ea8969787c | ||
|
|
97296e405c | ||
|
|
ddc989333d | ||
|
|
dae73dbd28 | ||
|
|
dafe32d3bf | ||
|
|
7c51275bce | ||
|
|
3d7d994ffc | ||
|
|
39246f65df | ||
|
|
86214c9f16 | ||
|
|
5fd9adccdb | ||
|
|
1261b17129 | ||
|
|
88552c51ae | ||
|
|
55636e5526 | ||
|
|
9967c369c9 | ||
|
|
f46811633c | ||
|
|
2eb1274d6c | ||
|
|
1ba2c32135 | ||
|
|
effeeb5cf2 | ||
|
|
062759194b | ||
|
|
623f513071 | ||
|
|
09ac99f1f4 | ||
|
|
406f44a86b | ||
|
|
126e3ba2d3 | ||
|
|
cc82724fdc | ||
|
|
d9aa9b54cf | ||
|
|
5c9a262eb0 | ||
|
|
7a5977b5d6 | ||
|
|
794cb60f9e | ||
|
|
580ab7ba2c | ||
|
|
e142fe2be6 | ||
|
|
b6a742d76f | ||
|
|
37d529f818 | ||
|
|
1d7a46a588 | ||
|
|
4956e3c0a2 | ||
|
|
0cb4484d43 | ||
|
|
f23c45f7f4 | ||
|
|
b96ae6674d | ||
|
|
8971b59365 | ||
|
|
650a308634 | ||
|
|
4d22405f0f | ||
|
|
58a1d7ec30 | ||
|
|
9d1bad8960 | ||
|
|
eb4c9ed881 | ||
|
|
9b3472637e | ||
|
|
8f06547548 | ||
|
|
f0a440d886 | ||
|
|
2b91256c61 | ||
|
|
d22259426c | ||
|
|
a72284e264 | ||
|
|
9cec08e490 | ||
|
|
207901e7de | ||
|
|
d3426789d2 | ||
|
|
2c79f13634 | ||
|
|
860cb906a6 | ||
|
|
823604a4e0 | ||
|
|
7dd22c26e4 | ||
|
|
80b0225b98 | ||
|
|
cee4ce39a9 | ||
|
|
70dd6d4ea3 | ||
|
|
a55a9ff3c2 | ||
|
|
59274e8a33 | ||
|
|
9c7f89bf56 | ||
|
|
2de0611b43 | ||
|
|
7ea19d02fd | ||
|
|
317653b4df | ||
|
|
8a0ac5b422 | ||
|
|
73ea01cd64 | ||
|
|
6c28fcf661 | ||
|
|
5d9dc1c6d5 | ||
|
|
21724ecaec | ||
|
|
6461af1baa | ||
|
|
5e409c2f1a | ||
|
|
4b60e87afe | ||
|
|
3ac0ada758 | ||
|
|
f4e69e44ff | ||
|
|
68d840b47d | ||
|
|
85934bcf2a | ||
|
|
63c0d71213 | ||
|
|
0271b785a1 | ||
|
|
85bc8d02fa | ||
|
|
103a450d3a | ||
|
|
249361cab7 | ||
|
|
e83c6959db | ||
|
|
d4f82ea590 | ||
|
|
e505a1215c | ||
|
|
80c2fe9456 | ||
|
|
56aa2fd4c3 | ||
|
|
9d717f6bef | ||
|
|
e7ac6d8fcd | ||
|
|
1fde5f51b4 | ||
|
|
91bd144d2c | ||
|
|
a46c63bae7 | ||
|
|
17c88db158 | ||
|
|
efca334be2 | ||
|
|
9a3dd754be | ||
|
|
337c48db5f | ||
|
|
7ea7094314 | ||
|
|
9e26dab150 | ||
|
|
307f39ce9e | ||
|
|
11beac70e2 | ||
|
|
31ed87b0a9 | ||
|
|
205b9beb6b | ||
|
|
110f06578d | ||
|
|
c2b5ea218c | ||
|
|
5ab3ea3955 | ||
|
|
55bff5bab9 | ||
|
|
72824d8d2d | ||
|
|
c33790262b | ||
|
|
9f0b1a9bc6 | ||
|
|
00aee73692 | ||
|
|
5e1b7cadb4 | ||
|
|
fc8afd45c7 | ||
|
|
ad487d3226 | ||
|
|
c409aab397 | ||
|
|
75a0cf970f | ||
|
|
9812e31e8b | ||
|
|
82bc25d5ad | ||
|
|
8d88c00b77 | ||
|
|
eb57d1b9b1 | ||
|
|
fcc04e67c8 | ||
|
|
1343ee8d54 | ||
|
|
7c6f0147df | ||
|
|
8a03cf7a7b | ||
|
|
a7ce79124e | ||
|
|
b1be5409bd | ||
|
|
bbffd9e502 | ||
|
|
a2328dc73c | ||
|
|
68c8a69f4c | ||
|
|
8df6f9e544 | ||
|
|
8fd1c68f06 | ||
|
|
0325a21ff3 | ||
|
|
621b024b6e | ||
|
|
1f470b68d6 | ||
|
|
c85455a954 | ||
|
|
c8e447ee63 | ||
|
|
3ce5e6fe5e | ||
|
|
ed657e9d46 | ||
|
|
6c7c4aeab6 | ||
|
|
d00739ce56 | ||
|
|
0b3ecc05a6 | ||
|
|
934c82b8b8 | ||
|
|
efca5f8e78 | ||
|
|
3935adced0 | ||
|
|
5cfac21852 | ||
|
|
90802d628d | ||
|
|
c9b40da368 | ||
|
|
9e6498d5fa | ||
|
|
d3d35ec3ca | ||
|
|
cbdd92e184 | ||
|
|
da9b3340eb | ||
|
|
b4ff36a41b | ||
|
|
ed316ae350 | ||
|
|
74d94b0dd1 | ||
|
|
80711b0ff9 | ||
|
|
6c5b31bd80 | ||
|
|
8417870f51 | ||
|
|
61100788ad | ||
|
|
58002d56bc | ||
|
|
bb621f7c2e | ||
|
|
050bbf0bc4 | ||
|
|
e2d9018535 | ||
|
|
d6f5b8a2a6 | ||
|
|
2a88dd3bc1 | ||
|
|
598792ba91 | ||
|
|
d0e84b0088 | ||
|
|
90348a616d | ||
|
|
2f98451561 | ||
|
|
e8cf98c841 | ||
|
|
296ff04cdc | ||
|
|
ac1da4b407 | ||
|
|
9533e879f0 | ||
|
|
301f53c2aa | ||
|
|
af96447016 | ||
|
|
425b57bedc | ||
|
|
81cbd42cf5 | ||
|
|
9b3b37e498 | ||
|
|
83727a4c86 | ||
|
|
bc8489580c | ||
|
|
0f47f63746 | ||
|
|
682b66c0c1 | ||
|
|
ca028f4b37 | ||
|
|
d953856d87 | ||
|
|
752bbd6b42 | ||
|
|
d2298d225c | ||
|
|
d63a551f86 | ||
|
|
6b5a7033bb | ||
|
|
0b1920b202 | ||
|
|
9ccf0e527f | ||
|
|
bfa9db9dd6 | ||
|
|
dcc2dd5e1f | ||
|
|
3002c01f40 | ||
|
|
21e3b668cb | ||
|
|
ffb3ee6084 | ||
|
|
61d0b5af87 | ||
|
|
787a343b58 | ||
|
|
7ee8c5676b | ||
|
|
6d85da185c | ||
|
|
e1a72f0e2e | ||
|
|
4d64f36338 | ||
|
|
a7254f3df9 | ||
|
|
f2dd8dd2b9 | ||
|
|
362785f704 | ||
|
|
4877279efa | ||
|
|
5c35dff419 | ||
|
|
ad861e1354 | ||
|
|
6631983dd1 | ||
|
|
ed74db01f3 | ||
|
|
6394ba28c8 | ||
|
|
75db1995b6 | ||
|
|
e35b2d9617 | ||
|
|
038306a6c3 | ||
|
|
1768c72135 | ||
|
|
c0b461d9a1 | ||
|
|
98b56636c0 | ||
|
|
e9a1dd7930 | ||
|
|
a66e45693c | ||
|
|
2f2c9d47fd | ||
|
|
6788ad413f | ||
|
|
978a50c500 | ||
|
|
e7604b1ea7 | ||
|
|
2a65d29625 | ||
|
|
73ebea7a4d | ||
|
|
25122b986a | ||
|
|
77044ed5fa | ||
|
|
cbcb7fb019 | ||
|
|
c8ee19a618 | ||
|
|
53bec1c862 | ||
|
|
0fb44a2f93 | ||
|
|
69c3e1961b | ||
|
|
2b2736153d | ||
|
|
67913a0232 | ||
|
|
5e78f57087 | ||
|
|
f0d0fcc4aa | ||
|
|
3ec391ba36 | ||
|
|
4cc0a0878f | ||
|
|
7bff70268a | ||
|
|
7a8c729830 | ||
|
|
8b33a1d8e4 | ||
|
|
f63120be78 | ||
|
|
391f087981 | ||
|
|
24f9bf4180 | ||
|
|
d7a86ff05e | ||
|
|
7e28630f5e | ||
|
|
4198de280f | ||
|
|
99068639d9 | ||
|
|
c8f5bf88e1 | ||
|
|
4ae5e085ff | ||
|
|
c095ce1a1b | ||
|
|
5b161b09a3 | ||
|
|
53dc74e12f | ||
|
|
aeed966fe0 | ||
|
|
5ccdff48f3 | ||
|
|
a4dad95be3 | ||
|
|
52b9ede6db | ||
|
|
602a4637bf | ||
|
|
f67e8f243c | ||
|
|
4a6f4511c8 | ||
|
|
66570c1964 | ||
|
|
975d020286 | ||
|
|
af923154e2 | ||
|
|
f10150bc6a | ||
|
|
c02db3229e | ||
|
|
b368a3b438 | ||
|
|
911cbd0cef | ||
|
|
19e53512b8 | ||
|
|
6111c17a0e | ||
|
|
3c9fb3ec1a | ||
|
|
4a9f2de956 | ||
|
|
59f7232a30 | ||
|
|
566c67b758 | ||
|
|
61fdfcb137 | ||
|
|
ab190d38b7 | ||
|
|
3c0dd8196a | ||
|
|
247d880113 | ||
|
|
55048cdf79 | ||
|
|
36e75b7351 | ||
|
|
9d4c5a12f4 | ||
|
|
2a05fe784d | ||
|
|
e3925b741c | ||
|
|
2e40328c82 | ||
|
|
414fa4abae | ||
|
|
113b1e6e0c | ||
|
|
2a61e1cd49 | ||
|
|
12c02b378d | ||
|
|
6802c90d1f | ||
|
|
97853e07de | ||
|
|
594642b31d | ||
|
|
9a8e843ca3 | ||
|
|
e14aa64591 | ||
|
|
4e047d32b0 | ||
|
|
62f06fb885 | ||
|
|
161f7aacf7 | ||
|
|
2c185a9dfd | ||
|
|
74954ce7d8 | ||
|
|
502900c0bc | ||
|
|
81d3de7e6d | ||
|
|
7a272d92e3 | ||
|
|
cf78ce59b3 | ||
|
|
db6ea10948 | ||
|
|
07426ef29c | ||
|
|
5e91042fcb | ||
|
|
39280e1b57 | ||
|
|
fbe36a7ca9 | ||
|
|
11a06fe1e4 | ||
|
|
ca8be39b9e | ||
|
|
b3884c574b | ||
|
|
14475c77a6 | ||
|
|
cf7b680db9 | ||
|
|
1d5ff15a46 | ||
|
|
452df69964 | ||
|
|
4e7c37b87c | ||
|
|
4ab5476e89 | ||
|
|
5f95d9a75d | ||
|
|
bc8e9b340d | ||
|
|
4a34692903 | ||
|
|
6442cbef20 | ||
|
|
a14bb04c05 | ||
|
|
0304f1fc22 | ||
|
|
d664bf376d | ||
|
|
3599c71dae | ||
|
|
a48f73d0d3 | ||
|
|
f3d364122d | ||
|
|
2cfe7b847d | ||
|
|
0a51a6d3ac | ||
|
|
8838e14ac0 | ||
|
|
f918e57f8b | ||
|
|
7276ff9822 | ||
|
|
ea9f5b110a | ||
|
|
360885a7e9 | ||
|
|
839fb8e19b | ||
|
|
a9a252fda9 | ||
|
|
8a50f23fd3 | ||
|
|
fd713e1dc7 | ||
|
|
66601f13d9 | ||
|
|
a2f498a5ef | ||
|
|
1f50d711b2 | ||
|
|
df15472d34 | ||
|
|
e33e7d1a37 | ||
|
|
2680522d3a | ||
|
|
06ac129903 | ||
|
|
f423ec90fc | ||
|
|
5287703cce | ||
|
|
b309192ffd | ||
|
|
45adc907c9 | ||
|
|
340291c085 | ||
|
|
a91b140963 | ||
|
|
0248c87ec7 | ||
|
|
ab144f4843 | ||
|
|
47f5fd01e1 | ||
|
|
df215a67d4 | ||
|
|
4ed6688010 | ||
|
|
7dad30afe9 | ||
|
|
0aa1a8a005 | ||
|
|
e5a472229b | ||
|
|
e8aef84191 | ||
|
|
c2a62951f6 | ||
|
|
c72ae27be1 | ||
|
|
8b9dbdad27 | ||
|
|
1efac74958 | ||
|
|
98515742b7 | ||
|
|
1fce3f0ef8 | ||
|
|
ebfc90b505 | ||
|
|
26e580bbc4 | ||
|
|
3313ff1d1b | ||
|
|
9d49c93cb5 | ||
|
|
de2686c3e1 | ||
|
|
8bedde464f | ||
|
|
6a594fed96 | ||
|
|
f8defa3e09 | ||
|
|
aac5cbe025 | ||
|
|
9b0c7618c5 | ||
|
|
ab969bfaf8 | ||
|
|
15a6aa7500 | ||
|
|
7e4f755073 | ||
|
|
25ce5016f4 | ||
|
|
874321298b | ||
|
|
a5e67ad9e7 | ||
|
|
7f78e5857f | ||
|
|
19b4c27ebf | ||
|
|
89bfa419a5 | ||
|
|
e0e52f930e | ||
|
|
470ebe249f | ||
|
|
b1664daeb9 | ||
|
|
550f73ae3e | ||
|
|
3ef6433255 | ||
|
|
c365f56061 | ||
|
|
42a369620f | ||
|
|
60ad3aa917 | ||
|
|
e56ee67e13 | ||
|
|
aabdd5d045 | ||
|
|
29b0dc4ec8 | ||
|
|
a293f90db4 | ||
|
|
77ae87d367 | ||
|
|
0474ce6790 | ||
|
|
ad7c2a8938 | ||
|
|
daeb5c9e8f | ||
|
|
bd094103d7 | ||
|
|
b11d78b386 | ||
|
|
909a5b39d2 | ||
|
|
f11e730444 | ||
|
|
f07041e6cd | ||
|
|
fe838611f6 | ||
|
|
c6712ced20 | ||
|
|
5ceefec820 | ||
|
|
485ce139fd | ||
|
|
eb155ea6f6 | ||
|
|
b09c5889be | ||
|
|
01a864a29d | ||
|
|
634e7236f7 | ||
|
|
583f2e5999 | ||
|
|
fd013d17a2 | ||
|
|
67e352e4b1 | ||
|
|
e9257b859d | ||
|
|
778fb859c6 | ||
|
|
8cd07bb273 | ||
|
|
43bc1d7ec8 | ||
|
|
ff39d413a3 | ||
|
|
35e32225d1 | ||
|
|
81b4d45354 | ||
|
|
46513483cd | ||
|
|
dafd6d9137 | ||
|
|
a0702b54d1 | ||
|
|
a48a075535 | ||
|
|
56ab929c55 | ||
|
|
8d70294c31 | ||
|
|
36846f9b6b | ||
|
|
519dc2c114 | ||
|
|
9bed5dcb2c | ||
|
|
9de5043b50 | ||
|
|
38d8cd60ea | ||
|
|
6b50a9f5f4 | ||
|
|
448e0f4394 | ||
|
|
61af4207da | ||
|
|
3ec030535c | ||
|
|
2e6a263e29 | ||
|
|
5f2e90934e | ||
|
|
57fa247f53 | ||
|
|
9e101f2b01 | ||
|
|
bf8f4aa966 | ||
|
|
e6ede31554 | ||
|
|
71a8a3b78c | ||
|
|
a98d0717e8 | ||
|
|
da2f4b2dc4 | ||
|
|
45c0faf399 | ||
|
|
2b03ba5917 | ||
|
|
0da96cca59 | ||
|
|
30f24bb2df | ||
|
|
9493b7563b | ||
|
|
4733d0b1f0 | ||
|
|
c783aefb0f | ||
|
|
e42c74e141 | ||
|
|
f99fc29e62 | ||
|
|
6329633a3e | ||
|
|
aa95e5708f | ||
|
|
1a7830a92a | ||
|
|
c10caca34c | ||
|
|
2f1f22ab26 | ||
|
|
8ee9c53c77 | ||
|
|
d8d627e2d4 | ||
|
|
bc23ec8d05 | ||
|
|
f6e5b8986f | ||
|
|
97f7c06451 | ||
|
|
3e58696c07 | ||
|
|
41b4ec7952 | ||
|
|
e6f14d6df5 | ||
|
|
ee092f62ca | ||
|
|
f86ec1366f | ||
|
|
807fca6803 | ||
|
|
2ff593ad23 | ||
|
|
ff7fc093a1 | ||
|
|
df6e497793 | ||
|
|
3e5b568504 | ||
|
|
33e8e3d799 | ||
|
|
45b30a879b | ||
|
|
9526fef626 | ||
|
|
0634e3a8bc | ||
|
|
c501785112 | ||
|
|
9f3a20c76d | ||
|
|
ef123600ce | ||
|
|
6ede26cb9c | ||
|
|
845df3cd2e | ||
|
|
fda70b8b90 | ||
|
|
43d818a19c | ||
|
|
192d2e0803 | ||
|
|
88947dc4f0 | ||
|
|
7eaa956bae | ||
|
|
97375c475e | ||
|
|
d8579c6afd | ||
|
|
286389202f | ||
|
|
b6c66f735b | ||
|
|
eb565e1ce2 | ||
|
|
895968d8f8 | ||
|
|
df5d5d6342 | ||
|
|
cb06abe1e5 | ||
|
|
1f041fe73e | ||
|
|
fbb74784b5 | ||
|
|
bfb6a67d60 | ||
|
|
f71e4d8b43 | ||
|
|
f9f0e5c75c | ||
|
|
6e53cf8b3f | ||
|
|
3a05a6eaca | ||
|
|
1a5e513084 | ||
|
|
4ea6916974 | ||
|
|
97e13748fa | ||
|
|
8f23583d10 | ||
|
|
3d4a0211b6 | ||
|
|
6c32e155d3 | ||
|
|
6cdeb3b3fd | ||
|
|
36ef5643c3 | ||
|
|
c70dd70301 | ||
|
|
129217a4e9 | ||
|
|
910a859b9c | ||
|
|
5ad00f82c6 | ||
|
|
72bef516dc | ||
|
|
5ad93ab573 | ||
|
|
8bd7e4fad8 | ||
|
|
39ff40e5a2 | ||
|
|
72dd8778b9 | ||
|
|
52f93185c7 | ||
|
|
4c5e570706 | ||
|
|
07f3274ac4 | ||
|
|
430a7f1bed | ||
|
|
f9fea12555 | ||
|
|
068b733583 | ||
|
|
91cc2d8c4b | ||
|
|
cc5e9130bb | ||
|
|
9e976abad9 | ||
|
|
f263b29141 | ||
|
|
25d0e38048 | ||
|
|
555184663a | ||
|
|
d81afcb3a6 | ||
|
|
5a49f96505 | ||
|
|
8d37f80f4b | ||
|
|
7892918353 | ||
|
|
bb3e71466e | ||
|
|
6703a7f1e0 | ||
|
|
76afea90cf | ||
|
|
4612b07604 | ||
|
|
7dfbccf9bd | ||
|
|
68f2aa2715 | ||
|
|
49275524a5 | ||
|
|
d40af91b30 | ||
|
|
8da7202d0b | ||
|
|
b9574b995f | ||
|
|
db8736ad93 | ||
|
|
e65f6b4ce1 | ||
|
|
86e687086b | ||
|
|
6eca6b1ec0 | ||
|
|
a86747603c | ||
|
|
7a16e2a2a0 | ||
|
|
0866ecaf3f | ||
|
|
032f80efea | ||
|
|
f465949516 | ||
|
|
d89454e5d4 | ||
|
|
4125822bed | ||
|
|
105c35b9fd | ||
|
|
e576d4ec79 | ||
|
|
60aea96f84 | ||
|
|
ae30af44cf | ||
|
|
a763a4f4d9 | ||
|
|
8ca0b9a3c5 | ||
|
|
7c2869046e | ||
|
|
ba80d4d8a9 | ||
|
|
d4127717ac | ||
|
|
6e9f746a46 | ||
|
|
5895df4d0e | ||
|
|
a61066ea1b | ||
|
|
b8f006ef72 | ||
|
|
e6e6e87463 | ||
|
|
f0bf325495 | ||
|
|
4475b76535 | ||
|
|
8c9b2d1066 | ||
|
|
0b5bf70bff | ||
|
|
87d898929f | ||
|
|
4fddca09f1 | ||
|
|
b0eed65584 | ||
|
|
4f8dd28f7e | ||
|
|
cb14236bb4 | ||
|
|
39535d74df | ||
|
|
66b418d6f3 | ||
|
|
2f6cb66009 | ||
|
|
4d0416caf6 | ||
|
|
b22b5e341b | ||
|
|
2ec4cd5525 | ||
|
|
b8879d64dd | ||
|
|
6ad629895d | ||
|
|
bb3bf091d4 | ||
|
|
5087c62f18 | ||
|
|
2ce0961de1 | ||
|
|
0eb4c2157d | ||
|
|
c99962e4cd | ||
|
|
e0f47be9d0 | ||
|
|
43d75952ff | ||
|
|
dc99aa0c8c | ||
|
|
b70f8aec84 | ||
|
|
86bf3309bf | ||
|
|
a51063c13c | ||
|
|
595509bb4c | ||
|
|
cf2e4f44af | ||
|
|
082a4b6033 | ||
|
|
b622bc6305 | ||
|
|
0263f01475 | ||
|
|
f39fdf2610 | ||
|
|
c3b0d133aa | ||
|
|
f35773ad07 | ||
|
|
d9087c10ad | ||
|
|
9bcfc0745c | ||
|
|
496be457b6 | ||
|
|
860e7a7a5f | ||
|
|
4fa712c48f | ||
|
|
53f29d86c0 | ||
|
|
0fa3f2febd | ||
|
|
533797a607 | ||
|
|
d87ab5450b | ||
|
|
7df8a05129 | ||
|
|
cb71a7dab3 | ||
|
|
29f48d48e5 | ||
|
|
09994438e5 | ||
|
|
4e1e6a2d15 | ||
|
|
f5fbb707b2 | ||
|
|
f61277ecb0 | ||
|
|
2e5dfafcb0 | ||
|
|
5f5201db2f | ||
|
|
5f795efd4e | ||
|
|
33c33949b2 | ||
|
|
72589b60ad | ||
|
|
1b63bd16ed | ||
|
|
fc634cd92c | ||
|
|
86160a8807 | ||
|
|
82e9da9fb7 | ||
|
|
7c0f453b7c | ||
|
|
8e461673c4 | ||
|
|
b9540c28e9 | ||
|
|
6dbf49110b | ||
|
|
464f5d4e13 | ||
|
|
b8d63c10cd | ||
|
|
435ece5058 | ||
|
|
b92329667f | ||
|
|
6f5d95de6d | ||
|
|
b7419dfaad | ||
|
|
01148265cb | ||
|
|
320a56b89d | ||
|
|
b9cfd9527a | ||
|
|
63bd237892 | ||
|
|
907e569980 | ||
|
|
1f38046b51 | ||
|
|
202dd8387f | ||
|
|
9da75f39d9 | ||
|
|
e1f4b3f009 | ||
|
|
5342e3e925 | ||
|
|
5580907c58 | ||
|
|
318b1a0a03 | ||
|
|
73f53e12e4 | ||
|
|
0853730c35 | ||
|
|
2e76cd382f | ||
|
|
08bec7ab0a | ||
|
|
5a05992155 | ||
|
|
1ac133ea6f | ||
|
|
dea2331377 | ||
|
|
7c731ec9dd | ||
|
|
48334dc0b1 | ||
|
|
b6dafc1a47 | ||
|
|
22561dfbcf | ||
|
|
3770462ee3 | ||
|
|
bb7bf58cc7 | ||
|
|
4e108ef9b6 | ||
|
|
b62152bc84 | ||
|
|
af15b4e45a | ||
|
|
9ddfcfecca | ||
|
|
9e31e0837e | ||
|
|
468042fc84 | ||
|
|
fe6f363837 | ||
|
|
b7b0c92ac1 | ||
|
|
3c330b05b1 | ||
|
|
131546e733 | ||
|
|
cda4d56bcf | ||
|
|
bc1d758408 | ||
|
|
2957382991 | ||
|
|
73f4ec51fd | ||
|
|
94f8368cf9 | ||
|
|
e4dd5cd6fd | ||
|
|
d040f1d19d | ||
|
|
282cce1ea5 | ||
|
|
6593a96373 | ||
|
|
2b5b128cba | ||
|
|
57544ba1c5 | ||
|
|
feb77eab65 | ||
|
|
c3ffbf219c | ||
|
|
33118df8f9 | ||
|
|
b5637170b1 | ||
|
|
7e831bfba1 | ||
|
|
cd1ec27268 | ||
|
|
1345103c3a | ||
|
|
2e3e95ee89 | ||
|
|
c82fe30ca1 | ||
|
|
29626d8731 | ||
|
|
8b352bdc5d | ||
|
|
00974df3e5 | ||
|
|
b45698e676 | ||
|
|
ce5ddacaf4 | ||
|
|
8f5f213a6f | ||
|
|
1c7cd4aac3 | ||
|
|
40f29dd48a | ||
|
|
5b81897cf6 | ||
|
|
e5a47c8ce1 | ||
|
|
ca8cc71bd0 | ||
|
|
916f567d23 | ||
|
|
af6662d5e5 | ||
|
|
7b9a2f29b4 | ||
|
|
aea568b04a | ||
|
|
294bcb33e6 | ||
|
|
62e0ca05a6 | ||
|
|
0946474b5c | ||
|
|
866201bd74 | ||
|
|
a3c4e17c2a | ||
|
|
074af67dd3 | ||
|
|
d4859a55bc | ||
|
|
109f845e49 | ||
|
|
9244a64b59 | ||
|
|
2a7e7b1c46 | ||
|
|
481329ee7c | ||
|
|
f484cbf4c7 | ||
|
|
bb400d5697 | ||
|
|
e33d0de129 | ||
|
|
90e55c3357 | ||
|
|
50c1c1e12d | ||
|
|
74cc021ec2 | ||
|
|
080daf9ddd | ||
|
|
0adc6b29bd | ||
|
|
0c928b124c | ||
|
|
8874c51d04 | ||
|
|
3be4f097a3 | ||
|
|
b5aed43f04 | ||
|
|
0dcbe3f74a | ||
|
|
4e81cf7def | ||
|
|
a8417c128e | ||
|
|
8e96b8ab9b | ||
|
|
797aa97e19 | ||
|
|
8d82ec2130 | ||
|
|
0df804b9e7 | ||
|
|
e3ce73a214 | ||
|
|
54b1f8028a | ||
|
|
8275d7cd34 | ||
|
|
b2fd88ef7a | ||
|
|
ae8262a176 | ||
|
|
e03fae1447 | ||
|
|
1f7026e2a0 | ||
|
|
d75c338dd6 | ||
|
|
0d58353d66 | ||
|
|
b38f4712c4 | ||
|
|
4b555091e4 | ||
|
|
d02131d206 | ||
|
|
4227e9d79d | ||
|
|
23cf938e4f | ||
|
|
d793fcaabd | ||
|
|
b202483e47 | ||
|
|
1a894b39b3 | ||
|
|
86518c3b11 | ||
|
|
2d8ab90613 | ||
|
|
0b76321308 | ||
|
|
a6f2082b33 | ||
|
|
d1bf9cf1f8 | ||
|
|
0a2f1cb334 | ||
|
|
0b96c5bc3b | ||
|
|
2655269911 | ||
|
|
bd62203d13 | ||
|
|
d66cf5f32c | ||
|
|
fe804d9bc7 | ||
|
|
9be07f7fe1 | ||
|
|
ad41e778b4 | ||
|
|
dd3308851d | ||
|
|
4a2cb07808 | ||
|
|
a6aca21ced | ||
|
|
6d266219cc | ||
|
|
e047ec340d | ||
|
|
4eea3e45bd | ||
|
|
3c3d1d31c5 | ||
|
|
e85733a80b | ||
|
|
46dc393ff1 | ||
|
|
a807ac6660 | ||
|
|
2d39e1341c | ||
|
|
cecc351303 | ||
|
|
0580f9a9bf | ||
|
|
bea5e6eff6 | ||
|
|
967b7b0d8c | ||
|
|
f48c36f74f | ||
|
|
1361e87e80 | ||
|
|
b0f048e970 | ||
|
|
03a74efb16 | ||
|
|
8b9f7c6eb2 | ||
|
|
13fb6f7fa1 | ||
|
|
51300f36d6 | ||
|
|
6e522fb27b | ||
|
|
9f9332963a | ||
|
|
9a9edb0e8e | ||
|
|
3216f08b6d | ||
|
|
1d0193a733 | ||
|
|
f37cc8720b | ||
|
|
6f08fdbcca | ||
|
|
d56e1a3fcd | ||
|
|
276b0b174e | ||
|
|
3947269f97 | ||
|
|
d7de459b80 | ||
|
|
6e54f416ad | ||
|
|
1937c5e3c1 | ||
|
|
51c6867280 | ||
|
|
f9a74a2327 | ||
|
|
8fc3bac868 | ||
|
|
fae7b81589 | ||
|
|
c7f0341d88 | ||
|
|
a85a776268 | ||
|
|
7a1917d86f | ||
|
|
cbf73fcccd | ||
|
|
cd921c2c62 | ||
|
|
81b26dc555 | ||
|
|
b4510d57dc | ||
|
|
6d1af51de6 | ||
|
|
30bab52741 | ||
|
|
dcc3508890 | ||
|
|
4a42e408d2 | ||
|
|
a177d60e2b | ||
|
|
ae8906e7d1 | ||
|
|
518fa2e29a | ||
|
|
b85c4c445b | ||
|
|
8a3132a406 | ||
|
|
0b54514a86 | ||
|
|
63bff5434d | ||
|
|
e98a06d90f | ||
|
|
dae9752973 | ||
|
|
62af617f84 | ||
|
|
13699c1b33 | ||
|
|
2463dbb3fd | ||
|
|
6f726cf8c7 | ||
|
|
8db0bbe0dc | ||
|
|
fca713eba4 | ||
|
|
41d73e02a2 | ||
|
|
bb27885251 | ||
|
|
3cf2cbf904 | ||
|
|
24aded078f | ||
|
|
a8f666ebb8 | ||
|
|
4bb914bde9 | ||
|
|
d1f36accbf | ||
|
|
7d425a0a16 | ||
|
|
9eaf2329e7 | ||
|
|
d0beac70f4 | ||
|
|
e530507cb1 | ||
|
|
6d75c06e64 | ||
|
|
2dc17e93ee | ||
|
|
02aae22397 | ||
|
|
c9d3a81db0 | ||
|
|
033ab7ebb6 | ||
|
|
c6406f9e57 | ||
|
|
ea700a8851 | ||
|
|
632da2a393 | ||
|
|
c4161f32f5 | ||
|
|
c970968ee6 | ||
|
|
1dad95a3a9 | ||
|
|
7d73779446 | ||
|
|
1d78159e8f | ||
|
|
3d0627dc6a | ||
|
|
e27418ca3f | ||
|
|
a59483bd1d | ||
|
|
c9e5cfcc34 | ||
|
|
5bdcec67f0 | ||
|
|
e3d1808ef0 | ||
|
|
6636bfaa0a | ||
|
|
66767edf12 | ||
|
|
953561ab06 | ||
|
|
4f2ab03e97 | ||
|
|
f1762ff815 | ||
|
|
dc65cbd2e9 | ||
|
|
70baeba8a9 | ||
|
|
d4f1ab00d2 | ||
|
|
8ef683dead | ||
|
|
c444293be9 | ||
|
|
32e8692b06 | ||
|
|
5138992f3c | ||
|
|
a473b8dafb | ||
|
|
2ca63c8f79 | ||
|
|
137c361517 | ||
|
|
5a87bd168d | ||
|
|
a3c91c216f | ||
|
|
9a7fb3c988 | ||
|
|
dac4d486ec | ||
|
|
0ea0b921b7 | ||
|
|
a952231640 | ||
|
|
bb46b63e33 | ||
|
|
13b14300b9 | ||
|
|
a0c55dfe09 | ||
|
|
0ec57ea34c | ||
|
|
5d60b06b76 | ||
|
|
6bc9b2ef92 | ||
|
|
ee5366a410 | ||
|
|
c30f113712 | ||
|
|
5b8c62f7d1 | ||
|
|
180dfca03f | ||
|
|
0b0faceb19 | ||
|
|
5bca100afe | ||
|
|
093dfaf801 | ||
|
|
0665f0271e | ||
|
|
47c40bf18d | ||
|
|
dc2b4b2a81 | ||
|
|
6525c04522 | ||
|
|
0ce9cbab29 | ||
|
|
e76cd53431 | ||
|
|
02cc39f221 | ||
|
|
92789b16e5 | ||
|
|
a0159b4b29 | ||
|
|
fbdff52b44 | ||
|
|
5a21138e37 | ||
|
|
e9c7195471 | ||
|
|
8c6a7b5de4 | ||
|
|
c4f8f871c9 | ||
|
|
fcc38129a3 | ||
|
|
c70acbb1a3 | ||
|
|
e41e078159 | ||
|
|
e4bca19843 | ||
|
|
a0e9a510b0 | ||
|
|
c0d69a4883 | ||
|
|
d3532a4bf2 | ||
|
|
33685fee48 | ||
|
|
da96e07bbe | ||
|
|
712c74fc7a | ||
|
|
ea9006a5bc | ||
|
|
558e5ba2b0 | ||
|
|
7c57eb2aec | ||
|
|
c5c1dc5dda | ||
|
|
e681abe5cb | ||
|
|
cf1811a6d3 | ||
|
|
b46f10a11f | ||
|
|
a1138c6f2a | ||
|
|
dd53ceebe4 | ||
|
|
e232f6e735 | ||
|
|
ddbaeef1b3 | ||
|
|
09329cbb04 | ||
|
|
f22c248e4c | ||
|
|
ac58d3a665 | ||
|
|
11ea8da9c3 | ||
|
|
db78043d52 | ||
|
|
a128451004 | ||
|
|
08d8116f6b | ||
|
|
cd48649c61 | ||
|
|
d8f2880ca4 | ||
|
|
ec1589875c | ||
|
|
127f17a0ea | ||
|
|
c5d32b3c64 | ||
|
|
5dab4be53c | ||
|
|
89e398f075 | ||
|
|
855210ce0b | ||
|
|
28a86c3e56 | ||
|
|
504a80dc6d | ||
|
|
1fe450c62c | ||
|
|
09229820e7 | ||
|
|
5f3464cf4e | ||
|
|
355936dcde | ||
|
|
ea540c94f8 | ||
|
|
4b947310b2 | ||
|
|
09157369b3 | ||
|
|
e15e214747 | ||
|
|
7286b79521 | ||
|
|
486c74e72b | ||
|
|
70188499b0 | ||
|
|
81afb54c0a | ||
|
|
db98d6e4e0 | ||
|
|
5ea2a61596 | ||
|
|
fa94d55f87 | ||
|
|
4a329af418 | ||
|
|
4c16dd7c5c | ||
|
|
4476ce04dc | ||
|
|
d1d4695474 | ||
|
|
5a36d1b86f | ||
|
|
99ba903d46 | ||
|
|
9032bfce59 | ||
|
|
aed0ba3211 | ||
|
|
6d7242b485 | ||
|
|
a326eebac8 | ||
|
|
645c3b3713 | ||
|
|
22cf5a24db | ||
|
|
e514f575f3 | ||
|
|
1dbbaa7fa0 | ||
|
|
144b2a5338 | ||
|
|
02083412eb | ||
|
|
86727b15f3 | ||
|
|
bc02d47b21 | ||
|
|
711196cafa | ||
|
|
3fceb491d4 | ||
|
|
b6face1dce | ||
|
|
735b9d50a3 | ||
|
|
85827bde34 | ||
|
|
6057747e9e | ||
|
|
1db59afb75 | ||
|
|
7a7feb8cd3 | ||
|
|
105501c195 | ||
|
|
97970b05fe | ||
|
|
bf89872306 | ||
|
|
be2457aaca | ||
|
|
8012f2cb7a | ||
|
|
102b1d999d | ||
|
|
a52f59b437 | ||
|
|
6285fac232 | ||
|
|
7fcfb7b981 | ||
|
|
73318fa09d | ||
|
|
fa8ffaf9b2 | ||
|
|
1b6b090cdc | ||
|
|
14e6b07f63 | ||
|
|
342b8b2ed2 | ||
|
|
ea29cb4e46 | ||
|
|
a530c23d96 | ||
|
|
b57c1f51b9 | ||
|
|
a6f6532dfb | ||
|
|
a2b3c865c9 | ||
|
|
03e5da8429 | ||
|
|
4f32a59307 | ||
|
|
f123a1ab40 | ||
|
|
446beebd79 | ||
|
|
b52b4196ab | ||
|
|
12554380d5 | ||
|
|
d695486185 | ||
|
|
b64791c7e4 | ||
|
|
611dffabb6 | ||
|
|
6aa92d5289 | ||
|
|
7b2f5ab7f8 | ||
|
|
f0b8cc6a94 | ||
|
|
7a3971e433 | ||
|
|
80b5a52217 | ||
|
|
a87172f9b2 | ||
|
|
5749f91814 | ||
|
|
3422263414 | ||
|
|
f6479f2fb6 | ||
|
|
a16b3c3148 | ||
|
|
b1088d6bd2 | ||
|
|
bb6d468dd8 | ||
|
|
11b2ee7632 | ||
|
|
c11f3f8b0f | ||
|
|
6063ea62df | ||
|
|
5890272538 | ||
|
|
c321e9893d | ||
|
|
2320497992 | ||
|
|
794e7be4f8 | ||
|
|
d42098651b | ||
|
|
118b88e44f | ||
|
|
56074d1056 | ||
|
|
a93634007a | ||
|
|
464ced4a86 | ||
|
|
15d5378684 | ||
|
|
d722c8df73 | ||
|
|
7515360951 | ||
|
|
cbdcc1d5f3 | ||
|
|
f11291a220 | ||
|
|
9c29ac6feb | ||
|
|
952bbb86b5 | ||
|
|
296802c641 | ||
|
|
cd9515efd9 | ||
|
|
1f18648394 | ||
|
|
2ba3c10d62 | ||
|
|
849792e46b | ||
|
|
544877d12e | ||
|
|
0b1214c16b | ||
|
|
3884b4185a | ||
|
|
02039c9b53 | ||
|
|
42357645cb | ||
|
|
d3fbe3e3d1 | ||
|
|
fa556a1425 | ||
|
|
a6d8425382 | ||
|
|
5d6a03c9fe | ||
|
|
10ff559ec3 | ||
|
|
7c3c5c6861 | ||
|
|
5a84461e46 | ||
|
|
e1250a3333 | ||
|
|
5ba0be6166 | ||
|
|
d74c506044 | ||
|
|
dcc547d798 | ||
|
|
913789da3e | ||
|
|
df46c8e698 | ||
|
|
2a750bffcc | ||
|
|
8b980d729c | ||
|
|
57eb5cb9a0 | ||
|
|
6ff12c425e | ||
|
|
57d8172906 | ||
|
|
2219c64a04 | ||
|
|
5908bdab9a | ||
|
|
bce092aeb8 | ||
|
|
57de0b11db | ||
|
|
9f1b27bf76 | ||
|
|
8d27393aa2 | ||
|
|
8591057fa3 | ||
|
|
d4b726a1a6 | ||
|
|
9da29a6109 | ||
|
|
241ea7e595 | ||
|
|
17307e386e | ||
|
|
c87b7b7c69 | ||
|
|
ce9a54aa1f | ||
|
|
03fa258df7 | ||
|
|
cea3a95f9f | ||
|
|
cf05257fb7 | ||
|
|
a01e09502e | ||
|
|
9bf93de532 | ||
|
|
84a5a69d9f | ||
|
|
e5cc6388cb | ||
|
|
90d1e47323 | ||
|
|
4144024e6b | ||
|
|
939fba40fd | ||
|
|
ade8cf96e0 | ||
|
|
879a9e0548 | ||
|
|
702a923da7 | ||
|
|
473721979d | ||
|
|
00a1d61cc8 | ||
|
|
8b1082825c | ||
|
|
183f6c2077 | ||
|
|
a375c6ae9a | ||
|
|
19ed02b286 | ||
|
|
d39d3cec65 | ||
|
|
6b71e0b038 | ||
|
|
0b7fb01e67 | ||
|
|
d7e7161b27 | ||
|
|
9996b459e1 | ||
|
|
25eecd179b | ||
|
|
a6c3d7121b | ||
|
|
f9ad171085 | ||
|
|
09e60aa435 | ||
|
|
17595b5343 | ||
|
|
589e27948b | ||
|
|
d787a444c5 | ||
|
|
bc0118e519 | ||
|
|
b842fbd602 | ||
|
|
320e0020a2 | ||
|
|
e129630e9e | ||
|
|
5d80bdb6ae | ||
|
|
e5a0fbe500 | ||
|
|
de6e88c428 | ||
|
|
8e09b1e2e1 | ||
|
|
564a48643b | ||
|
|
d4af8a6b6a | ||
|
|
c7b24efd21 | ||
|
|
4b4d4afa0a | ||
|
|
06267f4d8d | ||
|
|
d23643051e | ||
|
|
8285f12864 | ||
|
|
c6029c75a4 | ||
|
|
07da49b095 | ||
|
|
a3750a9833 | ||
|
|
b4def4806c | ||
|
|
029180a93c | ||
|
|
6ce007e89a | ||
|
|
515f006b6e | ||
|
|
07812c47a4 | ||
|
|
97c9745063 | ||
|
|
41c1563584 | ||
|
|
f1391f33cd | ||
|
|
ea78d995e0 | ||
|
|
fd725efa8f | ||
|
|
7a7e88d44b | ||
|
|
6bf97808ee | ||
|
|
fac6db1b56 | ||
|
|
2b08bacd56 | ||
|
|
2fa260cef6 | ||
|
|
ae802e3867 | ||
|
|
7c90ff5d41 | ||
|
|
5e11b8a937 | ||
|
|
9c2969253b | ||
|
|
016fdab43e | ||
|
|
98e7d3506f | ||
|
|
ef9e716fd1 | ||
|
|
268bcbde7c | ||
|
|
ccdd979a69 | ||
|
|
7a48fd8455 | ||
|
|
fa7dcbec8b | ||
|
|
9bea4c8d58 | ||
|
|
818e56d44b | ||
|
|
23927751eb | ||
|
|
a6f246b9f5 | ||
|
|
c9f656baa9 | ||
|
|
d4f1e6a023 | ||
|
|
c032350f64 | ||
|
|
e190c9616e | ||
|
|
1eb547fec1 | ||
|
|
5171da5a6c | ||
|
|
65dced730f | ||
|
|
73cfda12bb | ||
|
|
ad61d77fa3 | ||
|
|
74d0a077ec | ||
|
|
899fffa395 | ||
|
|
987cbbc191 | ||
|
|
4c514a723c | ||
|
|
fd70d30a9c | ||
|
|
67652ddf27 | ||
|
|
38dde9684f | ||
|
|
aeb9bed63e | ||
|
|
ac54272218 | ||
|
|
79ecc8e9b7 | ||
|
|
bc47353bbe | ||
|
|
79944006e2 | ||
|
|
5cc29b80f2 | ||
|
|
dcc4fffe4d | ||
|
|
d1e5fbdde4 | ||
|
|
72aee8216c | ||
|
|
9bbc7e0bc7 | ||
|
|
2470d2ee92 | ||
|
|
a7b4af0ae5 | ||
|
|
5175864c0e | ||
|
|
43022eabf7 | ||
|
|
eaba4fc2bf | ||
|
|
5cf4ceff59 | ||
|
|
583c07bf8b | ||
|
|
97977640bd | ||
|
|
1128c0bf67 | ||
|
|
6ea61acf29 | ||
|
|
1ce4684a27 | ||
|
|
446d2ec19c | ||
|
|
8da020d39e | ||
|
|
9977831078 | ||
|
|
7eed71f8bb | ||
|
|
fcd0c3ebc0 | ||
|
|
15594eaf87 | ||
|
|
bb85e7751f | ||
|
|
1582cfebd6 | ||
|
|
477df1aaec | ||
|
|
38f117cb6d | ||
|
|
44234e9cc7 | ||
|
|
0ac2ef924f | ||
|
|
9bf2975f78 | ||
|
|
d9a5edb2b0 | ||
|
|
dd52737476 | ||
|
|
b3e60c7b25 | ||
|
|
d5e966154c | ||
|
|
d9b08d66d6 | ||
|
|
b2969a9155 | ||
|
|
fb8830a64f | ||
|
|
604f4fdf8c | ||
|
|
92c5634cbd | ||
|
|
99e19aa398 | ||
|
|
174a3a9a08 | ||
|
|
3b861db31d | ||
|
|
2629296c25 | ||
|
|
ceb5331a64 | ||
|
|
33e45bbe46 | ||
|
|
6570cd99e5 | ||
|
|
5a98fa4809 | ||
|
|
78da9cb052 | ||
|
|
5e14c8bec0 | ||
|
|
b0adaff67e | ||
|
|
bfc6b51d95 | ||
|
|
492fc0d752 | ||
|
|
b0aadbea6b | ||
|
|
8c0e87f9c3 | ||
|
|
bd8e4f656e | ||
|
|
226eff5104 | ||
|
|
3407dab07f | ||
|
|
179a7f6ffa | ||
|
|
a313f38c34 | ||
|
|
1b2f6f9e29 | ||
|
|
5d400cfd3a | ||
|
|
b14eeb3c1e | ||
|
|
c735b4663a | ||
|
|
40f675b64b | ||
|
|
4adadc38f4 | ||
|
|
97255c2651 | ||
|
|
56df0cbf93 | ||
|
|
74c8b5fd08 | ||
|
|
25b5bc01a6 | ||
|
|
cf1db4f304 | ||
|
|
ccf2a04ea2 | ||
|
|
a6ee3bac85 | ||
|
|
3cf4827ae0 | ||
|
|
ff456b3886 | ||
|
|
cdde22a27d | ||
|
|
9b1ff070e6 | ||
|
|
73b29d79b9 | ||
|
|
045bd4c7a4 | ||
|
|
6691aca229 | ||
|
|
f61b110cf6 | ||
|
|
0fcb3bd3a9 | ||
|
|
c4636a578c | ||
|
|
901d5fd0d2 | ||
|
|
32aadd9400 | ||
|
|
8139bb24c1 | ||
|
|
372a7c9a3e | ||
|
|
d2c47b4f87 | ||
|
|
a3604cf233 | ||
|
|
0e1a581916 | ||
|
|
7bfefb5250 | ||
|
|
83db91be41 | ||
|
|
c1aa8ea944 | ||
|
|
ee8522996a | ||
|
|
1879d8211d | ||
|
|
7e24a05cba | ||
|
|
e38eb0c5a4 | ||
|
|
0a0e90dcca | ||
|
|
50443f08e0 | ||
|
|
2944e03a03 | ||
|
|
007881b648 | ||
|
|
3cd09e7ba5 | ||
|
|
1d3142a882 | ||
|
|
81ac0d5088 | ||
|
|
cdd1d675a7 | ||
|
|
393f0071e4 | ||
|
|
8ab691726d | ||
|
|
1af52d28ca | ||
|
|
9d248f690a | ||
|
|
0cf03ab800 | ||
|
|
bc695475b9 | ||
|
|
fe74283e1d | ||
|
|
a6017660d8 | ||
|
|
5dd08c6c71 | ||
|
|
f23eb282c0 | ||
|
|
783f5019b0 | ||
|
|
39b9043bef | ||
|
|
d164989e3f | ||
|
|
b5359e40be | ||
|
|
ae87007478 | ||
|
|
634c4bf0b0 | ||
|
|
f7a9eea0d4 | ||
|
|
0003c701bc | ||
|
|
54e844cf08 | ||
|
|
3d4e4d8909 | ||
|
|
9481bc1009 | ||
|
|
5986a582d9 | ||
|
|
7fca101338 | ||
|
|
dbf0d6bb70 | ||
|
|
8ff7954165 | ||
|
|
38f8665f3a | ||
|
|
48d7a1edc1 | ||
|
|
3faa3b56f3 | ||
|
|
29cc78f824 | ||
|
|
e9b6b0b327 | ||
|
|
d59512f6f4 | ||
|
|
4a7562d28f | ||
|
|
c9627e0a0d | ||
|
|
5829716649 | ||
|
|
5a4c40beea | ||
|
|
914ff78df6 | ||
|
|
265cda97d7 | ||
|
|
1b24fc6678 | ||
|
|
43ddc04bb0 | ||
|
|
5cc1428d5f | ||
|
|
1a2c1c8a96 | ||
|
|
ee9af66990 | ||
|
|
c3bc48d451 | ||
|
|
f323f34353 | ||
|
|
55c65cc2d5 | ||
|
|
9911629de0 | ||
|
|
163485c8aa | ||
|
|
7bd94712a8 | ||
|
|
d89f8dce28 | ||
|
|
fe060916ec | ||
|
|
3a64c22cc1 | ||
|
|
069d973d74 | ||
|
|
7c5cc57ece | ||
|
|
f9d6b074cf | ||
|
|
353e2565d5 | ||
|
|
3fc9192d0d | ||
|
|
5535aa3d51 | ||
|
|
4d0456f827 | ||
|
|
4df999f85f | ||
|
|
893ebe7230 | ||
|
|
e227441248 | ||
|
|
cc1d61cbb3 | ||
|
|
dff1b5ad10 | ||
|
|
9922e4e433 | ||
|
|
754fde7325 | ||
|
|
1b1bee8099 | ||
|
|
0f16af7ee4 | ||
|
|
fc334b3a97 | ||
|
|
354150f4e1 | ||
|
|
bb08f0c219 | ||
|
|
2d348bb985 | ||
|
|
27af64ef46 | ||
|
|
8e246acd0e | ||
|
|
1e63cd69f8 | ||
|
|
124fbedc2f | ||
|
|
db73c71280 | ||
|
|
4962702e4a | ||
|
|
776754c33f | ||
|
|
9628e28aec | ||
|
|
01b3418e2e | ||
|
|
5a801d63d1 | ||
|
|
f8ce848d9b | ||
|
|
31f8fa222e | ||
|
|
6680c7fbf7 | ||
|
|
6eca948ca2 | ||
|
|
3def66ac3b | ||
|
|
431e43009c | ||
|
|
d2de8ba400 | ||
|
|
42eb5a6898 | ||
|
|
bbbcd1fee0 | ||
|
|
6da0593162 | ||
|
|
5a00d9d50f | ||
|
|
c8f9728de7 | ||
|
|
251d03197f | ||
|
|
a63fd0fe56 | ||
|
|
f08985c193 | ||
|
|
3e0a8f3ad8 | ||
|
|
4e6b9b0992 | ||
|
|
d429033fd7 | ||
|
|
6abbfa09ff | ||
|
|
bcad5403d6 | ||
|
|
f47ad10db7 | ||
|
|
6560ab9073 | ||
|
|
6bdc42cee7 | ||
|
|
ae8f8e7258 | ||
|
|
feea1330cc | ||
|
|
77fc61d539 | ||
|
|
4fe3007a1a | ||
|
|
83ff473d30 | ||
|
|
686d9f9cc6 | ||
|
|
61448bfc4e | ||
|
|
422d3c93bc | ||
|
|
debf389490 | ||
|
|
5c9b9c2e70 | ||
|
|
efdd73c8e4 | ||
|
|
aef0d8086b | ||
|
|
2d09ef8541 | ||
|
|
0ef8a86af2 | ||
|
|
678fa31136 | ||
|
|
9a701b0a70 | ||
|
|
3a9570386a | ||
|
|
85fb47c11c | ||
|
|
7628905a9b | ||
|
|
f870240dcf | ||
|
|
5d42cc3a44 | ||
|
|
98683d285c | ||
|
|
b8bfbdab48 | ||
|
|
5bc4efe820 | ||
|
|
380d12832c | ||
|
|
efc723787a | ||
|
|
71d67dbf48 | ||
|
|
ba2e4a2306 | ||
|
|
3e9f636b64 | ||
|
|
8078ed1f86 | ||
|
|
ff027d571b | ||
|
|
17ba821e60 | ||
|
|
d3fcd1c75a | ||
|
|
6135941eea | ||
|
|
8b4f1e05f9 | ||
|
|
5da4faf8c7 | ||
|
|
5f935f6c14 | ||
|
|
5506f99dfa | ||
|
|
ececd92f62 | ||
|
|
1f947f7b41 | ||
|
|
7b772f3f68 | ||
|
|
d5bdda74c1 | ||
|
|
6ea99721f1 | ||
|
|
1cf538a60a | ||
|
|
2dda6be799 | ||
|
|
565d862f3c | ||
|
|
b87669cbf4 | ||
|
|
2b07c9fcae | ||
|
|
746d487da8 | ||
|
|
ef54777fa5 | ||
|
|
17f3ffa633 | ||
|
|
ba0c32e2e1 | ||
|
|
9a6d2c35a1 | ||
|
|
8796ed2278 | ||
|
|
512016fd74 | ||
|
|
0e501f4ec5 | ||
|
|
ccf4afa256 | ||
|
|
f5e4047064 | ||
|
|
75f922c863 | ||
|
|
71651bf8b2 | ||
|
|
6789ab16d8 | ||
|
|
2a03d5802b | ||
|
|
8718fa54f6 | ||
|
|
24ac87f543 | ||
|
|
1d961a6630 | ||
|
|
5330fea954 | ||
|
|
cf4b5fc52a | ||
|
|
1d0fb850d9 | ||
|
|
4fe5e86a7e | ||
|
|
1be722a271 | ||
|
|
3c00ec4e48 | ||
|
|
cda1a38426 | ||
|
|
0e311717b5 | ||
|
|
7347fb3e2c | ||
|
|
5be6ab6cdb | ||
|
|
a055153cda | ||
|
|
f188b9d6d7 | ||
|
|
af9aa93e0c | ||
|
|
9c7c6e93e1 | ||
|
|
d5214b3627 | ||
|
|
db23af05b0 | ||
|
|
635986e433 | ||
|
|
e49be4768b | ||
|
|
37b6e10684 | ||
|
|
57642e2349 | ||
|
|
4fdebab005 | ||
|
|
f86ad1693f | ||
|
|
44a287987e | ||
|
|
e8b3751743 | ||
|
|
51224f12ca | ||
|
|
d9eb64928e | ||
|
|
6078c37be5 | ||
|
|
748469c71c | ||
|
|
fd3e84499e | ||
|
|
c209e57e50 | ||
|
|
072750e662 | ||
|
|
e55c486801 | ||
|
|
8ec21059dd | ||
|
|
0e1e00e68b | ||
|
|
bedca2e7a9 | ||
|
|
a834d93d2c | ||
|
|
2982e75a0b | ||
|
|
488aff085b | ||
|
|
33e919ae6f | ||
|
|
7fc794a8ec | ||
|
|
4fcbc1b64a | ||
|
|
9283e134e5 | ||
|
|
51ecba8da9 | ||
|
|
0c20c588af | ||
|
|
81a53e83ab | ||
|
|
60b93cca6d | ||
|
|
12a169e8ff | ||
|
|
293809b8b6 | ||
|
|
1aeaf8d289 | ||
|
|
5c1ffa165f | ||
|
|
2134982ea4 | ||
|
|
c5eb1b55d9 | ||
|
|
0906f945be | ||
|
|
28b21d15c3 | ||
|
|
5bce8ed118 | ||
|
|
2b126da395 | ||
|
|
5dc2b93311 | ||
|
|
9253333850 | ||
|
|
39b432e42a | ||
|
|
41ad33910f | ||
|
|
cf2b206a8e | ||
|
|
1872719b8c | ||
|
|
91757fa840 | ||
|
|
d4f4380f7e | ||
|
|
03dda31b75 | ||
|
|
32e309440f | ||
|
|
6744e59e46 | ||
|
|
4db608dbba | ||
|
|
ae5d613b3e | ||
|
|
4593c04959 | ||
|
|
cde80d9859 | ||
|
|
ff953dccf1 | ||
|
|
13a3bf5b7d | ||
|
|
361759d179 | ||
|
|
1b589be1d6 | ||
|
|
49cd211dff | ||
|
|
b14dd49222 | ||
|
|
a8c2bb41af | ||
|
|
03123435e0 | ||
|
|
4bbab14346 | ||
|
|
0e8d858aba | ||
|
|
d8642a8aa6 | ||
|
|
cf909e8725 | ||
|
|
758f12f34c | ||
|
|
083ee0f8b7 | ||
|
|
9acd76ed6e | ||
|
|
72e4a49cac | ||
|
|
8d5e05668b | ||
|
|
7059be19ec | ||
|
|
1c9a85b9a6 | ||
|
|
06634f48eb | ||
|
|
5185c15ef7 | ||
|
|
49888a01c3 | ||
|
|
883b3e2873 | ||
|
|
fd3cd755d1 | ||
|
|
9395786d11 | ||
|
|
3d551e5538 | ||
|
|
a5be730906 | ||
|
|
1c5d5e0b72 | ||
|
|
7d4e8a9a71 | ||
|
|
f4f05a8851 | ||
|
|
e07f568230 | ||
|
|
3aa5cfde10 | ||
|
|
5033da733d | ||
|
|
cf5ae13f85 | ||
|
|
7068912fbb | ||
|
|
e8c2453f6d | ||
|
|
aaa1f451e6 | ||
|
|
94914135df | ||
|
|
d408de87fc | ||
|
|
e8795cea30 | ||
|
|
a8e1e8d057 | ||
|
|
e15221a8de | ||
|
|
fe3e419687 | ||
|
|
ffbbc465d3 | ||
|
|
6cd32fb62e | ||
|
|
a4906c7c83 | ||
|
|
0a3eff8021 | ||
|
|
78520ba482 | ||
|
|
0b925d075d | ||
|
|
81f5ed5c65 | ||
|
|
7db5c8a10d | ||
|
|
24c6d26cca | ||
|
|
adec544fdd | ||
|
|
31b59400f8 | ||
|
|
1a1214866f | ||
|
|
e9aacd40c6 | ||
|
|
a6bc68a83b | ||
|
|
4b19bd2896 | ||
|
|
d9fbb8a580 | ||
|
|
3214116be6 | ||
|
|
71009ad3fe | ||
|
|
65037eeb32 | ||
|
|
dc8c079d90 | ||
|
|
e59b3f0eb3 | ||
|
|
b2a2bb736b | ||
|
|
c38dd24dc5 | ||
|
|
f72ac17c89 | ||
|
|
cf49fc7bfe | ||
|
|
f291fbc8a7 | ||
|
|
95638c9b0d | ||
|
|
b5b83b210b | ||
|
|
505178d82b | ||
|
|
8052dd0022 | ||
|
|
5459e5c606 | ||
|
|
b3c0359b56 | ||
|
|
d489555553 | ||
|
|
f7c5334195 | ||
|
|
23cf556c6c | ||
|
|
552cf28260 | ||
|
|
eeaf1ef970 | ||
|
|
93cb09642d | ||
|
|
eeb54c63d8 | ||
|
|
28db0c2562 | ||
|
|
66deea10c7 | ||
|
|
6fdb874e2e | ||
|
|
2a4568c85f | ||
|
|
402bcb83bc | ||
|
|
8ab3c3e7c3 | ||
|
|
a585c5bbb3 | ||
|
|
2c1ca4078d | ||
|
|
528015e0d8 | ||
|
|
138593b156 | ||
|
|
f0f247d7e5 | ||
|
|
e0d6f14b22 | ||
|
|
cb97cdb256 | ||
|
|
e4eeaa7fbc | ||
|
|
07ab34cd58 | ||
|
|
f5f7cb9264 | ||
|
|
56f200af5d | ||
|
|
8acea2693d | ||
|
|
5ebf6049d0 | ||
|
|
d75b63bc3c | ||
|
|
7067a7155f | ||
|
|
352b8c3ad5 | ||
|
|
49e0f14a2f | ||
|
|
a9d8cac4b0 | ||
|
|
299671b731 | ||
|
|
f18d9d8466 | ||
|
|
c7e0c64506 | ||
|
|
bb2acd5e75 | ||
|
|
eda1edd07f | ||
|
|
9a26946aaa | ||
|
|
0ed3532699 | ||
|
|
65f2e72d77 | ||
|
|
0fd1656d63 | ||
|
|
02746eddd6 | ||
|
|
341e41726f | ||
|
|
11a784d6da | ||
|
|
fa344d8514 | ||
|
|
0174ceb6b2 | ||
|
|
458bbb4687 | ||
|
|
1662c37c40 | ||
|
|
dcd41ca864 | ||
|
|
078a48a97b | ||
|
|
98341daee2 | ||
|
|
02729d4af7 | ||
|
|
6961bc568f | ||
|
|
bd05d83ae7 | ||
|
|
c926ab7746 | ||
|
|
8921bf454d | ||
|
|
4c6f4dabf5 | ||
|
|
9fd5e3c89c | ||
|
|
9472812569 | ||
|
|
ddad872020 | ||
|
|
6a57a42109 | ||
|
|
3a00470dbb | ||
|
|
5f30377bbc | ||
|
|
4e50197e53 | ||
|
|
e7c4f8cdaa | ||
|
|
b64a521d66 | ||
|
|
8e2530c320 | ||
|
|
870aa3d97f | ||
|
|
ace2be8aa6 | ||
|
|
82daa46e26 | ||
|
|
4f7f43762d | ||
|
|
e65c27062f | ||
|
|
e51aef7f3c | ||
|
|
208290b524 | ||
|
|
e5bb8abc9d | ||
|
|
8dbfe5ea8f | ||
|
|
30dadfc033 | ||
|
|
781d51285d | ||
|
|
fb645f75fb | ||
|
|
50c38dec70 | ||
|
|
16cb45103f | ||
|
|
2085909aeb | ||
|
|
6bf294d71a | ||
|
|
367b87d26d | ||
|
|
49066042a2 | ||
|
|
480164f923 | ||
|
|
99a5d1e293 | ||
|
|
ac2404283e | ||
|
|
c9e505791a | ||
|
|
abd3f8a02a | ||
|
|
4be4b5f6f4 | ||
|
|
554b02a14c | ||
|
|
d700a6f74a | ||
|
|
7a706e4206 | ||
|
|
6eb0b6ac27 | ||
|
|
760fb17bbf | ||
|
|
792c7caf40 | ||
|
|
4e3c5d88b3 | ||
|
|
c8dba94ff6 | ||
|
|
a7763d55e4 | ||
|
|
2b8a9a8358 | ||
|
|
a7e1efc5bd | ||
|
|
b1901cd5a5 | ||
|
|
facb904c5d | ||
|
|
70a8fb3763 | ||
|
|
1191ca052f | ||
|
|
8e9f59a452 | ||
|
|
0bceaaa3d4 | ||
|
|
3d948d85ce | ||
|
|
0315251d01 | ||
|
|
515dc2161b | ||
|
|
a6b8586e94 | ||
|
|
2072925f12 | ||
|
|
94cd83ef34 | ||
|
|
82ce3481fe | ||
|
|
192234c689 | ||
|
|
2998e3bafa | ||
|
|
24de2bd58c | ||
|
|
8a52fb7aeb | ||
|
|
8f8dcf8ed6 | ||
|
|
ce8c30c9de | ||
|
|
d49d53fd49 | ||
|
|
8c8534046c | ||
|
|
f8ca6b383c | ||
|
|
0a8bd34b69 | ||
|
|
02ed0ec93b | ||
|
|
898afbaf34 | ||
|
|
5e86d01385 | ||
|
|
0172cb39f0 | ||
|
|
8ec12339f5 | ||
|
|
d3f04933f1 | ||
|
|
6b430a95c9 | ||
|
|
5aadeae888 | ||
|
|
b69c6a03b1 | ||
|
|
c9e12204a2 | ||
|
|
23172c5d85 | ||
|
|
e2db605308 | ||
|
|
242161bef2 | ||
|
|
5a25338ac0 | ||
|
|
67f7fe5e5c | ||
|
|
bbdd61dc3f | ||
|
|
a2f70da4c9 | ||
|
|
aa491518f4 | ||
|
|
444b33584d | ||
|
|
0499618c2b | ||
|
|
8825c74e7a | ||
|
|
2c0d91be6c | ||
|
|
ba792ea202 | ||
|
|
4c21aa736f | ||
|
|
7b119f8b38 | ||
|
|
f541043618 | ||
|
|
fc175a089d | ||
|
|
f62979da6b | ||
|
|
20905d9d62 | ||
|
|
1b5ec7017d | ||
|
|
7105aeb22f | ||
|
|
ca35ba640a | ||
|
|
95b252e86d | ||
|
|
a8e9923b44 | ||
|
|
9bb890271b | ||
|
|
a620b7298f | ||
|
|
51bd1b4483 | ||
|
|
545e10f239 | ||
|
|
cb79614f73 | ||
|
|
eda21cccb4 | ||
|
|
b93faf9afa | ||
|
|
1c7057f09c | ||
|
|
f1a4f17897 | ||
|
|
7d0252eae2 | ||
|
|
125b868e06 | ||
|
|
70c3e661b8 | ||
|
|
e0d30b545a | ||
|
|
3f48276bf9 | ||
|
|
9bd3942f70 | ||
|
|
84c10265db | ||
|
|
01a8d270cf | ||
|
|
964ed9739b | ||
|
|
1c6671aa67 | ||
|
|
187f191558 | ||
|
|
cbf2a2233e | ||
|
|
81ad8106dc | ||
|
|
cf86527a28 | ||
|
|
b05daaaf69 | ||
|
|
73f207fe59 | ||
|
|
1d088fb906 | ||
|
|
c2e2479cc5 | ||
|
|
e48f0d1dd9 | ||
|
|
4ce100fa62 | ||
|
|
ed5f4f3a44 | ||
|
|
6bed15e074 | ||
|
|
4b48042c17 | ||
|
|
bc76624ec7 | ||
|
|
f3cd7bbe77 | ||
|
|
459440842f | ||
|
|
9854216d36 | ||
|
|
5bc00abed7 | ||
|
|
5f88097eb4 | ||
|
|
14414f81f3 | ||
|
|
c9dde726c6 | ||
|
|
1ffdad010b | ||
|
|
d6072766ed | ||
|
|
009b4569b3 | ||
|
|
5f3906b65e | ||
|
|
02da5ed4a1 | ||
|
|
e65e6039a8 | ||
|
|
431e72cbe8 | ||
|
|
94be898fbc | ||
|
|
4e80587cbe | ||
|
|
10d8adb089 | ||
|
|
9c85357846 | ||
|
|
d127d15d1b | ||
|
|
cbd1f1481c | ||
|
|
fe89caba2e | ||
|
|
0e390d69a8 | ||
|
|
ce347124e6 | ||
|
|
b3b81d67ff | ||
|
|
cd232a9cce | ||
|
|
cec775a0de | ||
|
|
0bb47b6c97 | ||
|
|
de6d663a67 | ||
|
|
bca16a0581 | ||
|
|
adc06dd705 | ||
|
|
0377b12964 | ||
|
|
a6942b345d | ||
|
|
09af242c89 | ||
|
|
0c3b6aba7a | ||
|
|
6056d2ea2c | ||
|
|
e43d6fc879 | ||
|
|
41f213be18 | ||
|
|
a0134ff0f8 | ||
|
|
9be6c501ec | ||
|
|
935f8437fd | ||
|
|
9e8df0e836 | ||
|
|
78d33f4fd5 | ||
|
|
0055dd133d | ||
|
|
3104662bab | ||
|
|
62d9bff06b | ||
|
|
987cbe35c6 | ||
|
|
55e964ec19 | ||
|
|
55d7352189 | ||
|
|
8f0b4e9111 | ||
|
|
55a6f01732 | ||
|
|
ef9f4046c9 | ||
|
|
92da636b97 | ||
|
|
501136b999 | ||
|
|
75f0cf471a | ||
|
|
d62b0f442a | ||
|
|
f86a214357 | ||
|
|
0c1aa36835 | ||
|
|
16818ff250 | ||
|
|
1a5acd9850 | ||
|
|
c82d64649c | ||
|
|
78e49f1c88 | ||
|
|
a26f7d753d | ||
|
|
82813f2f8c | ||
|
|
3c7873bd3f | ||
|
|
2fa4de001c | ||
|
|
b480184fd6 | ||
|
|
7f5320b167 | ||
|
|
80a8e71fe0 | ||
|
|
74b7fa29a1 | ||
|
|
0e713e7482 | ||
|
|
72262060db | ||
|
|
8840ce340d | ||
|
|
31854c7990 | ||
|
|
d89de07758 | ||
|
|
29e867aaa0 | ||
|
|
311a62dea7 | ||
|
|
4b216d266a | ||
|
|
d4345e1ff8 | ||
|
|
895f89d62a | ||
|
|
15ec99ec59 | ||
|
|
35c14f637e | ||
|
|
2fca40e44f | ||
|
|
e97a481785 | ||
|
|
19f475c573 | ||
|
|
3768aaaea4 | ||
|
|
c4876d01a1 | ||
|
|
ab5c0dd63e | ||
|
|
0f143f6c23 | ||
|
|
b58db3cd73 | ||
|
|
1369d606f7 | ||
|
|
fe3d8f2411 | ||
|
|
2b34363d03 | ||
|
|
9514a4d547 | ||
|
|
0de138acb5 | ||
|
|
f73b6e2190 | ||
|
|
8c56284776 | ||
|
|
c93e0aaf06 | ||
|
|
e84395ff8c | ||
|
|
cbbf9e43d1 | ||
|
|
cbd2c3945b | ||
|
|
36a45c4e0d | ||
|
|
022c083848 | ||
|
|
44ad6a7db2 | ||
|
|
5b740c488f | ||
|
|
78be1e4930 | ||
|
|
d8af9d8edf | ||
|
|
c46cbe0de4 | ||
|
|
c489c2c1b5 | ||
|
|
2420f07e94 | ||
|
|
2663c69f8d | ||
|
|
f987ecf45b | ||
|
|
ed5f1162fa | ||
|
|
caba9c70c3 | ||
|
|
e232f09d38 | ||
|
|
1036aa9762 | ||
|
|
0a539865dd | ||
|
|
45948e054d | ||
|
|
53a9869ff7 | ||
|
|
fea6f829bf | ||
|
|
4274e6b7d0 | ||
|
|
50148022d1 | ||
|
|
9599607065 | ||
|
|
ac3a2d899a | ||
|
|
a9b962a653 | ||
|
|
0b7bda8f46 | ||
|
|
da9323040f | ||
|
|
320d3e9d33 | ||
|
|
cd4f94e71a | ||
|
|
307e70afaf | ||
|
|
1f0963558c | ||
|
|
4e40e8804b | ||
|
|
0914d33842 | ||
|
|
23d680bb85 | ||
|
|
ce2d5ad0d7 | ||
|
|
976926376d | ||
|
|
c6c77d535f | ||
|
|
67eeedd602 | ||
|
|
1c7670aca2 | ||
|
|
d0128787e7 | ||
|
|
7a2e6d674a | ||
|
|
ed0c109950 | ||
|
|
d2cff34fa3 | ||
|
|
f7ff548dd0 | ||
|
|
c90e44e582 | ||
|
|
8e5b91c79b | ||
|
|
032f651824 | ||
|
|
35dd0fb271 | ||
|
|
615d890622 | ||
|
|
8ab238e7de | ||
|
|
15bb392afd | ||
|
|
b78508266b | ||
|
|
1ecb11f944 | ||
|
|
ab068db9b1 | ||
|
|
1d28cfcfb9 | ||
|
|
d38d96eb61 | ||
|
|
d7762dffe3 | ||
|
|
264e540d00 | ||
|
|
a5b132ad63 | ||
|
|
3ac6deefa8 | ||
|
|
bc45adcffa | ||
|
|
c07c601c3b | ||
|
|
62b642a88d | ||
|
|
d2415945c1 | ||
|
|
f711d5343b | ||
|
|
6aab6ebe61 | ||
|
|
4ce1e1fca5 | ||
|
|
3674563dd5 | ||
|
|
82c8973dfa | ||
|
|
874b80bd6a | ||
|
|
ab723d022d | ||
|
|
1415650463 | ||
|
|
c0d42b0365 | ||
|
|
eb4951d499 | ||
|
|
453c9e6411 | ||
|
|
3892628657 | ||
|
|
d044e2de07 | ||
|
|
afce4c3ae8 | ||
|
|
b6c5cf60b7 | ||
|
|
d9882395e2 | ||
|
|
1a317135c5 | ||
|
|
430cfd1825 | ||
|
|
3fed1cf36f | ||
|
|
ea37d98949 | ||
|
|
3202bce288 | ||
|
|
d76091d7d1 | ||
|
|
7a9c81d2dc | ||
|
|
b5bdf9434b | ||
|
|
f0fec7352a | ||
|
|
fd3e1ca3e2 | ||
|
|
48d58f92f1 | ||
|
|
d13f518010 | ||
|
|
99984772df | ||
|
|
5457eae28c | ||
|
|
61364f9443 | ||
|
|
a1f23c1aa1 | ||
|
|
3db613e31a | ||
|
|
aee226b243 | ||
|
|
67fb0ece6b | ||
|
|
d6110fbd11 | ||
|
|
f990f24ad3 | ||
|
|
692f580a07 | ||
|
|
8d1f1186ca | ||
|
|
20372d2df3 | ||
|
|
285c5ed36f | ||
|
|
5b2801e3ea | ||
|
|
3b323027be | ||
|
|
557ba6bd97 | ||
|
|
301b44d45d | ||
|
|
c75e4cb48a | ||
|
|
f919216446 | ||
|
|
a63ce5cd72 | ||
|
|
039d13b0c3 | ||
|
|
6d85802100 | ||
|
|
3bb21b5191 | ||
|
|
7a72885ede | ||
|
|
7e4c1285dc | ||
|
|
5d9753fccf | ||
|
|
f8a3cf980f | ||
|
|
9b2aac61b2 | ||
|
|
3b75f5070d | ||
|
|
8f79169aef | ||
|
|
e7a1fa1293 | ||
|
|
5aea12b4c4 | ||
|
|
203561208e | ||
|
|
c143cba590 | ||
|
|
f2212fa59d | ||
|
|
76f98c27de | ||
|
|
f618551694 | ||
|
|
d1b352e4b3 | ||
|
|
24931f8405 | ||
|
|
2374e557e3 | ||
|
|
e235aae018 | ||
|
|
c7b3c1ecbc | ||
|
|
c6248efd73 | ||
|
|
0802326fc9 | ||
|
|
5caf53a053 | ||
|
|
14d1ab5a3e | ||
|
|
df07a713bd | ||
|
|
cee9080381 | ||
|
|
610faf713d | ||
|
|
9926dacd14 | ||
|
|
3d6ebbd296 | ||
|
|
c72967d335 | ||
|
|
caa828a242 | ||
|
|
bb4ae1769b | ||
|
|
b299b4b7a1 | ||
|
|
16f02403f8 | ||
|
|
e72b7b8002 | ||
|
|
7a34afba77 | ||
|
|
40820ec8d5 | ||
|
|
c9e27b11c5 | ||
|
|
0633e5cac9 | ||
|
|
6abdf051d3 | ||
|
|
11f673e819 | ||
|
|
76d525b034 | ||
|
|
d70474dc10 | ||
|
|
3934cb5485 | ||
|
|
94f9dc67c0 | ||
|
|
cfd459abde | ||
|
|
e0061a511d | ||
|
|
7ff53f4c6a | ||
|
|
4badb227cf | ||
|
|
5f8f561d61 | ||
|
|
27ec33aad7 | ||
|
|
ac9d9f4e9f | ||
|
|
61308a5bff | ||
|
|
60de86351a | ||
|
|
ff6409469d | ||
|
|
6e715b82d0 | ||
|
|
fa514a9f16 | ||
|
|
8daa1f8d04 | ||
|
|
4ff45c264c | ||
|
|
c2a06725d6 | ||
|
|
39464b498f | ||
|
|
3510669db2 | ||
|
|
8efab857d0 | ||
|
|
e4a6b72ae3 | ||
|
|
6ad18a27a0 | ||
|
|
e6a1091cc6 | ||
|
|
311d7dee19 | ||
|
|
2ad587cc35 | ||
|
|
5281f29012 | ||
|
|
d2e1b0855f | ||
|
|
ac3bc2ed41 | ||
|
|
d27d6dcc6f | ||
|
|
fbad5dc062 | ||
|
|
4efe27bbab | ||
|
|
9cf2a02d8b | ||
|
|
41ef1717e0 | ||
|
|
760bba5518 | ||
|
|
af49187e57 | ||
|
|
684740c232 | ||
|
|
b8c0349750 | ||
|
|
144200435f | ||
|
|
a934566eb9 | ||
|
|
b549b3fcce | ||
|
|
6732e7fa17 | ||
|
|
71dc232f93 | ||
|
|
a98d23d905 | ||
|
|
4e7e2f8724 | ||
|
|
57edff1f31 | ||
|
|
b98cd6753b | ||
|
|
57ea07ac91 | ||
|
|
b7947e45c0 | ||
|
|
1efd261572 | ||
|
|
afe3c1cdea | ||
|
|
80174392bb | ||
|
|
4681e34c1e | ||
|
|
45b8d24ea6 | ||
|
|
c9f71a807c | ||
|
|
62d9852c3d | ||
|
|
b7441040f8 | ||
|
|
cc9d5ab546 | ||
|
|
715e119eea | ||
|
|
8553e8a15d | ||
|
|
57fbb627ca | ||
|
|
93913dbdb8 | ||
|
|
dd50b86449 | ||
|
|
07e64d45ff | ||
|
|
54f02345b5 | ||
|
|
ee3026797c | ||
|
|
03ea4b644e | ||
|
|
fd0bebcdbc | ||
|
|
9331218449 | ||
|
|
b36f11d7b5 | ||
|
|
ff56d6364e | ||
|
|
06b9c8bf1f | ||
|
|
a5184fe938 | ||
|
|
323a5e11e5 | ||
|
|
631e5bf5cb | ||
|
|
08a09bb50a | ||
|
|
b8bb6e9007 | ||
|
|
499c615c9e | ||
|
|
b544185bd8 | ||
|
|
1a9c9b0c55 | ||
|
|
50c70ac714 | ||
|
|
7faf7d5c8d | ||
|
|
3819920d77 | ||
|
|
c16508c87a | ||
|
|
de9778b5bd | ||
|
|
7a6b5635eb | ||
|
|
62277ab79b | ||
|
|
cb84cde4d4 | ||
|
|
d923c94a0c | ||
|
|
0281e1acf6 | ||
|
|
970e9025fe | ||
|
|
33e774eeba | ||
|
|
8f671041a5 | ||
|
|
f13e2f96e4 | ||
|
|
f56ff0de92 | ||
|
|
9ea8c9f2b0 | ||
|
|
eac3dc9d5f | ||
|
|
d36bb6536e | ||
|
|
067f4086b6 | ||
|
|
888a494ad8 | ||
|
|
96df65e88e | ||
|
|
dc1f4ebd44 | ||
|
|
e9a116fe02 | ||
|
|
25adb2eb55 | ||
|
|
38041fcaa0 | ||
|
|
ca0038bf2f | ||
|
|
d7a4501057 | ||
|
|
53dd9fe200 | ||
|
|
4befe93a4b | ||
|
|
1b758ef268 | ||
|
|
801fb8a614 | ||
|
|
0301adf9b4 | ||
|
|
b0d1d6c2b9 | ||
|
|
85487c82d0 | ||
|
|
01f7d4484e | ||
|
|
ec0266a56c | ||
|
|
b72ffc0e07 | ||
|
|
cd577d503d | ||
|
|
129310676d | ||
|
|
c55c0a1fca | ||
|
|
fb3a9cd0d8 | ||
|
|
ae805f1057 | ||
|
|
c0e18f37d4 | ||
|
|
94644d743c | ||
|
|
53530e981a | ||
|
|
b9106b0ecd | ||
|
|
fdae14070c | ||
|
|
e232cf3100 | ||
|
|
3197cf291d | ||
|
|
7af9cb9e80 | ||
|
|
4279725d79 | ||
|
|
d52f63d9b2 | ||
|
|
18de108e4c | ||
|
|
aec80d47bb | ||
|
|
da16128bf6 | ||
|
|
9e97e185ad | ||
|
|
52b295400d | ||
|
|
7c77a56b4a | ||
|
|
40ea061c30 | ||
|
|
d1b78c3f5d | ||
|
|
aa6a785286 | ||
|
|
179f718d62 | ||
|
|
6ecdeada49 | ||
|
|
6192b8659a | ||
|
|
bb00fef3cd | ||
|
|
7ed80451ca | ||
|
|
a49bf8622f | ||
|
|
48f5f77713 | ||
|
|
6740dd48b3 | ||
|
|
3546106c43 | ||
|
|
6f21ac1282 | ||
|
|
5c6f063ef2 | ||
|
|
70ffdf5db9 | ||
|
|
6b6dcf4aad | ||
|
|
218d7e9f2d | ||
|
|
8e9ec4abea | ||
|
|
3238944c7a | ||
|
|
a01d8a0d68 | ||
|
|
b35d72df76 | ||
|
|
6e603ccbe2 | ||
|
|
6f84063a3b | ||
|
|
54d4efd44b | ||
|
|
765f0cdece | ||
|
|
bfdc421dda | ||
|
|
069099a3e3 | ||
|
|
c66a0a739f | ||
|
|
cc053e7df7 | ||
|
|
04001fb591 | ||
|
|
ebe2721cbf | ||
|
|
903977d5e8 | ||
|
|
139c91e892 | ||
|
|
663269f687 | ||
|
|
618296ef57 | ||
|
|
025116f8d0 | ||
|
|
b29f78772e | ||
|
|
ac684f3583 | ||
|
|
b80f6e9ed1 | ||
|
|
4278f35e89 | ||
|
|
776c3e2b29 | ||
|
|
3a993d8897 | ||
|
|
3e969f0f74 | ||
|
|
0c64768cb4 | ||
|
|
f8c3b6009d | ||
|
|
e01464373f | ||
|
|
90295d9fce | ||
|
|
9e8afe9133 | ||
|
|
1762abcece | ||
|
|
916e057fea | ||
|
|
e5cbe73a82 | ||
|
|
33d5c46e8c | ||
|
|
6db43f4c29 | ||
|
|
39f0ef9d4a | ||
|
|
df8164c1c3 | ||
|
|
1332cafb7c | ||
|
|
b865f9e9c8 | ||
|
|
2d7e86ef58 | ||
|
|
8aaffe71ee | ||
|
|
04c06b9149 | ||
|
|
84277ea845 | ||
|
|
31ed37fdf0 | ||
|
|
217e4b40d4 | ||
|
|
3c97a4391a | ||
|
|
3847add943 | ||
|
|
943b2c61a8 | ||
|
|
953fa3a5f5 | ||
|
|
5d5c8cf04a | ||
|
|
fdf46a65c9 | ||
|
|
cbfd4da818 | ||
|
|
6befc72f82 | ||
|
|
c90546f138 | ||
|
|
8492c52e15 | ||
|
|
627fb5adbb | ||
|
|
3994340a45 | ||
|
|
5c712a7da5 | ||
|
|
1256df76bc | ||
|
|
d96c52694a | ||
|
|
a6f904cab7 | ||
|
|
1395cba6ce | ||
|
|
4ccdc501d4 | ||
|
|
0d5a1fed33 | ||
|
|
004faf3846 | ||
|
|
49d30c6478 | ||
|
|
7be0d06238 | ||
|
|
d2ec5c23cf | ||
|
|
ffeb4722d4 | ||
|
|
61c8014135 | ||
|
|
96f08cf05c | ||
|
|
c6ebfb0cc6 | ||
|
|
d7efb0fdb2 | ||
|
|
2c7cbbc1b0 | ||
|
|
aa6eaae0aa | ||
|
|
b571900d9c | ||
|
|
c857d65dd3 | ||
|
|
28211519b6 | ||
|
|
3adf7a3dcf | ||
|
|
b94af8d6b1 | ||
|
|
836e6a3fcb | ||
|
|
177de8fefc | ||
|
|
3d10852c33 | ||
|
|
c1613e6ebb | ||
|
|
ae10a48383 | ||
|
|
6ec2f877c2 | ||
|
|
b13081691e | ||
|
|
116dfb8740 | ||
|
|
c96b7e5ca0 | ||
|
|
dd857f9fdf | ||
|
|
0c17067d87 | ||
|
|
6bd11f147a | ||
|
|
ff2457754c | ||
|
|
c93bab141c | ||
|
|
6d9227b79a | ||
|
|
ca862d75de | ||
|
|
4635ed7fde | ||
|
|
462a8f8652 | ||
|
|
9b67962a44 | ||
|
|
03f2bfe51f | ||
|
|
358b7516c7 | ||
|
|
976983960d | ||
|
|
777e1a6c69 | ||
|
|
70b2a44579 | ||
|
|
7eb126474d | ||
|
|
073947c150 | ||
|
|
0918bb2070 | ||
|
|
c1a0ade7e7 | ||
|
|
c2c0cfb75f | ||
|
|
b07f2e25f4 | ||
|
|
264a67aed2 | ||
|
|
dd21a4f4b9 | ||
|
|
6310e717e4 | ||
|
|
93c0c24a4e | ||
|
|
c69d3f4a35 | ||
|
|
faffee0c62 | ||
|
|
00333d59d6 | ||
|
|
f8eb163728 | ||
|
|
b90d63b998 | ||
|
|
602d1861a1 | ||
|
|
fb6dc11f11 | ||
|
|
04999ef969 | ||
|
|
c488e5775a | ||
|
|
a38aa02f9f | ||
|
|
5861db8a69 | ||
|
|
74614c1bf1 | ||
|
|
5809483b78 | ||
|
|
8c4561d2a0 | ||
|
|
c9c13e0718 | ||
|
|
39472709f0 | ||
|
|
44dde5f24c | ||
|
|
e898c1f2e3 | ||
|
|
c98b0799bf | ||
|
|
40e42e8107 | ||
|
|
9a9f08b1bc | ||
|
|
c47391526c | ||
|
|
209b219b10 | ||
|
|
d67fdcc177 | ||
|
|
374300ca8d | ||
|
|
681733d905 | ||
|
|
a258992855 | ||
|
|
39b63dfe17 | ||
|
|
b9cd3363ef | ||
|
|
5c78c45fa3 | ||
|
|
939a6c7484 | ||
|
|
e72b072d53 | ||
|
|
6d60d2db00 | ||
|
|
5217eda1ae | ||
|
|
dbf9e466bc | ||
|
|
a96b5c792e | ||
|
|
78c61000c2 | ||
|
|
145fac2b56 | ||
|
|
0fcc94525a | ||
|
|
48562fa938 | ||
|
|
b4fba5fe8e | ||
|
|
f6e00759ef | ||
|
|
9415ca909e | ||
|
|
e6dbf8d632 | ||
|
|
1e710cafa7 | ||
|
|
409020a67d | ||
|
|
d5ee777af2 | ||
|
|
d1500cee6e | ||
|
|
9d4d232eaa | ||
|
|
64d0e328e8 | ||
|
|
0dba38eef0 | ||
|
|
769a35024f | ||
|
|
548d59d07e | ||
|
|
0e844d3bcb | ||
|
|
5c602b750a | ||
|
|
9be3df0828 | ||
|
|
18a70ffda1 | ||
|
|
61785afb3d | ||
|
|
7881b59f6b | ||
|
|
6670154819 | ||
|
|
776b099d75 | ||
|
|
62c4214711 | ||
|
|
e165859c2e | ||
|
|
7bd3280cc2 | ||
|
|
d9e3b466a7 | ||
|
|
fdbc9a82e4 | ||
|
|
20d5963fae | ||
|
|
7a251f3bdf | ||
|
|
55ab9b4541 | ||
|
|
6034701f57 | ||
|
|
b021a845f7 | ||
|
|
30b700ee22 | ||
|
|
810882c1ad | ||
|
|
faa0c6d449 | ||
|
|
2b91f8d265 | ||
|
|
724ccf10df | ||
|
|
16e32c8fd9 | ||
|
|
71d237e6a0 | ||
|
|
c6cc386819 | ||
|
|
b2995829e1 | ||
|
|
c219571eac | ||
|
|
3497da370b | ||
|
|
de1521413e | ||
|
|
a2714be8b5 | ||
|
|
b1b84960ce | ||
|
|
b08f2af344 | ||
|
|
04fac19822 | ||
|
|
9ad7539cf9 | ||
|
|
8f59cccb75 | ||
|
|
e0ecf4f8f5 | ||
|
|
b80bdda14e | ||
|
|
df1c1e593f | ||
|
|
4fd0225e41 | ||
|
|
c5b149ab1e | ||
|
|
b57d946184 | ||
|
|
a97fdf5c39 | ||
|
|
f0f2d2ee70 | ||
|
|
dc041628ce | ||
|
|
ffb4b47367 | ||
|
|
46ebaa00ce | ||
|
|
b8dee2eb20 | ||
|
|
bb0d1e65e1 | ||
|
|
6ee0bf704a | ||
|
|
e8363abb6a | ||
|
|
05ae932a0e | ||
|
|
49cd1bbf84 | ||
|
|
4c8889bba2 | ||
|
|
9acc8a686a | ||
|
|
d98ea70168 | ||
|
|
12d78cd1df | ||
|
|
05d6da6c4a | ||
|
|
c094dda53c | ||
|
|
7a8ede6f80 | ||
|
|
6eff8937d7 | ||
|
|
2916a2acd4 | ||
|
|
a0c48eecab | ||
|
|
1db824a9c1 | ||
|
|
68af59ef6b | ||
|
|
ea4956f046 | ||
|
|
0485cc41d5 | ||
|
|
7a51184420 | ||
|
|
5fbc750db7 | ||
|
|
daacb81d3a | ||
|
|
fcda5e8dfa | ||
|
|
860fcf23f4 | ||
|
|
de7016eac5 | ||
|
|
c04b679e12 | ||
|
|
d0f2d465aa | ||
|
|
ef55324f1a | ||
|
|
662fdfed37 | ||
|
|
375131376f | ||
|
|
bcf163da27 | ||
|
|
764783560e | ||
|
|
860d008d54 | ||
|
|
ca02b4f586 | ||
|
|
c5de1b6350 | ||
|
|
3bb7ad6fea | ||
|
|
bcc032e43a | ||
|
|
cb32883537 | ||
|
|
c2e58c9dee | ||
|
|
4f01c74e9f | ||
|
|
7811fa6fec | ||
|
|
07423f3a87 | ||
|
|
7c1c89fc29 | ||
|
|
916d592be1 | ||
|
|
87d5e5b316 | ||
|
|
217b60a272 | ||
|
|
0314a10e10 | ||
|
|
92292c8394 | ||
|
|
0b823dce61 | ||
|
|
c622142692 | ||
|
|
d9b0eb3922 | ||
|
|
df94c763ae | ||
|
|
f57b0e993b | ||
|
|
5013bf1781 | ||
|
|
6115df6338 | ||
|
|
ae85d9af97 | ||
|
|
46a47d2799 | ||
|
|
5468173ce9 | ||
|
|
4322523fcf | ||
|
|
5a08a5653c | ||
|
|
ecd61742a1 | ||
|
|
23cf502db7 | ||
|
|
1bf46d1536 | ||
|
|
fbef11b679 | ||
|
|
490cac0d7e | ||
|
|
80ace36e4c | ||
|
|
95fd370096 | ||
|
|
1793ee1c80 | ||
|
|
98e61db216 | ||
|
|
9c6263bff8 | ||
|
|
b82ef28d9d | ||
|
|
896cef23c4 | ||
|
|
bc17d94a0a | ||
|
|
7d428a7741 | ||
|
|
b20c343a7a | ||
|
|
211e82e8d9 | ||
|
|
6c94b8e4e4 | ||
|
|
1b42276851 | ||
|
|
cd41e30bcc | ||
|
|
b02b54e003 | ||
|
|
dc01587c6c | ||
|
|
3337e9da1a | ||
|
|
9f6f19df1b | ||
|
|
3eaaaffadb | ||
|
|
88b9359284 | ||
|
|
49de41ef46 | ||
|
|
3aca908db3 | ||
|
|
e33c66654a | ||
|
|
3adcdfc2e1 | ||
|
|
4234ac53e2 | ||
|
|
b6edae5671 | ||
|
|
a38607605c | ||
|
|
6f92d8f3b0 | ||
|
|
ae1fc497bb | ||
|
|
a695065305 | ||
|
|
76c1805c67 | ||
|
|
77145ba229 | ||
|
|
979f5889d5 | ||
|
|
d979a7993e | ||
|
|
263813ae3e | ||
|
|
8fdb39a4ae | ||
|
|
96f42745ff | ||
|
|
1737cdc112 | ||
|
|
fe85062046 | ||
|
|
c05b5d8b59 | ||
|
|
b73f61a137 | ||
|
|
e5a41a75b7 | ||
|
|
0cfa789cc5 | ||
|
|
f3ad635576 | ||
|
|
8f52142116 | ||
|
|
173a8c9842 | ||
|
|
0b07f32819 | ||
|
|
c7cb4daa25 | ||
|
|
1660db6b87 | ||
|
|
c723acc721 | ||
|
|
7c9919f810 | ||
|
|
ce4204a069 | ||
|
|
987441283b | ||
|
|
33509bdbe5 | ||
|
|
4f56d8ae24 | ||
|
|
fc025f878a | ||
|
|
9f5643f427 | ||
|
|
7a755e04a9 | ||
|
|
704f394c66 | ||
|
|
ac2abe5b1e | ||
|
|
785531691b | ||
|
|
49451c1dab | ||
|
|
344243db92 | ||
|
|
aadce8e1a9 | ||
|
|
c328f3e6c6 | ||
|
|
4347906b7f | ||
|
|
b06dda1f5e | ||
|
|
b93b09a877 | ||
|
|
e82893d3f2 | ||
|
|
bf803f478b | ||
|
|
5a70224081 | ||
|
|
1bb52947e0 | ||
|
|
30b0522157 | ||
|
|
a668d07484 | ||
|
|
824a2fd1c6 | ||
|
|
c106c3740b | ||
|
|
b8c3d715fd | ||
|
|
ccd632f278 | ||
|
|
741e3fa91b | ||
|
|
cd6397cc45 | ||
|
|
c420c89dbd | ||
|
|
3669c75f4d | ||
|
|
c86c614cac | ||
|
|
dda1d681f7 | ||
|
|
bffa18befc | ||
|
|
42ee16978e | ||
|
|
c99e33bc90 | ||
|
|
6f738d6e7a | ||
|
|
a76c7a89ce | ||
|
|
5547450ca5 | ||
|
|
2788064bc2 | ||
|
|
653bf580bf | ||
|
|
971f43d63b | ||
|
|
87d92f619a | ||
|
|
7f652b63a9 | ||
|
|
fe48b5faa4 | ||
|
|
da00413196 | ||
|
|
f88d39de74 | ||
|
|
faefb3f5a4 | ||
|
|
152d956deb | ||
|
|
b57d7d9b4e | ||
|
|
0c1255453e | ||
|
|
e60d653a58 | ||
|
|
bfd3144861 | ||
|
|
f64371fccb | ||
|
|
d9dc2e0709 | ||
|
|
f2274840a9 | ||
|
|
4e16e386fe | ||
|
|
6e3d12f617 | ||
|
|
8abeffa9ea | ||
|
|
aeb7d6d168 | ||
|
|
820ca71a91 | ||
|
|
fd183bdb07 | ||
|
|
70293a43c9 | ||
|
|
8e6dd52683 | ||
|
|
6c5c808569 | ||
|
|
df59f06734 | ||
|
|
02e52ef8e9 | ||
|
|
c4397b801a | ||
|
|
a3631a383b | ||
|
|
f379b77735 | ||
|
|
8e0dad4a27 | ||
|
|
1b2c57907d | ||
|
|
bba23c0998 | ||
|
|
39ca93549a | ||
|
|
c9e21435c0 | ||
|
|
a876df6c71 | ||
|
|
b3349eb33a | ||
|
|
988174a629 | ||
|
|
b21056d63a | ||
|
|
73266cb486 | ||
|
|
53413598b6 | ||
|
|
75e6c39733 | ||
|
|
d22952bfe0 | ||
|
|
1b9eaf43f5 | ||
|
|
947c577c0d | ||
|
|
b1e126f415 | ||
|
|
f80cc69c23 | ||
|
|
3f39772834 | ||
|
|
d9085ea0cb | ||
|
|
7d947f8723 | ||
|
|
f86c1783b7 | ||
|
|
aa73ed973c | ||
|
|
d9a81374b2 | ||
|
|
52f088b966 | ||
|
|
04dd2d51be | ||
|
|
933a37cd28 | ||
|
|
af6c177b91 | ||
|
|
caf22c8e0a | ||
|
|
a650138ebf | ||
|
|
2b3d9e4ad0 | ||
|
|
7ff04c1f86 | ||
|
|
d6fe7fb4c3 | ||
|
|
7342fecaec | ||
|
|
fd184ee2fa | ||
|
|
6c68a9679b | ||
|
|
732c6f2036 | ||
|
|
642c2773a7 | ||
|
|
9553503be5 | ||
|
|
d9757520fb | ||
|
|
8fd46a34d6 | ||
|
|
20eec646b3 | ||
|
|
8d0f756158 | ||
|
|
a8ede8dd9e | ||
|
|
0d31e9875f | ||
|
|
de9bfdea8e | ||
|
|
402755b14a | ||
|
|
2582560f91 | ||
|
|
1beb840fec | ||
|
|
8330316014 | ||
|
|
2c016badc2 | ||
|
|
fd73a3a398 | ||
|
|
07333a4ab0 | ||
|
|
48ccbb9afa | ||
|
|
25700e65ee | ||
|
|
153b755936 | ||
|
|
6e5abf4551 | ||
|
|
0618f02f6f | ||
|
|
3fce98c853 | ||
|
|
b23ed4a98c | ||
|
|
bddd6e9ca3 | ||
|
|
1da15d623e | ||
|
|
0ecd0fa598 | ||
|
|
469e2648e5 | ||
|
|
c819abccb6 | ||
|
|
f219938b69 | ||
|
|
3377a30fb8 | ||
|
|
e2569c402f | ||
|
|
630bb7a012 | ||
|
|
0afed52329 | ||
|
|
359d0170ab | ||
|
|
53a841d96a | ||
|
|
0accebe583 | ||
|
|
dd35637603 | ||
|
|
0d7e88a429 | ||
|
|
3d24e119e0 | ||
|
|
64fe9fb85d | ||
|
|
f91e347eee | ||
|
|
5de04dafc6 | ||
|
|
e6c5ac4f73 | ||
|
|
120492e5c2 | ||
|
|
4dcdfaf929 | ||
|
|
a2d809fe90 | ||
|
|
a98afdfb2f | ||
|
|
0981e7f663 | ||
|
|
0ea2f9e04b | ||
|
|
6301f18e62 | ||
|
|
c2454a0d06 | ||
|
|
3b8e47755a | ||
|
|
bfa36136da | ||
|
|
4526308560 | ||
|
|
f65b36eec1 | ||
|
|
4a615ddd9c | ||
|
|
2f9722cca0 | ||
|
|
f3b0cefd0b | ||
|
|
7873639f55 | ||
|
|
d8e69d31b3 | ||
|
|
22d1d3dbf7 | ||
|
|
6eb8bbc640 | ||
|
|
fa667f718c | ||
|
|
752da03eb0 | ||
|
|
87077e03cc | ||
|
|
20b945df70 | ||
|
|
164ce76e94 | ||
|
|
89a3fa93a0 | ||
|
|
e801f420d0 | ||
|
|
a73227bf28 | ||
|
|
4ddfd8aa42 | ||
|
|
45a806a066 | ||
|
|
a30ac92b0c | ||
|
|
89df4d1c86 | ||
|
|
dbb1a267d7 | ||
|
|
9599d2d0e9 | ||
|
|
501b4a54be | ||
|
|
71680f512c | ||
|
|
c1baa70fe5 | ||
|
|
ee8530e0ee | ||
|
|
756544fd28 | ||
|
|
c3e0a4bc7c | ||
|
|
876b6d2183 | ||
|
|
f080de5380 | ||
|
|
f8ba9c3bc9 | ||
|
|
c6affb64f9 | ||
|
|
34c02357ff | ||
|
|
4d818f1fd3 | ||
|
|
3414eab2f3 | ||
|
|
8141448fe5 | ||
|
|
90ab0794df | ||
|
|
48452838b3 | ||
|
|
c8b6ef248e | ||
|
|
c5d82380f4 | ||
|
|
7538e70767 | ||
|
|
4f679fd8d0 | ||
|
|
530328f12b | ||
|
|
485823f3e4 | ||
|
|
5b1a535cd8 | ||
|
|
a9ea21feb4 | ||
|
|
1107a1bd1e | ||
|
|
aa42c6790d | ||
|
|
38e425d9bf | ||
|
|
8a58e83870 | ||
|
|
44d5f212fe | ||
|
|
633d6be328 | ||
|
|
0cea946cb9 | ||
|
|
516874f4a1 | ||
|
|
4129305b7c | ||
|
|
dc093ef833 | ||
|
|
9c1034b183 | ||
|
|
0433d828cf | ||
|
|
2d54d664ff | ||
|
|
27fcae738a | ||
|
|
b6dda61249 | ||
|
|
1cacb50f2b | ||
|
|
8be6a89654 | ||
|
|
528c449901 | ||
|
|
39a12b2a22 | ||
|
|
7719ce33db | ||
|
|
1eba0cadc1 | ||
|
|
9d39e18c6d | ||
|
|
686bec4f35 | ||
|
|
0b441462ab | ||
|
|
728d8a37f4 | ||
|
|
8195e0f723 | ||
|
|
6de2173d7c | ||
|
|
027829d285 | ||
|
|
6cb0e0e5f5 | ||
|
|
6e6562e551 | ||
|
|
0bf34b598f | ||
|
|
8d2f9e83a4 | ||
|
|
55f9fdd6b5 | ||
|
|
6e9e61b9df | ||
|
|
ca2c7d1745 | ||
|
|
2b252acea4 | ||
|
|
bd6c08a984 | ||
|
|
04f9c9fb09 | ||
|
|
06d493e7e3 | ||
|
|
bb8f0725da | ||
|
|
bffee5eda4 | ||
|
|
7371fcb312 | ||
|
|
1026ffea40 | ||
|
|
2ca788e6e2 | ||
|
|
d1f69ef35d | ||
|
|
a021db151a | ||
|
|
6c9ec1ac40 | ||
|
|
cff1df1f9b | ||
|
|
42dd629c16 | ||
|
|
9cfa4fd7d6 | ||
|
|
1020efb6f7 | ||
|
|
43121c15be | ||
|
|
d737a060c8 | ||
|
|
b833aa48e9 | ||
|
|
54c8ea5ea2 | ||
|
|
51c1526b6a | ||
|
|
8ad47c8de7 | ||
|
|
c6bd0e56cb | ||
|
|
60131fc88c | ||
|
|
711774c1f0 | ||
|
|
d3de943eb1 | ||
|
|
47fcf785ac | ||
|
|
726865af7b | ||
|
|
b3b3cfe007 | ||
|
|
3a70129a9c | ||
|
|
f481183140 | ||
|
|
f97d339ce7 | ||
|
|
43d651daef | ||
|
|
7069bee982 | ||
|
|
2e40a9e15f | ||
|
|
8fd472b9a1 | ||
|
|
9bd2717e74 | ||
|
|
cf652b82a3 | ||
|
|
d582599c14 | ||
|
|
f230e45183 | ||
|
|
9a7321ebb0 | ||
|
|
f683867b98 | ||
|
|
f5c95c388c | ||
|
|
7a2e784ad7 | ||
|
|
36f3bc33a3 | ||
|
|
57890465bd | ||
|
|
ad0a4cefb8 | ||
|
|
6959a1d6d1 | ||
|
|
659954d842 | ||
|
|
7b2fdc098b | ||
|
|
c536728335 | ||
|
|
3d8b14e6f7 | ||
|
|
ae7c9909be | ||
|
|
50f45d14b4 | ||
|
|
3558952899 | ||
|
|
eca2de73ed | ||
|
|
910c627fc6 | ||
|
|
efe34f5023 | ||
|
|
fc937aa3e5 | ||
|
|
122e74b49b | ||
|
|
5f466c8762 | ||
|
|
c779647600 | ||
|
|
132d685796 | ||
|
|
2b743aa5bb | ||
|
|
a5df0f6a65 | ||
|
|
2bac299aed | ||
|
|
9a70abbf13 | ||
|
|
7d9d881e22 | ||
|
|
04e53cab90 | ||
|
|
4bcb01c8bf | ||
|
|
cfe5876350 | ||
|
|
8e6d978bba | ||
|
|
5f82c4baf0 | ||
|
|
b893859c34 | ||
|
|
3456a16f71 | ||
|
|
334d56d2be | ||
|
|
0283e68129 | ||
|
|
2dbd0d3806 | ||
|
|
a1e5089d9b | ||
|
|
d2f5094096 | ||
|
|
fd189c8a73 | ||
|
|
2b9a9f9140 | ||
|
|
8bf9a42c70 | ||
|
|
2b8ab7e24f | ||
|
|
0329468e73 | ||
|
|
12c2ea05ca | ||
|
|
f09d0cd93c | ||
|
|
d949074014 | ||
|
|
0dbf2d7792 | ||
|
|
e7d0dcee10 | ||
|
|
8b62e8616b |
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
||||
test/fixtures/* -text
|
||||
41
.gitignore
vendored
41
.gitignore
vendored
@@ -1,10 +1,45 @@
|
||||
build
|
||||
core
|
||||
vgcore.*
|
||||
.waf*
|
||||
tags
|
||||
.lock-wscript
|
||||
*.pyc
|
||||
doc/api.xml
|
||||
doc/api.html
|
||||
doc/node.1
|
||||
tmp/
|
||||
node
|
||||
node_g
|
||||
*.swp
|
||||
.benchmark_reports
|
||||
/.project
|
||||
/.cproject
|
||||
|
||||
/out
|
||||
|
||||
# various stuff that VC++ produces/uses
|
||||
Debug/
|
||||
Release/
|
||||
!doc/blog/**
|
||||
*.sln
|
||||
!nodemsi.sln
|
||||
*.suo
|
||||
*.vcproj
|
||||
*.vcxproj
|
||||
*.vcxproj.user
|
||||
*.vcxproj.filters
|
||||
UpgradeLog*.XML
|
||||
_UpgradeReport_Files/
|
||||
ipch/
|
||||
*.sdf
|
||||
*.opensdf
|
||||
|
||||
/config.mk
|
||||
/config.gypi
|
||||
*-nodegyp*
|
||||
/gyp-mac-tool
|
||||
/dist-osx
|
||||
/npm.wxs
|
||||
/tools/msvs/npm.wixobj
|
||||
email.md
|
||||
deps/v8-*
|
||||
./node_modules
|
||||
.svn/
|
||||
104
.mailmap
Normal file
104
.mailmap
Normal file
@@ -0,0 +1,104 @@
|
||||
Aaron Heckmann <aaron.heckmann@gmail.com> <aaron.heckmann+github@gmail.com>
|
||||
Abe Fettig <abefettig@gmail.com> <abe@fettig.net>
|
||||
Alex Kocharin <rlidwka@kocharin.ru>
|
||||
Alex Kocharin <rlidwka@kocharin.ru> <alex@kocharin.ru>
|
||||
Alexis Sellier <self@cloudhead.net>
|
||||
Alexis Sellier <self@cloudhead.net> <alexis@cloudhead.io>
|
||||
Arlo Breault <arlolra@gmail.com>
|
||||
Artem Zaytsev <a.arepo@gmail.com>
|
||||
Atsuo Fukaya <fukayatsu@gmail.com>
|
||||
Ben Noordhuis <info@bnoordhuis.nl> <bnoordhuis@bender.(none)>
|
||||
Bert Belder <bertbelder@gmail.com> <bert@piscisaureus2.(none)>
|
||||
Bert Belder <bertbelder@gmail.com> <piscisaureus@Berts-MacBook-Pro.local>
|
||||
Brandon Benvie <brandon@bbenvie.com> <brandon@brandonbenvie.com>
|
||||
Brian White <mscdex@mscdex.net>
|
||||
Brian White <mscdex@mscdex.net> <mscdex@gmail.com>
|
||||
Chew Choon Keat <choonkeat@gmail.com>
|
||||
Christopher Lenz <cmlenz@gmail.com> <chris@lamech.local>
|
||||
Daniel Berger <code+node@dpbis.net>
|
||||
Daniel Chcouri <333222@gmail.com>
|
||||
Daniel Gröber <darklord@darkboxed.org>
|
||||
Daniel Gröber <darklord@darkboxed.org> <dxld@darkboxed.org>
|
||||
Daniel Pihlström <sciolist.se@gmail.com>
|
||||
David Siegel <david@artcom.de> <david.siegel@artcom.de>
|
||||
Domenic Denicola <domenic@domenicdenicola.com>
|
||||
Eduard Burtescu <eddy_me08@yahoo.com>
|
||||
Einar Otto Stangvik <einaros@gmail.com>
|
||||
Elliott Cable <me@ell.io>
|
||||
EungJun Yi <semtlenori@gmail.com>
|
||||
Evan Larkin <evan.larkin.il.com> <evan.larkin.iit@gmail.com>
|
||||
Farid Neshat <FaridN_SOAD@yahoo.com>
|
||||
Felix Geisendörfer <felix@debuggable.com>
|
||||
Felix Geisendörfer <felix@debuggable.com>
|
||||
Friedemann Altrock <frodenius@gmail.com>
|
||||
Fuji Goro <gfuji@cpan.org>
|
||||
Gabriel de Perthuis <g2p.code@gmail.com>
|
||||
Herbert Vojčík <herby@mailbox.sk>
|
||||
Igor Zinkovsky <igorzi@microsoft.com>
|
||||
Isaac Z. Schlueter <i@izs.me>
|
||||
Isaac Z. Schlueter <i@izs.me> <i@foohack.com>
|
||||
Jérémy Lal <kapouer@melix.org>
|
||||
Jérémy Lal <kapouer@melix.org> <holisme@gmail.com>
|
||||
Jered Schmidt <tr@nslator.jp>
|
||||
Joe Shaw <joe@joeshaw.org> <joeshaw@litl.com>
|
||||
Johan Bergström <bugs@bergstroem.nu>
|
||||
Johan Dahlberg <jfd@distrop.com> <dahlberg.johan@gmail.com>
|
||||
Jonas Pfenniger <jonas@pfenniger.name> <jonas@stvs.ch>
|
||||
Jonathan Rentzsch <jwr.git@redshed.net>
|
||||
Joshua S. Weinstein <josher19@users.sf.net>
|
||||
Koichi Kobayashi <koichik@improvement.jp>
|
||||
Kris Kowal <kris.kowal@cixar.com>
|
||||
Kyle Robinson Young <kyle@dontkry.com>
|
||||
Mathias Pettersson <mape@mape.me>
|
||||
Michael Bernstein <michaelrbernstein@gmail.com>
|
||||
Michael Wilber <gcr@sneakygcr.net>
|
||||
Micheil Smith <micheil@brandedcode.com> <micheil@yettobebranded.net>
|
||||
Mikael Bourges-Sevenier <mikeseven@gmail.com> <msevenier@motorola.com>
|
||||
Nebu Pookins<nebu@nebupookins.net>
|
||||
Nicholas Kinsey <pyrotechnick@feistystudios.com>
|
||||
Onne Gorter <onne@onnlucky.com>
|
||||
Paul Querna <pquerna@apache.org> <paul@querna.org>
|
||||
Ray Morgan <rmorgan@zappos.com>
|
||||
Ray Solomon <raybsolomon@gmail.com>
|
||||
Rick Olson <technoweenie@gmail.com>
|
||||
Ryan Dahl <ry@tinyclouds.org>
|
||||
Ryan Emery <seebees@gmail.com>
|
||||
Sam Shull <brickysam26@gmail.com> <brickysam26@samuel-shulls-computer.local>
|
||||
Sam Shull <brickysam26@gmail.com> <sshull@squaremouth.com>
|
||||
Sambasiva Suda <sambasivarao@gmail.com>
|
||||
San-Tai Hsu <v@fatpipi.com>
|
||||
Sergey Kryzhanovsky <skryzhanovsky@gmail.com> <another@dhcp199-223-red.yandex.net>
|
||||
Shannen Saez <shannenlaptop@gmail.com>
|
||||
Shigeki Ohtsu <ohtsu@d.jp> <ohtsu@iij.ad.jp>
|
||||
Siddharth Mahendraker <siddharth_mahen@hotmail.com> <siddharth_mahen@me.com>
|
||||
Simon Willison <simon@simonwillison.net>
|
||||
Stanislav Opichal <opichals@gmail.com>
|
||||
Stefan Bühler <stbuehler@web.de>
|
||||
Tadashi SAWADA <cesare@mayverse.jp>
|
||||
Takahiro ANDO <takahiro.ando@gmail.com>
|
||||
Ted Young <ted@radicaldesigns.org>
|
||||
Thomas Lee <thomas.lee@shinetech.com> <tom@tom-debian.sensis.com.au>
|
||||
Tim Caswell <tim@creationix.com> <tim@0-26-8-e9-4c-e1.dyn.utdallas.edu>
|
||||
Tim Smart <timehandgod@gmail.com> <tim@fostle.com>
|
||||
Tim Smart <timehandgod@gmail.com> <timehandgod@gmail.com>
|
||||
TJ Holowaychuk <tj@vision-media.ca>
|
||||
TJ Holowaychuk <tj@vision-media.ca> <tjholowayhuk@gmail.com>
|
||||
Trevor Burnham <trevor@databraid.com> <trevorburnham@gmail.com>
|
||||
Tyler Larson <talltyler@gmail.com>
|
||||
Vincent Voyer <v@fasterize.com>
|
||||
Yoshihiro KIKUCHI <yknetg@gmail.com>
|
||||
Yuichiro MASUI <masui@masuidrive.jp>
|
||||
Zachary Scott <zachary@zacharyscott.net> <zachary.s.scott@gmail.com>
|
||||
Zoran Tomicic <ztomicic@gmail.com>
|
||||
|
||||
# These people didn't contribute patches to node directly,
|
||||
# but we've landed their v8 patches in the node repository:
|
||||
Daniel Clifford <danno@chromium.org>
|
||||
Erik Corry <erik.corry@gmail.com>
|
||||
Jakob Kummerow <jkummerow@chromium.org>
|
||||
Kevin Millikin <kmillikin@chromium.org>
|
||||
Lasse R.H. Nielsen <lrn@chromium.org>
|
||||
Michael Starzinger <mstarzinger@chromium.org>
|
||||
Toon Verwaest <verwaest@chromium.org>
|
||||
Vyacheslav Egorov <vegorov@chromium.org>
|
||||
Yang Guo <yangguo@chromium.org>
|
||||
14
.travis.yml
Normal file
14
.travis.yml
Normal file
@@ -0,0 +1,14 @@
|
||||
language: node_js
|
||||
|
||||
before_script:
|
||||
- "./configure"
|
||||
- "make"
|
||||
|
||||
script:
|
||||
- "make test"
|
||||
|
||||
notifications:
|
||||
email: false
|
||||
irc:
|
||||
- "irc.freenode.net#libuv"
|
||||
|
||||
388
AUTHORS
Normal file
388
AUTHORS
Normal file
@@ -0,0 +1,388 @@
|
||||
# Authors ordered by first contribution.
|
||||
|
||||
Ryan Dahl <ry@tinyclouds.org>
|
||||
Urban Hafner <urban@bettong.net>
|
||||
Joshaven Potter <yourtech@gmail.com>
|
||||
Abe Fettig <abefettig@gmail.com>
|
||||
Kevin van Zonneveld <kevin@vanzonneveld.net>
|
||||
Michael Carter <cartermichael@gmail.com>
|
||||
Jeff Smick <sprsquish@gmail.com>
|
||||
Jon Crosby <jon@joncrosby.me>
|
||||
Felix Geisendörfer <felix@debuggable.com>
|
||||
Ray Morgan <rmorgan@zappos.com>
|
||||
Jérémy Lal <kapouer@melix.org>
|
||||
Isaac Z. Schlueter <i@izs.me>
|
||||
Brandon Beacher <brandon.beacher@gmail.com>
|
||||
Tim Caswell <tim@creationix.com>
|
||||
Connor Dunn <connorhd@gmail.com>
|
||||
Johan Sørensen <johan@johansorensen.com>
|
||||
Friedemann Altrock <frodenius@gmail.com>
|
||||
Onne Gorter <onne@onnlucky.com>
|
||||
Rhys Jones <rhys@wave.to>
|
||||
Jan Lehnardt <jan@apache.org>
|
||||
Simon Willison <simon@simonwillison.net>
|
||||
Chew Choon Keat <choonkeat@gmail.com>
|
||||
Jered Schmidt <tr@nslator.jp>
|
||||
Michaeljohn Clement <inimino@inimino.org>
|
||||
Karl Guertin <grayrest@gr.ayre.st>
|
||||
Xavier Shay <xavier@rhnh.net>
|
||||
Christopher Lenz <cmlenz@gmail.com>
|
||||
TJ Holowaychuk <tj@vision-media.ca>
|
||||
Johan Dahlberg <jfd@distrop.com>
|
||||
Simon Cornelius P. Umacob <simoncpu@gmail.com>
|
||||
Ryan McGrath <ryan@venodesigns.net>
|
||||
Rasmus Andersson <rasmus@notion.se>
|
||||
Micheil Smith <micheil@brandedcode.com>
|
||||
Jonas Pfenniger <jonas@pfenniger.name>
|
||||
David Sklar <david.sklar@gmail.com>
|
||||
Charles Lehner <celehner1@gmail.com>
|
||||
Elliott Cable <me@ell.io>
|
||||
Benjamin Thomas <benjamin@benjaminthomas.org>
|
||||
San-Tai Hsu <v@fatpipi.com>
|
||||
Ben Williamson <benw@pobox.com>
|
||||
Joseph Pecoraro <joepeck02@gmail.com>
|
||||
Erich Ocean <erich.ocean@me.com>
|
||||
Alexis Sellier <self@cloudhead.net>
|
||||
Blaine Cook <romeda@gmail.com>
|
||||
Stanislav Opichal <opichals@gmail.com>
|
||||
Aaron Heckmann <aaron.heckmann@gmail.com>
|
||||
Mikeal Rogers <mikeal.rogers@gmail.com>
|
||||
Matt Brubeck <mbrubeck@limpet.net>
|
||||
Michael Stillwell <mjs@beebo.org>
|
||||
Yuichiro MASUI <masui@masuidrive.jp>
|
||||
Mark Hansen <mark@markhansen.co.nz>
|
||||
Zoran Tomicic <ztomicic@gmail.com>
|
||||
Jeremy Ashkenas <jashkenas@gmail.com>
|
||||
Scott González <scott.gonzalez@gmail.com>
|
||||
James Duncan <james@joyent.com>
|
||||
Arlo Breault <arlolra@gmail.com>
|
||||
Kris Kowal <kris.kowal@cixar.com>
|
||||
Jacek Becela <jacek.becela@gmail.com>
|
||||
Rob Ellis <kazoomer@gmail.com>
|
||||
Tim Smart <timehandgod@gmail.com>
|
||||
Herbert Vojčík <herby@mailbox.sk>
|
||||
Krishna Rajendran <krishna@emptybox.org>
|
||||
Nicholas Kinsey <pyrotechnick@feistystudios.com>
|
||||
Scott Taylor <scott@railsnewbie.com>
|
||||
Carson McDonald <carson@ioncannon.net>
|
||||
Matt Ranney <mjr@ranney.com>
|
||||
James Herdman <james.herdman@gmail.com>
|
||||
Julian Lamb <thepurlieu@gmail.com>
|
||||
Brian Hammond <brian@fictorial.com>
|
||||
Mathias Pettersson <mape@mape.me>
|
||||
Trevor Blackwell <tlb@tlb.org>
|
||||
Thomas Lee <thomas.lee@shinetech.com>
|
||||
Daniel Berger <code+node@dpbis.net>
|
||||
Paulo Matias <paulo.matias@usp.br>
|
||||
Peter Griess <pg@std.in>
|
||||
Jonathan Knezek <jdknezek@gmail.com>
|
||||
Jonathan Rentzsch <jwr.git@redshed.net>
|
||||
Ben Noordhuis <info@bnoordhuis.nl>
|
||||
Elijah Insua <tmpvar@gmail.com>
|
||||
Andrew Johnston <apjohnsto@gmail.com>
|
||||
Brian White <mscdex@mscdex.net>
|
||||
Aapo Laitinen <aapo.laitinen@iki.fi>
|
||||
Sam Hughes <sam@samuelhughes.com>
|
||||
Orlando Vazquez <ovazquez@gmail.com>
|
||||
Raffaele Sena <raff367@gmail.com>
|
||||
Brian McKenna <brian@brianmckenna.org>
|
||||
Paul Querna <pquerna@apache.org>
|
||||
Ben Lowery <ben@blowery.org>
|
||||
Peter Dekkers <soderblom.peter@gmail.com>
|
||||
David Siegel <david@artcom.de>
|
||||
Marshall Culpepper <marshall.law@gmail.com>
|
||||
Ruben Rodriguez <cha0s@therealcha0s.net>
|
||||
Dmitry Baranovskiy <Dmitry@Baranovskiy.com>
|
||||
Blake Mizerany <blake.mizerany@gmail.com>
|
||||
Jerome Etienne <jerome.etienne@gmail.com>
|
||||
Dmitriy Shalashov <skaurus@gmail.com>
|
||||
Adam Wiggins <adam@heroku.com>
|
||||
Rick Olson <technoweenie@gmail.com>
|
||||
Sergey Kryzhanovsky <skryzhanovsky@gmail.com>
|
||||
Marco Rogers <marco.rogers@gmail.com>
|
||||
Benjamin Fritsch <beanie@benle.de>
|
||||
Jan Kassens <jan@kassens.net>
|
||||
Robert Keizer <root@black.bluerack.ca>
|
||||
Sam Shull <brickysam26@gmail.com>
|
||||
Chandra Sekar S <chandru.in@gmail.com>
|
||||
Andrew Naylor <argon@mkbot.net>
|
||||
Benjamin Kramer <benny.kra@gmail.com>
|
||||
Danny Coates <dannycoates@gmail.com>
|
||||
Nick Stenning <nick@whiteink.com>
|
||||
Bert Belder <bertbelder@gmail.com>
|
||||
Trent Mick <trentm@gmail.com>
|
||||
Fedor Indutny <fedor.indutny@gmail.com>
|
||||
Illarionov Oleg <oleg@emby.ru>
|
||||
Aria Stewart <aredridel@nbtsc.org>
|
||||
Johan Euphrosine <proppy@aminche.com>
|
||||
Russell Haering <russellhaering@gmail.com>
|
||||
Bradley Meck <bradley.meck@gmail.com>
|
||||
Tobie Langel <tobie.langel@gmail.com>
|
||||
Tony Metzidis <tonym@tonym.us>
|
||||
Mark Nottingham <mnot@mnot.net>
|
||||
Sam Stephenson <sam@37signals.com>
|
||||
Jorge Chamorro Bieling <jorge@jorgechamorro.com>
|
||||
Evan Larkin <evan.larkin.il.com>
|
||||
Sean Coates <sean@seancoates.com>
|
||||
Tom Hughes <tom.hughes@palm.com>
|
||||
Joshua Peek <josh@joshpeek.com>
|
||||
Nathan Rajlich <nathan@tootallnate.net>
|
||||
Peteris Krumins <peteris.krumins@gmail.com>
|
||||
AJ ONeal <coolaj86@gmail.com>
|
||||
Sami Samhuri <sami.samhuri@gmail.com>
|
||||
Nikhil Marathe <nsm.nikhil@gmail.com>
|
||||
Vitali Lovich <vitali.lovich@palm.com>
|
||||
Stéphan Kochen <stephan@kochen.nl>
|
||||
Oleg Efimov <efimovov@gmail.com>
|
||||
Guillaume Tuton <guillaume@tuton.fr>
|
||||
Tim Cooijmans <tim@aapopfiets.nl>
|
||||
Dan Søndergaard <dan1990@gmail.com>
|
||||
Silas Sewell <silas@sewell.ch>
|
||||
Wade Simmons <wade@wades.im>
|
||||
Daniel Gröber <darklord@darkboxed.org>
|
||||
Travis Swicegood <development@domain51.com>
|
||||
Oleg Slobodskoi <oleg008@gmail.com>
|
||||
Jeremy Martin <jmar777@gmail.com>
|
||||
Michael Wilber <gcr@sneakygcr.net>
|
||||
Sean Braithwaite <brapse@gmail.com>
|
||||
Anders Conbere <aconbere@gmail.com>
|
||||
Devin Torres <devin@devintorres.com>
|
||||
Theo Schlossnagle <jesus@omniti.com>
|
||||
Kai Chen <kaichenxyz@gmail.com>
|
||||
Daniel Chcouri <333222@gmail.com>
|
||||
Mihai Călin Bazon <mihai@bazon.net>
|
||||
Ali Farhadi <a.farhadi@gmail.com>
|
||||
Daniel Ennis <aikar@aikar.co>
|
||||
Carter Allen <CarterA@opt-6.com>
|
||||
Greg Hughes <greg@ghughes.com>
|
||||
David Trejo <david.daniel.trejo@gmail.com>
|
||||
Joe Walnes <joe@walnes.com>
|
||||
Koichi Kobayashi <koichik@improvement.jp>
|
||||
Konstantin Käfer <github@kkaefer.com>
|
||||
Richard Rodger <richard@ricebridge.com>
|
||||
Andreas Reich <andreas@reich.name>
|
||||
Tony Huang <cnwzhjs@gmail.com>
|
||||
Dean McNamee <dean@gmail.com>
|
||||
Trevor Burnham <trevor@databraid.com>
|
||||
Zachary Scott <zachary@zacharyscott.net>
|
||||
Arnout Kazemier <info@3rd-Eden.com>
|
||||
George Stagas <gstagas@gmail.com>
|
||||
Ben Weaver <ben@orangesoda.net>
|
||||
Scott McWhirter <scott.mcwhirter@joyent.com>
|
||||
Jakub Lekstan <jakub.lekstan@dreamlab.pl>
|
||||
Nick Campbell <nicholas.j.campbell@gmail.com>
|
||||
Nebu Pookins <nebu@nebupookins.net>
|
||||
Tim Baumann <tim@timbaumann.info>
|
||||
Robert Mustacchi <rm@joyent.com>
|
||||
George Miroshnykov <george.miroshnykov@gmail.com>
|
||||
Mark Cavage <mark.cavage@joyent.com>
|
||||
Håvard Stranden <havard.stranden@gmail.com>
|
||||
Marcel Laverdet <marcel@laverdet.com>
|
||||
Alexandre Marangone <a.marangone@gmail.com>
|
||||
Ryan Petrello <lists@ryanpetrello.com>
|
||||
Fuji Goro <gfuji@cpan.org>
|
||||
Siddharth Mahendraker <siddharth_mahen@hotmail.com>
|
||||
Dave Pacheco <dap@joyent.com>
|
||||
Mathias Buus <m@ge.tt>
|
||||
Henry Rawas <henryr@schakra.com>
|
||||
Yoshihiro KIKUCHI <yknetg@gmail.com>
|
||||
Brett Kiefer <kiefer@gmail.com>
|
||||
Mariano Iglesias <mariano@cricava.com>
|
||||
Jörn Horstmann <git@jhorstmann.net>
|
||||
Joe Shaw <joe@joeshaw.org>
|
||||
Niklas Fiekas <niklas.fiekas@googlemail.com>
|
||||
Adam Luikart <me@adamluikart.com>
|
||||
Artem Zaytsev <a.arepo@gmail.com>
|
||||
Alex Xu <alex_y_xu@yahoo.ca>
|
||||
Jeremy Selier <jeremy@jolicloud.com>
|
||||
Igor Zinkovsky <igorzi@microsoft.com>
|
||||
Kip Gebhardt <kip.gebhardt@voxer.com>
|
||||
Stefan Rusu <saltwaterc@gmail.com>
|
||||
Shigeki Ohtsu <ohtsu@d.jp>
|
||||
Wojciech Wnętrzak <w.wnetrzak@gmail.com>
|
||||
Devon Govett <devongovett@gmail.com>
|
||||
Steve Engledow <steve.engledow@proxama.com>
|
||||
Pierre-Alexandre St-Jean <pierrealexandre.stjean@gmail.com>
|
||||
Reid Burke <me@reidburke.com>
|
||||
Vicente Jimenez Aguilar <googuy@gmail.com>
|
||||
Tadashi SAWADA <cesare@mayverse.jp>
|
||||
Jeroen Janssen <jeroen.janssen@gmail.com>
|
||||
Daniel Pihlström <sciolist.se@gmail.com>
|
||||
Stefan Bühler <stbuehler@web.de>
|
||||
Alexander Uvarov <alexander.uvarov@gmail.com>
|
||||
Aku Kotkavuo <aku@hibana.net>
|
||||
Peter Bright <drpizza@quiscalusmexicanus.org>
|
||||
Logan Smyth <loganfsmyth@gmail.com>
|
||||
Christopher Wright <christopherwright@gmail.com>
|
||||
Glen Low <glen.low@pixelglow.com>
|
||||
Thomas Shinnick <tshinnic@gmail.com>
|
||||
Mickaël Delahaye <mickael.delahaye@gmail.com>
|
||||
Antranig Basman <antranig.basman@colorado.edu>
|
||||
Maciej Małecki <maciej.malecki@notimplemented.org>
|
||||
Evan Martin <martine@danga.com>
|
||||
Peter Lyons <pete@peterlyons.com>
|
||||
Jann Horn <jannhorn@googlemail.com>
|
||||
Abimanyu Raja <abimanyuraja@gmail.com>
|
||||
Karl Skomski <karl@skomski.com>
|
||||
Niclas Hoyer <niclas@verbugt.de>
|
||||
Michael Jackson <mjijackson@gmail.com>
|
||||
Ashok Mudukutore <ashok@lineratesystems.com>
|
||||
Sean Cunningham <sean.cunningham@mandiant.com>
|
||||
Vitor Balocco <vitorbal@gmail.com>
|
||||
Ben Leslie <benno@benno.id.au>
|
||||
Eric Lovett <etlovett@gmail.com>
|
||||
Christian Tellnes <christian@tellnes.no>
|
||||
Colton Baker <github@netrefuge.net>
|
||||
Tyler Larson <talltyler@gmail.com>
|
||||
Tomasz Janczuk <tomasz@janczuk.org>
|
||||
Ilya Dmitrichenko <errordeveloper@gmail.com>
|
||||
Simen Brekken <simen.brekken@gmail.com>
|
||||
Guglielmo Ferri <44gatti@gmail.com>
|
||||
Thomas Parslow <tom@almostobsolete.net>
|
||||
Ryan Emery <seebees@gmail.com>
|
||||
Jordan Sissel <jls@semicomplete.com>
|
||||
Matt Robenolt <matt@ydekproductions.com>
|
||||
Jacob H.C. Kragh <jhckragh@gmail.com>
|
||||
Benjamin Pasero <benjamin.pasero@gmail.com>
|
||||
Scott Anderson <sanderson7@gmail.com>
|
||||
Yoji SHIDARA <dara@shidara.net>
|
||||
Mathias Bynens <mathias@qiwi.be>
|
||||
Łukasz Walukiewicz <lukasz@walukiewicz.eu>
|
||||
Artur Adib <arturadib@gmail.com>
|
||||
E. Azer Koçulu <azer@kodfabrik.com>
|
||||
Paddy Byers <paddy.byers@gmail.com>
|
||||
Roman Shtylman <shtylman@gmail.com>
|
||||
Kyle Robinson Young <kyle@dontkry.com>
|
||||
Tim Oxley <secoif@gmail.com>
|
||||
Eduard Burtescu <eddy_me08@yahoo.com>
|
||||
Ingmar Runge <ingmar@irsoft.de>
|
||||
Russ Bradberry <rbradberry@gmail.com>
|
||||
Andreas Madsen <amwebdk@gmail.com>
|
||||
Adam Malcontenti-Wilson <adman.com@gmail.com>
|
||||
Avi Flax <avi@aviflax.com>
|
||||
Pedro Teixeira <pedro.teixeira@gmail.com>
|
||||
Johan Bergström <bugs@bergstroem.nu>
|
||||
James Hartig <james.hartig@grooveshark.com>
|
||||
Shannen Saez <shannenlaptop@gmail.com>
|
||||
Seong-Rak Choi <ragiragi@hanmail.net>
|
||||
Dave Irvine <davman99@gmail.com>
|
||||
Ju-yeong Park <interruptz@gmail.com>
|
||||
Phil Sung <psung@dnanexus.com>
|
||||
Damon Oehlman <damon.oehlman@sidelab.com>
|
||||
Mikael Bourges-Sevenier <mikeseven@gmail.com>
|
||||
Emerson Macedo <emerleite@gmail.com>
|
||||
Ryunosuke SATO <tricknotes.rs@gmail.com>
|
||||
Michael Bernstein <michaelrbernstein@gmail.com>
|
||||
Guillermo Rauch <rauchg@gmail.com>
|
||||
Dan Williams <dan@igniter.com>
|
||||
Brandon Benvie <brandon@bbenvie.com>
|
||||
Nicolas LaCasse <nlacasse@borderstylo.com>
|
||||
Dan VerWeire <dverweire@gmail.com>
|
||||
Matthew Fitzsimmons <matt@joyent.com>
|
||||
Philip Tellis <philip.tellis@gmail.com>
|
||||
Christopher Jeffrey <chjjeffrey@gmail.com>
|
||||
Seth Fitzsimmons <seth@mojodna.net>
|
||||
Einar Otto Stangvik <einaros@gmail.com>
|
||||
Paul Vorbach <paul@vorb.de>
|
||||
Luke Gallagher <notfornoone@gmail.com>
|
||||
Tomasz Buchert <tomek.buchert@gmail.com>
|
||||
Myles Byrne <myles@myles.id.au>
|
||||
T.C. Hollingsworth <tchollingsworth@gmail.com>
|
||||
Cam Pedersen <diffference@gmail.com>
|
||||
Roly Fentanes <roly426@gmail.com>
|
||||
Ted Young <ted@radicaldesigns.org>
|
||||
Joshua Holbrook <josh.holbrook@gmail.com>
|
||||
Blake Miner <miner.blake@gmail.com>
|
||||
Vincent Ollivier <contact@vincentollivier.com>
|
||||
Jimb Esser <jimb@railgun3d.com>
|
||||
Sambasiva Suda <sambasivarao@gmail.com>
|
||||
Sadique Ali <sadiqalikm@gmail.com>
|
||||
Dmitry Nizovtsev <dmitry@ukrteam.com>
|
||||
Alex Kocharin <rlidwka@kocharin.ru>
|
||||
Ming Liu <vmliu1@gmail.com>
|
||||
Shea Levy <shea@shealevy.com>
|
||||
Nao Iizuka <iizuka@kyu-mu.net>
|
||||
Christian Ress <christian@ressonline.de>
|
||||
Rod Vagg <rod@vagg.org>
|
||||
Matt Ezell <ezell.matt@gmail.com>
|
||||
Charlie McConnell <charlie@charlieistheman.com>
|
||||
Farid Neshat <FaridN_SOAD@yahoo.com>
|
||||
Johannes Wüller <johanneswueller@gmail.com>
|
||||
Erik Lundin <mjor.himself@gmail.com>
|
||||
Bryan Cantrill <bryan@joyent.com>
|
||||
Yosef Dinerstein <yosefd@microsoft.com>
|
||||
Nathan Friedly <nathan@nfriedly.com>
|
||||
Aaron Jacobs <jacobsa@google.com>
|
||||
Mustansir Golawala <mgolawala@gmail.com>
|
||||
Atsuo Fukaya <fukayatsu@gmail.com>
|
||||
Domenic Denicola <domenic@domenicdenicola.com>
|
||||
Joshua S. Weinstein <josher19@users.sf.net>
|
||||
Dane Springmeyer <dane@dbsgeo.com>
|
||||
Erik Dubbelboer <erik@dubbelboer.com>
|
||||
Malte-Thorben Bruns <skenqbx@googlemail.com>
|
||||
Michael Thomas <aelmalinka@gmail.com>
|
||||
Garen Torikian <gjtorikian@gmail.com>
|
||||
EungJun Yi <semtlenori@gmail.com>
|
||||
Vincent Voyer <v@fasterize.com>
|
||||
Takahiro ANDO <takahiro.ando@gmail.com>
|
||||
Erwin van der Koogh <github@koogh.com>
|
||||
Brian Schroeder <bts@gmail.com>
|
||||
J. Lee Coltrane <lee@projectmastermind.com>
|
||||
Javier Hernández <jhernandez@emergya.com>
|
||||
James Koval <james.ross.koval@gmail.com>
|
||||
Kevin Gadd <kevin.gadd@gmail.com>
|
||||
Ray Solomon <raybsolomon@gmail.com>
|
||||
Kevin Bowman <github@magicmonkey.org>
|
||||
Matt Gollob <mattgollob@gmail.com>
|
||||
Simon Sturmer <sstur@me.com>
|
||||
Joel Brandt <joelrbrandt@gmail.com>
|
||||
Marc Harter <wavded@gmail.com>
|
||||
Nuno Job <nunojobpinto@gmail.com>
|
||||
Ben Kelly <ben@wanderview.com>
|
||||
Felix Böhm <felixboehm55@googlemail.com>
|
||||
Gabriel de Perthuis <g2p.code@gmail.com>
|
||||
Tim Macfarlane <timmacfarlane@gmail.com>
|
||||
Jonas Westerlund <jonas.westerlund@me.com>
|
||||
Dominic Tarr <dominic.tarr@gmail.com>
|
||||
Justin Plock <jplock@gmail.com>
|
||||
Toshihiro Nakamura <toshihiro.nakamura@gmail.com>
|
||||
Ivan Torres <mexpolk@gmail.com>
|
||||
Philipp Hagemeister <phihag@phihag.de>
|
||||
George Shank <shankga@gmail.com>
|
||||
Mike Morearty <mike@morearty.com>
|
||||
Peter Rybin <peter.rybin@gmail.com>
|
||||
Eugen Dueck <eugen@dueck.org>
|
||||
Gil Pedersen <git@gpost.dk>
|
||||
Tyler Neylon <tylerneylon@gmail.com>
|
||||
Golo Roden <webmaster@goloroden.de>
|
||||
Ron Korving <rkorving@wizcorp.jp>
|
||||
Brandon Wilson <chlavois@gmail.com>
|
||||
Bearice Ren <bearice@gmail.com>
|
||||
Ankur Oberoi <aoberoi@gmail.com>
|
||||
Atsuya Takagi <atsuya.takagi@gmail.com>
|
||||
Pooya Karimian <pkarimian@sencha.com>
|
||||
Frédéric Germain <frederic.germain@gmail.com>
|
||||
Robin Lee <cheeselee@fedoraproject.org>
|
||||
Adam Blackburn <regality@gmail.com>
|
||||
Willi Eggeling <email@wje-online.de>
|
||||
Andrew Paprocki <andrew@ishiboo.com>
|
||||
Max Ogden <max@maxogden.com>
|
||||
Olivier Lalonde <olalonde@gmail.com>
|
||||
Francois Marier <francois@mozilla.com>
|
||||
Trevor Norris <trev.norris@gmail.com>
|
||||
Joshua Erickson <josh@snoj.us>
|
||||
Kai Sasaki Lewuathe <sasaki_kai@lewuathe.sakura.ne.jp>
|
||||
Nicolas Chambrier <naholyr@gmail.com>
|
||||
Tim Bradshaw <tfb@cley.com>
|
||||
Johannes Ewald <mail@johannesewald.de>
|
||||
Chris Dent <chris.dent@gmail.com>
|
||||
Dan Milon <danmilon@gmail.com>
|
||||
Jacob Gable <jacob.gable@gmail.com>
|
||||
Rick Yakubowski <richard@orpha-systems.com>
|
||||
Dan Kohn <dan@dankohn.com>
|
||||
Timothy J Fontaine <tjfontaine@gmail.com>
|
||||
Eugene Girshov <eugene.girshov@nixu.com>
|
||||
Raymond Feng <enjoyjava@gmail.com>
|
||||
Tobias Müllerleile <tobias@muellerleile.net>
|
||||
Daniel Chatfield <chatfielddaniel@gmail.com>
|
||||
cjihrig <cjihrig@gmail.com>
|
||||
2
BSDmakefile
Normal file
2
BSDmakefile
Normal file
@@ -0,0 +1,2 @@
|
||||
all:
|
||||
@echo "I need GNU make. Please run \`gmake\` instead."
|
||||
145
CONTRIBUTING.md
Normal file
145
CONTRIBUTING.md
Normal file
@@ -0,0 +1,145 @@
|
||||
# CONTRIBUTING
|
||||
|
||||
The node.js project welcomes new contributors. This document will guide you
|
||||
through the process.
|
||||
|
||||
|
||||
### FORK
|
||||
|
||||
Fork the project [on GitHub](https://github.com/joyent/node) and check out
|
||||
your copy.
|
||||
|
||||
```
|
||||
$ git clone git@github.com:username/node.git
|
||||
$ cd node
|
||||
$ git remote add upstream git://github.com/joyent/node.git
|
||||
```
|
||||
|
||||
Now decide if you want your feature or bug fix to go into the master branch
|
||||
or the stable branch. As a rule of thumb, bug fixes go into the stable branch
|
||||
while new features go into the master branch.
|
||||
|
||||
The stable branch is effectively frozen; patches that change the node.js
|
||||
API/ABI or affect the run-time behavior of applications get rejected.
|
||||
|
||||
The rules for the master branch are less strict; consult the
|
||||
[stability index page][] for details.
|
||||
|
||||
In a nutshell, modules are at varying levels of API stability. Bug fixes are
|
||||
always welcome but API or behavioral changes to modules at stability level 3
|
||||
and up are off-limits.
|
||||
|
||||
Node.js has several bundled dependencies in the deps/ and the tools/
|
||||
directories that are not part of the project proper. Any changes to files
|
||||
in those directories or its subdirectories should be sent to their respective
|
||||
projects. Do not send your patch to us, we cannot accept it.
|
||||
|
||||
In case of doubt, open an issue in the [issue tracker][], post your question
|
||||
to the [node.js mailing list][] or contact one of the [project maintainers][]
|
||||
on [IRC][].
|
||||
|
||||
Especially do so if you plan to work on something big. Nothing is more
|
||||
frustrating than seeing your hard work go to waste because your vision
|
||||
does not align with that of a project maintainer.
|
||||
|
||||
|
||||
### BRANCH
|
||||
|
||||
Okay, so you have decided on the proper branch. Create a feature branch
|
||||
and start hacking:
|
||||
|
||||
```
|
||||
$ git checkout -b my-feature-branch -t origin/v0.8
|
||||
```
|
||||
|
||||
(Where v0.8 is the latest stable branch as of this writing.)
|
||||
|
||||
|
||||
### COMMIT
|
||||
|
||||
Make sure git knows your name and email address:
|
||||
|
||||
```
|
||||
$ git config --global user.name "J. Random User"
|
||||
$ git config --global user.email "j.random.user@example.com"
|
||||
```
|
||||
|
||||
Writing good commit logs is important. A commit log should describe what
|
||||
changed and why. Follow these guidelines when writing one:
|
||||
|
||||
1. The first line should be 50 characters or less and contain a short
|
||||
description of the change.
|
||||
2. Keep the second line blank.
|
||||
3. Wrap all other lines at 72 columns.
|
||||
|
||||
A good commit log looks like this:
|
||||
|
||||
```
|
||||
Header line: explaining the commit in one line
|
||||
|
||||
Body of commit message is a few lines of text, explaining things
|
||||
in more detail, possibly giving some background about the issue
|
||||
being fixed, etc etc.
|
||||
|
||||
The body of the commit message can be several paragraphs, and
|
||||
please do proper word-wrap and keep columns shorter than about
|
||||
72 characters or so. That way `git log` will show things
|
||||
nicely even when it is indented.
|
||||
```
|
||||
|
||||
The header line should be meaningful; it is what other people see when they
|
||||
run `git shortlog` or `git log --oneline`.
|
||||
|
||||
Have a look at `git log` for inspiration.
|
||||
|
||||
|
||||
### REBASE
|
||||
|
||||
Use `git rebase` (not `git merge`) to sync your work from time to time.
|
||||
|
||||
```
|
||||
$ git fetch upstream
|
||||
$ git rebase upstream/v0.8 # or upstream/master
|
||||
```
|
||||
|
||||
|
||||
### TEST
|
||||
|
||||
Bug fixes and features should come with tests. Add your tests in the
|
||||
test/simple/ directory. Look at other tests to see how they should be
|
||||
structured (license boilerplate, common includes, etc.).
|
||||
|
||||
```
|
||||
$ make jslint test
|
||||
```
|
||||
|
||||
Make sure the linter is happy and that all tests pass. Please, do not submit
|
||||
patches that fail either check.
|
||||
|
||||
|
||||
### PUSH
|
||||
|
||||
```
|
||||
$ git push origin my-feature-branch
|
||||
```
|
||||
|
||||
Go to https://github.com/username/node and select your feature branch. Click
|
||||
the 'Pull Request' button and fill out the form.
|
||||
|
||||
Pull requests are usually reviewed within a few days. If there are comments
|
||||
to address, apply your changes in a separate commit and push that to your
|
||||
feature branch. Post a comment in the pull request afterwards; GitHub does
|
||||
not send out notifications when you add commits.
|
||||
|
||||
|
||||
### CONTRIBUTOR LICENSE AGREEMENT
|
||||
|
||||
Please visit http://nodejs.org/cla.html and sign the Contributor License
|
||||
Agreement. You only need to do that once.
|
||||
|
||||
|
||||
[stability index page]: https://github.com/joyent/node/blob/master/doc/api/documentation.markdown
|
||||
[issue tracker]: https://github.com/joyent/node/issues
|
||||
[node.js mailing list]: http://groups.google.com/group/nodejs
|
||||
[IRC]: http://webchat.freenode.net/?channels=node.js
|
||||
[project maintainers]: https://github.com/joyent/node/wiki/Project-Organization
|
||||
619
LICENSE
619
LICENSE
@@ -1,38 +1,8 @@
|
||||
This license applies to all parts of Node that are not externally
|
||||
maintained libraries. The externally maintained libraries used by Node
|
||||
are:
|
||||
|
||||
- v8, located under deps/v8, which is copyrighted by the Google, Inc.
|
||||
v8 has an MIT license.
|
||||
|
||||
- libev, located under deps/libev, and libeio, located at deps/libeio.
|
||||
This code is copyrighted by Marc Alexander Lehmann. Both are dually
|
||||
licensed under MIT and GPL2.
|
||||
|
||||
- JSMin JavaScript minifier, located at tools/jsmin.py. This code is
|
||||
copyrighted by Douglas Crockford and Baruch Even and has an MIT license.
|
||||
|
||||
- parseUri, a URI parser, is located in lib/http.js. This is just a small
|
||||
snippit. It is copyrighted 2007 by Steven Levithan and released under an
|
||||
MIT license.
|
||||
|
||||
- WAF build system, located at tools/waf. Copyrighted Thomas Nagy.
|
||||
Released under an MIT license.
|
||||
|
||||
- The SCONS build system, located at tools/scons. Copyrighted by the SCONS
|
||||
Foundation. Released under an MIT license.
|
||||
|
||||
- UDNS, an asynchronous DNS client, located at deps/udns. Copyrighted by
|
||||
Michael Tokarev <mjt@corpit.ru>. Released under the GNU Lesser General
|
||||
Public License version 2.1.
|
||||
|
||||
Additionally deps/http_parser is based on Zed Shaw's Mongrel. Mongrel is
|
||||
copyrighted by Zed Shaw and distributed under GPL2 or a permissive open
|
||||
licence. See deps/http_parser/LICENCE for more information.
|
||||
|
||||
Node's license follows:
|
||||
|
||||
Copyright 2009, Ryan Lienhart Dahl. All rights reserved.
|
||||
====
|
||||
|
||||
Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to
|
||||
deal in the Software without restriction, including without limitation the
|
||||
@@ -49,4 +19,585 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
IN THE SOFTWARE.
|
||||
IN THE SOFTWARE.
|
||||
|
||||
====
|
||||
|
||||
This license applies to all parts of Node that are not externally
|
||||
maintained libraries. The externally maintained libraries used by Node are:
|
||||
|
||||
- V8, located at deps/v8. V8's license follows:
|
||||
"""
|
||||
This license applies to all parts of V8 that are not externally
|
||||
maintained libraries. The externally maintained libraries used by V8
|
||||
are:
|
||||
|
||||
- PCRE test suite, located in
|
||||
test/mjsunit/third_party/regexp-pcre.js. This is based on the
|
||||
test suite from PCRE-7.3, which is copyrighted by the University
|
||||
of Cambridge and Google, Inc. The copyright notice and license
|
||||
are embedded in regexp-pcre.js.
|
||||
|
||||
- Layout tests, located in test/mjsunit/third_party. These are
|
||||
based on layout tests from webkit.org which are copyrighted by
|
||||
Apple Computer, Inc. and released under a 3-clause BSD license.
|
||||
|
||||
- Strongtalk assembler, the basis of the files assembler-arm-inl.h,
|
||||
assembler-arm.cc, assembler-arm.h, assembler-ia32-inl.h,
|
||||
assembler-ia32.cc, assembler-ia32.h, assembler-x64-inl.h,
|
||||
assembler-x64.cc, assembler-x64.h, assembler-mips-inl.h,
|
||||
assembler-mips.cc, assembler-mips.h, assembler.cc and assembler.h.
|
||||
This code is copyrighted by Sun Microsystems Inc. and released
|
||||
under a 3-clause BSD license.
|
||||
|
||||
- Valgrind client API header, located at third_party/valgrind/valgrind.h
|
||||
This is release under the BSD license.
|
||||
|
||||
These libraries have their own licenses; we recommend you read them,
|
||||
as their terms may differ from the terms below.
|
||||
|
||||
Copyright 2006-2012, the V8 project authors. All rights reserved.
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
* Neither the name of Google Inc. nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
"""
|
||||
|
||||
- libev, located at deps/uv/src/unix/ev. libev's license follows:
|
||||
"""
|
||||
All files in libev are Copyright (C)2007,2008,2009 Marc Alexander Lehmann.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Alternatively, the contents of this package may be used under the terms
|
||||
of the GNU General Public License ("GPL") version 2 or any later version,
|
||||
in which case the provisions of the GPL are applicable instead of the
|
||||
above. If you wish to allow the use of your version of this package only
|
||||
under the terms of the GPL and not to allow others to use your version of
|
||||
this file under the BSD license, indicate your decision by deleting the
|
||||
provisions above and replace them with the notice and other provisions
|
||||
required by the GPL in this and the other files of this package. If you do
|
||||
not delete the provisions above, a recipient may use your version of this
|
||||
file under either the BSD or the GPL.
|
||||
"""
|
||||
|
||||
- libeio, located at deps/uv/src/unix/eio. libeio's license follows:
|
||||
"""
|
||||
All files in libeio are Copyright (C)2007,2008 Marc Alexander Lehmann.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Alternatively, the contents of this package may be used under the terms
|
||||
of the GNU General Public License ("GPL") version 2 or any later version,
|
||||
in which case the provisions of the GPL are applicable instead of the
|
||||
above. If you wish to allow the use of your version of this package only
|
||||
under the terms of the GPL and not to allow others to use your version of
|
||||
this file under the BSD license, indicate your decision by deleting the
|
||||
provisions above and replace them with the notice and other provisions
|
||||
required by the GPL in this and the other files of this package. If you do
|
||||
not delete the provisions above, a recipient may use your version of this
|
||||
file under either the BSD or the GPL.
|
||||
"""
|
||||
|
||||
- WAF build system, located at tools/waf*. WAF's license follows:
|
||||
"""
|
||||
Copyright Thomas Nagy, 2005-2011
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. The name of the author may not be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
"""
|
||||
|
||||
- C-Ares, an asynchronous DNS client, located at deps/uv/src/ares. C-Ares license
|
||||
follows:
|
||||
"""
|
||||
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software and its documentation for any purpose and without
|
||||
* fee is hereby granted, provided that the above copyright
|
||||
* notice appear in all copies and that both that copyright
|
||||
* notice and this permission notice appear in supporting
|
||||
* documentation, and that the name of M.I.T. not be used in
|
||||
* advertising or publicity pertaining to distribution of the
|
||||
* software without specific, written prior permission.
|
||||
* M.I.T. makes no representations about the suitability of
|
||||
* this software for any purpose. It is provided "as is"
|
||||
* without express or implied warranty.
|
||||
"""
|
||||
|
||||
- OpenSSL located at deps/openssl. OpenSSL is cryptographic software written
|
||||
by Eric Young (eay@cryptsoft.com) to provide SSL/TLS encryption. OpenSSL's
|
||||
license follows:
|
||||
"""
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* openssl-core@openssl.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
"""
|
||||
|
||||
- HTTP Parser, located at deps/http_parser. HTTP Parser's license follows:
|
||||
"""
|
||||
http_parser.c is based on src/http/ngx_http_parse.c from NGINX copyright
|
||||
Igor Sysoev.
|
||||
|
||||
Additional changes are licensed under the same terms as NGINX and
|
||||
copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to
|
||||
deal in the Software without restriction, including without limitation the
|
||||
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
sell copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
IN THE SOFTWARE.
|
||||
"""
|
||||
|
||||
- Closure Linter is located at tools/closure_linter. Closure's license
|
||||
follows:
|
||||
"""
|
||||
# Copyright (c) 2007, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
"""
|
||||
|
||||
- tools/cpplint.py is a C++ linter. Its license follows:
|
||||
"""
|
||||
# Copyright (c) 2009 Google Inc. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
"""
|
||||
|
||||
- lib/buffer_ieee754.js. Its license follows:
|
||||
"""
|
||||
// Copyright (c) 2008, Fair Oaks Labs, Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * Neither the name of Fair Oaks Labs, Inc. nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
"""
|
||||
|
||||
- lib/punycode.js is copyright 2011 Mathias Bynens <http://mathiasbynens.be/>
|
||||
and released under the MIT license.
|
||||
"""
|
||||
* Punycode.js <http://mths.be/punycode>
|
||||
* Copyright 2011 Mathias Bynens <http://mathiasbynens.be/>
|
||||
* Available under MIT license <http://mths.be/mit>
|
||||
"""
|
||||
|
||||
- tools/gyp. GYP is a meta-build system. GYP's license follows:
|
||||
"""
|
||||
Copyright (c) 2009 Google Inc. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Google Inc. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
"""
|
||||
|
||||
- Zlib at deps/zlib. zlib's license follows:
|
||||
"""
|
||||
/* zlib.h -- interface of the 'zlib' general purpose compression library
|
||||
version 1.2.4, March 14th, 2010
|
||||
|
||||
Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
|
||||
Jean-loup Gailly
|
||||
Mark Adler
|
||||
|
||||
*/
|
||||
"""
|
||||
|
||||
- npm is a package manager program located at deps/npm.
|
||||
npm's license follows:
|
||||
"""
|
||||
Copyright 2009-2012, Isaac Z. Schlueter (the "Original Author")
|
||||
All rights reserved.
|
||||
|
||||
MIT +no-false-attribs License
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
Distributions of all or part of the Software intended to be used
|
||||
by the recipients as they would use the unmodified Software,
|
||||
containing modifications that substantially alter, remove, or
|
||||
disable functionality of the Software, outside of the documented
|
||||
configuration mechanisms provided by the Software, shall be
|
||||
modified such that the Original Author's bug reporting email
|
||||
addresses and urls are either replaced with the contact information
|
||||
of the parties responsible for the changes, or removed entirely.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
Except where noted, this license applies to any and all software
|
||||
programs and associated documentation files created by the
|
||||
Original Author, when distributed with the Software.
|
||||
|
||||
"Node.js" and "node" trademark Joyent, Inc. npm is not officially
|
||||
part of the Node.js project, and is neither owned by nor
|
||||
officially affiliated with Joyent, Inc.
|
||||
|
||||
Packages published in the npm registry are not part of npm
|
||||
itself, are the sole property of their respective maintainers,
|
||||
and are not covered by this license.
|
||||
|
||||
"npm Logo" created by Mathias Pettersson and Brian Hammond,
|
||||
used with permission.
|
||||
|
||||
"Gubblebum Blocky" font
|
||||
Copyright (c) 2007 by Tjarda Koster, http://jelloween.deviantart.com
|
||||
included for use in the npm website and documentation,
|
||||
used with permission.
|
||||
|
||||
This program uses "node-uuid", Copyright (c) 2010 Robert Kieffer,
|
||||
according to the terms of the MIT license.
|
||||
|
||||
This program uses "request", Copyright (c) 2011 Mikeal Rogers,
|
||||
according to the terms of the Apache license.
|
||||
|
||||
This program uses "mkdirp", Copyright (c) 2010 James Halliday,
|
||||
according to the terms of the MIT/X11 license.
|
||||
"""
|
||||
|
||||
- tools/doc/node_modules/marked. Marked is a Markdown parser. Marked's
|
||||
license follows:
|
||||
"""
|
||||
Copyright (c) 2011-2012, Christopher Jeffrey (https://github.com/chjj/)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
"""
|
||||
|
||||
- test/gc/node_modules/weak. Node-weak is a node.js addon that provides garbage
|
||||
collector notifications. Node-weak's license follows:
|
||||
"""
|
||||
Copyright (c) 2011, Ben Noordhuis <info@bnoordhuis.nl>
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
"""
|
||||
|
||||
- src/ngx-queue.h. ngx-queue.h is taken from the nginx source tree. nginx's
|
||||
license follows:
|
||||
"""
|
||||
Copyright (C) 2002-2012 Igor Sysoev
|
||||
Copyright (C) 2011,2012 Nginx, Inc.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGE.
|
||||
"""
|
||||
|
||||
357
Makefile
357
Makefile
@@ -1,71 +1,316 @@
|
||||
all:
|
||||
@tools/waf-light build
|
||||
-include config.mk
|
||||
|
||||
all-debug:
|
||||
@tools/waf-light -v build
|
||||
BUILDTYPE ?= Release
|
||||
PYTHON ?= python
|
||||
DESTDIR ?=
|
||||
SIGN ?=
|
||||
|
||||
all-progress:
|
||||
@tools/waf-light -p build
|
||||
# Default to verbose builds.
|
||||
# To do quiet/pretty builds, run `make V=` to set V to an empty string,
|
||||
# or set the V environment variable to an empty string.
|
||||
V ?= 1
|
||||
|
||||
install:
|
||||
@tools/waf-light install
|
||||
# BUILDTYPE=Debug builds both release and debug builds. If you want to compile
|
||||
# just the debug build, run `make -C out BUILDTYPE=Debug` instead.
|
||||
ifeq ($(BUILDTYPE),Release)
|
||||
all: out/Makefile node
|
||||
else
|
||||
all: out/Makefile node node_g
|
||||
endif
|
||||
|
||||
# The .PHONY is needed to ensure that we recursively use the out/Makefile
|
||||
# to check for changes.
|
||||
.PHONY: node node_g
|
||||
|
||||
node: config.gypi out/Makefile
|
||||
$(MAKE) -C out BUILDTYPE=Release V=$(V)
|
||||
ln -fs out/Release/node node
|
||||
|
||||
node_g: config.gypi out/Makefile
|
||||
$(MAKE) -C out BUILDTYPE=Debug V=$(V)
|
||||
ln -fs out/Debug/node node_g
|
||||
|
||||
config.gypi: configure
|
||||
./configure
|
||||
|
||||
out/Debug/node:
|
||||
$(MAKE) -C out BUILDTYPE=Debug V=$(V)
|
||||
|
||||
out/Makefile: common.gypi deps/uv/uv.gyp deps/http_parser/http_parser.gyp deps/zlib/zlib.gyp deps/v8/build/common.gypi deps/v8/tools/gyp/v8.gyp node.gyp config.gypi
|
||||
$(PYTHON) tools/gyp_node -f make
|
||||
|
||||
install: all
|
||||
$(PYTHON) tools/install.py $@ $(DESTDIR)
|
||||
|
||||
uninstall:
|
||||
@tools/waf-light uninstall
|
||||
|
||||
test: all
|
||||
python tools/test.py --mode=release
|
||||
|
||||
test-all: all
|
||||
python tools/test.py --mode=debug,release
|
||||
|
||||
test-debug: all
|
||||
python tools/test.py --mode=debug
|
||||
|
||||
benchmark: all
|
||||
build/default/node benchmark/run.js
|
||||
|
||||
doc: doc/node.1 doc/api.html doc/index.html
|
||||
|
||||
doc/api.html: doc/api.txt
|
||||
asciidoc --unsafe \
|
||||
-a theme=pipe \
|
||||
-a toc \
|
||||
-a linkcss \
|
||||
-o doc/api.html doc/api.txt
|
||||
|
||||
doc/api.xml: doc/api.txt
|
||||
asciidoc -b docbook -d manpage -o doc/api.xml doc/api.txt
|
||||
|
||||
doc/node.1: doc/api.xml
|
||||
xsltproc --output doc/node.1 --nonet doc/manpage.xsl doc/api.xml
|
||||
|
||||
website-upload: doc
|
||||
scp doc/* linode:~/tinyclouds/node/
|
||||
$(PYTHON) tools/install.py $@ $(DESTDIR)
|
||||
|
||||
clean:
|
||||
@-rm -f doc/node.1 doc/api.xml doc/api.html
|
||||
@tools/waf-light clean
|
||||
-rm -rf out/Makefile node node_g out/$(BUILDTYPE)/node blog.html email.md
|
||||
-find out/ -name '*.o' -o -name '*.a' | xargs rm -rf
|
||||
-rm -rf node_modules
|
||||
|
||||
distclean: clean
|
||||
@-rm -rf build/
|
||||
@-find tools/ -name "*.pyc" -delete
|
||||
distclean:
|
||||
-rm -rf out
|
||||
-rm -f config.gypi
|
||||
-rm -f config.mk
|
||||
-rm -rf node node_g blog.html email.md
|
||||
-rm -rf node_modules
|
||||
|
||||
check:
|
||||
@tools/waf-light check
|
||||
test: all
|
||||
$(PYTHON) tools/test.py --mode=release simple message
|
||||
PYTHONPATH=tools/closure_linter/ $(PYTHON) tools/closure_linter/closure_linter/gjslint.py --unix_mode --strict --nojsdoc -r lib/ -r src/ --exclude_files lib/punycode.js
|
||||
|
||||
VERSION=$(shell git-describe)
|
||||
test-http1: all
|
||||
$(PYTHON) tools/test.py --mode=release --use-http1 simple message
|
||||
|
||||
test-valgrind: all
|
||||
$(PYTHON) tools/test.py --mode=release --valgrind simple message
|
||||
|
||||
test/gc/node_modules/weak/build:
|
||||
@if [ ! -f node ]; then make all; fi
|
||||
./node deps/npm/node_modules/node-gyp/bin/node-gyp rebuild \
|
||||
--directory="$(shell pwd)/test/gc/node_modules/weak" \
|
||||
--nodedir="$(shell pwd)"
|
||||
|
||||
test-gc: all test/gc/node_modules/weak/build
|
||||
$(PYTHON) tools/test.py --mode=release gc
|
||||
|
||||
test-all: all test/gc/node_modules/weak/build
|
||||
$(PYTHON) tools/test.py --mode=debug,release
|
||||
make test-npm
|
||||
|
||||
test-all-http1: all
|
||||
$(PYTHON) tools/test.py --mode=debug,release --use-http1
|
||||
|
||||
test-all-valgrind: all
|
||||
$(PYTHON) tools/test.py --mode=debug,release --valgrind
|
||||
|
||||
test-release: all
|
||||
$(PYTHON) tools/test.py --mode=release
|
||||
|
||||
test-debug: all
|
||||
$(PYTHON) tools/test.py --mode=debug
|
||||
|
||||
test-message: all
|
||||
$(PYTHON) tools/test.py message
|
||||
|
||||
test-simple: all
|
||||
$(PYTHON) tools/test.py simple
|
||||
|
||||
test-pummel: all
|
||||
$(PYTHON) tools/test.py pummel
|
||||
|
||||
test-internet: all
|
||||
$(PYTHON) tools/test.py internet
|
||||
|
||||
test-npm: node
|
||||
./node deps/npm/test/run.js
|
||||
|
||||
test-npm-publish: node
|
||||
npm_package_config_publishtest=true ./node deps/npm/test/run.js
|
||||
|
||||
apidoc_sources = $(wildcard doc/api/*.markdown)
|
||||
apidocs = $(addprefix out/,$(apidoc_sources:.markdown=.html)) \
|
||||
$(addprefix out/,$(apidoc_sources:.markdown=.json))
|
||||
|
||||
apidoc_dirs = out/doc out/doc/api/ out/doc/api/assets out/doc/about out/doc/community out/doc/download out/doc/logos out/doc/images
|
||||
|
||||
apiassets = $(subst api_assets,api/assets,$(addprefix out/,$(wildcard doc/api_assets/*)))
|
||||
|
||||
doc_images = $(addprefix out/,$(wildcard doc/images/* doc/*.jpg doc/*.png))
|
||||
|
||||
website_files = \
|
||||
out/doc/index.html \
|
||||
out/doc/v0.4_announcement.html \
|
||||
out/doc/cla.html \
|
||||
out/doc/sh_main.js \
|
||||
out/doc/sh_javascript.min.js \
|
||||
out/doc/sh_vim-dark.css \
|
||||
out/doc/sh.css \
|
||||
out/doc/favicon.ico \
|
||||
out/doc/pipe.css \
|
||||
out/doc/about/index.html \
|
||||
out/doc/community/index.html \
|
||||
out/doc/download/index.html \
|
||||
out/doc/logos/index.html \
|
||||
out/doc/changelog.html \
|
||||
$(doc_images)
|
||||
|
||||
doc: $(apidoc_dirs) $(website_files) $(apiassets) $(apidocs) tools/doc/ blog node
|
||||
|
||||
blogclean:
|
||||
rm -rf out/blog
|
||||
|
||||
blog: doc/blog out/Release/node tools/blog
|
||||
out/Release/node tools/blog/generate.js doc/blog/ out/blog/ doc/blog.html doc/rss.xml
|
||||
|
||||
$(apidoc_dirs):
|
||||
mkdir -p $@
|
||||
|
||||
out/doc/api/assets/%: doc/api_assets/% out/doc/api/assets/
|
||||
cp $< $@
|
||||
|
||||
out/doc/changelog.html: ChangeLog doc/changelog-head.html doc/changelog-foot.html tools/build-changelog.sh node
|
||||
bash tools/build-changelog.sh
|
||||
|
||||
out/doc/%.html: doc/%.html node
|
||||
cat $< | sed -e 's|__VERSION__|'$(VERSION)'|g' > $@
|
||||
|
||||
out/doc/%: doc/%
|
||||
cp -r $< $@
|
||||
|
||||
out/doc/api/%.json: doc/api/%.markdown node
|
||||
out/Release/node tools/doc/generate.js --format=json $< > $@
|
||||
|
||||
out/doc/api/%.html: doc/api/%.markdown node
|
||||
out/Release/node tools/doc/generate.js --format=html --template=doc/template.html $< > $@
|
||||
|
||||
email.md: ChangeLog tools/email-footer.md
|
||||
bash tools/changelog-head.sh | sed 's|^\* #|* \\#|g' > $@
|
||||
cat tools/email-footer.md | sed -e 's|__VERSION__|'$(VERSION)'|g' >> $@
|
||||
|
||||
blog.html: email.md
|
||||
cat $< | ./node tools/doc/node_modules/.bin/marked > $@
|
||||
|
||||
blog-upload: blog
|
||||
rsync -r out/blog/ node@nodejs.org:~/web/nodejs.org/blog/
|
||||
|
||||
website-upload: doc
|
||||
rsync -r out/doc/ node@nodejs.org:~/web/nodejs.org/
|
||||
ssh node@nodejs.org '\
|
||||
rm -f ~/web/nodejs.org/dist/latest &&\
|
||||
ln -s $(VERSION) ~/web/nodejs.org/dist/latest &&\
|
||||
rm -f ~/web/nodejs.org/docs/latest &&\
|
||||
ln -s $(VERSION) ~/web/nodejs.org/docs/latest &&\
|
||||
rm -f ~/web/nodejs.org/dist/node-latest.tar.gz &&\
|
||||
ln -s $(VERSION)/node-$(VERSION).tar.gz ~/web/nodejs.org/dist/node-latest.tar.gz'
|
||||
|
||||
docopen: out/doc/api/all.html
|
||||
-google-chrome out/doc/api/all.html
|
||||
|
||||
docclean:
|
||||
-rm -rf out/doc
|
||||
|
||||
VERSION=v$(shell $(PYTHON) tools/getnodeversion.py)
|
||||
RELEASE=$(shell $(PYTHON) tools/getnodeisrelease.py)
|
||||
PLATFORM=$(shell uname | tr '[:upper:]' '[:lower:]')
|
||||
ifeq ($(findstring x86_64,$(shell uname -m)),x86_64)
|
||||
DESTCPU ?= x64
|
||||
else
|
||||
DESTCPU ?= ia32
|
||||
endif
|
||||
ifeq ($(DESTCPU),x64)
|
||||
ARCH=x64
|
||||
else
|
||||
ARCH=x86
|
||||
endif
|
||||
TARNAME=node-$(VERSION)
|
||||
TARBALL=$(TARNAME).tar.gz
|
||||
BINARYNAME=$(TARNAME)-$(PLATFORM)-$(ARCH)
|
||||
BINARYTAR=$(BINARYNAME).tar.gz
|
||||
PKG=out/$(TARNAME).pkg
|
||||
packagemaker=/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker
|
||||
|
||||
dist: doc/node.1 doc/api.html
|
||||
git-archive --prefix=$(TARNAME)/ HEAD > $(TARNAME).tar
|
||||
mkdir -p $(TARNAME)/doc
|
||||
dist: doc $(TARBALL) $(PKG)
|
||||
|
||||
PKGDIR=out/dist-osx
|
||||
|
||||
release-only:
|
||||
@if [ "$(shell git status --porcelain | egrep -v '^\?\? ')" = "" ]; then \
|
||||
exit 0 ; \
|
||||
else \
|
||||
echo "" >&2 ; \
|
||||
echo "The git repository is not clean." >&2 ; \
|
||||
echo "Please commit changes before building release tarball." >&2 ; \
|
||||
echo "" >&2 ; \
|
||||
git status --porcelain | egrep -v '^\?\?' >&2 ; \
|
||||
echo "" >&2 ; \
|
||||
exit 1 ; \
|
||||
fi
|
||||
@if [ "$(RELEASE)" = "1" ]; then \
|
||||
exit 0; \
|
||||
else \
|
||||
echo "" >&2 ; \
|
||||
echo "#NODE_VERSION_IS_RELEASE is set to $(RELEASE)." >&2 ; \
|
||||
echo "Did you remember to update src/node_version.cc?" >&2 ; \
|
||||
echo "" >&2 ; \
|
||||
exit 1 ; \
|
||||
fi
|
||||
|
||||
pkg: $(PKG)
|
||||
|
||||
$(PKG): release-only
|
||||
rm -rf $(PKGDIR)
|
||||
rm -rf out/deps out/Release
|
||||
./configure --prefix=$(PKGDIR)/32/usr/local --without-snapshot --dest-cpu=ia32
|
||||
$(MAKE) install V=$(V)
|
||||
rm -rf out/deps out/Release
|
||||
./configure --prefix=$(PKGDIR)/usr/local --without-snapshot --dest-cpu=x64
|
||||
$(MAKE) install V=$(V)
|
||||
SIGN="$(APP_SIGN)" PKGDIR="$(PKGDIR)" bash tools/osx-codesign.sh
|
||||
lipo $(PKGDIR)/32/usr/local/bin/node \
|
||||
$(PKGDIR)/usr/local/bin/node \
|
||||
-output $(PKGDIR)/usr/local/bin/node-universal \
|
||||
-create
|
||||
mv $(PKGDIR)/usr/local/bin/node-universal $(PKGDIR)/usr/local/bin/node
|
||||
rm -rf $(PKGDIR)/32
|
||||
$(packagemaker) \
|
||||
--id "org.nodejs.Node" \
|
||||
--doc tools/osx-pkg.pmdoc \
|
||||
--out $(PKG)
|
||||
SIGN="$(INT_SIGN)" PKG="$(PKG)" bash tools/osx-productsign.sh
|
||||
|
||||
$(TARBALL): release-only node doc
|
||||
git archive --format=tar --prefix=$(TARNAME)/ HEAD | tar xf -
|
||||
mkdir -p $(TARNAME)/doc/api
|
||||
cp doc/node.1 $(TARNAME)/doc/node.1
|
||||
cp doc/api.html $(TARNAME)/doc/api.html
|
||||
tar rf $(TARNAME).tar \
|
||||
$(TARNAME)/doc/node.1 \
|
||||
$(TARNAME)/doc/api.html
|
||||
rm -r $(TARNAME)
|
||||
cp -r out/doc/api/* $(TARNAME)/doc/api/
|
||||
rm -rf $(TARNAME)/deps/v8/test # too big
|
||||
rm -rf $(TARNAME)/doc/images # too big
|
||||
find $(TARNAME)/ -type l | xargs rm # annoying on windows
|
||||
tar -cf $(TARNAME).tar $(TARNAME)
|
||||
rm -rf $(TARNAME)
|
||||
gzip -f -9 $(TARNAME).tar
|
||||
|
||||
.PHONY: benchmark clean dist distclean check uninstall install all test test-all website-upload
|
||||
tar: $(TARBALL)
|
||||
|
||||
$(BINARYTAR): release-only
|
||||
rm -rf $(BINARYNAME)
|
||||
rm -rf out/deps out/Release
|
||||
./configure --prefix=/ --without-snapshot --dest-cpu=$(DESTCPU) $(CONFIG_FLAGS)
|
||||
$(MAKE) install DESTDIR=$(BINARYNAME) V=$(V) PORTABLE=1
|
||||
cp README.md $(BINARYNAME)
|
||||
cp LICENSE $(BINARYNAME)
|
||||
cp ChangeLog $(BINARYNAME)
|
||||
tar -cf $(BINARYNAME).tar $(BINARYNAME)
|
||||
rm -rf $(BINARYNAME)
|
||||
gzip -f -9 $(BINARYNAME).tar
|
||||
|
||||
binary: $(BINARYTAR)
|
||||
|
||||
dist-upload: $(TARBALL) $(PKG)
|
||||
ssh node@nodejs.org mkdir -p web/nodejs.org/dist/$(VERSION)
|
||||
scp $(TARBALL) node@nodejs.org:~/web/nodejs.org/dist/$(VERSION)/$(TARBALL)
|
||||
scp $(PKG) node@nodejs.org:~/web/nodejs.org/dist/$(VERSION)/$(TARNAME).pkg
|
||||
|
||||
bench:
|
||||
benchmark/http_simple_bench.sh
|
||||
|
||||
bench-idle:
|
||||
./node benchmark/idle_server.js &
|
||||
sleep 1
|
||||
./node benchmark/idle_clients.js &
|
||||
|
||||
jslintfix:
|
||||
PYTHONPATH=tools/closure_linter/ $(PYTHON) tools/closure_linter/closure_linter/fixjsstyle.py --strict --nojsdoc -r lib/ -r src/ --exclude_files lib/punycode.js
|
||||
|
||||
jslint:
|
||||
PYTHONPATH=tools/closure_linter/ $(PYTHON) tools/closure_linter/closure_linter/gjslint.py --unix_mode --strict --nojsdoc -r lib/ -r src/ --exclude_files lib/punycode.js
|
||||
|
||||
cpplint:
|
||||
@$(PYTHON) tools/cpplint.py $(wildcard src/*.cc src/*.h src/*.c)
|
||||
|
||||
lint: jslint cpplint
|
||||
|
||||
.PHONY: lint cpplint jslint bench clean docopen docclean doc dist distclean check uninstall install install-includes install-bin all staticlib dynamiclib test test-all website-upload pkg blog blogclean tar binary release-only
|
||||
|
||||
25
README
25
README
@@ -1,25 +0,0 @@
|
||||
Evented I/O for V8 javascript.
|
||||
|
||||
To build:
|
||||
|
||||
./configure
|
||||
make
|
||||
make install
|
||||
|
||||
To run the tests:
|
||||
|
||||
make test
|
||||
|
||||
To build the documentation and install it, you will need asciidoc and
|
||||
xsltproc:
|
||||
|
||||
make doc install
|
||||
|
||||
To read the documentation:
|
||||
|
||||
man doc/node.1
|
||||
|
||||
See http://nodejs.org/ for more information. For help and discussion
|
||||
subscribe to the mailing list by visiting
|
||||
http://groups.google.com/group/nodejs or by sending an email to
|
||||
nodejs+subscribe@googlegroups.com.
|
||||
60
README.md
Normal file
60
README.md
Normal file
@@ -0,0 +1,60 @@
|
||||
Evented I/O for V8 javascript. [](http://travis-ci.org/joyent/node)
|
||||
===
|
||||
|
||||
### To build:
|
||||
|
||||
Prerequisites (Unix only):
|
||||
|
||||
* Python 2.6 or 2.7
|
||||
* GNU Make 3.81 or newer
|
||||
* libexecinfo (FreeBSD and OpenBSD only)
|
||||
|
||||
Unix/Macintosh:
|
||||
|
||||
./configure
|
||||
make
|
||||
make install
|
||||
|
||||
If your python binary is in a non-standard location or has a
|
||||
non-standard name, run the following instead:
|
||||
|
||||
export PYTHON=/path/to/python
|
||||
$PYTHON ./configure
|
||||
make
|
||||
make install
|
||||
|
||||
Windows:
|
||||
|
||||
vcbuild.bat
|
||||
|
||||
### To run the tests:
|
||||
|
||||
Unix/Macintosh:
|
||||
|
||||
make test
|
||||
|
||||
Windows:
|
||||
|
||||
vcbuild.bat test
|
||||
|
||||
### To build the documentation:
|
||||
|
||||
make doc
|
||||
|
||||
### To read the documentation:
|
||||
|
||||
man doc/node.1
|
||||
|
||||
Resources for Newcomers
|
||||
---
|
||||
- [The Wiki](https://github.com/joyent/node/wiki)
|
||||
- [nodejs.org](http://nodejs.org/)
|
||||
- [how to install node.js and npm (node package manager)](http://joyeur.com/2010/12/10/installing-node-and-npm/)
|
||||
- [list of modules](https://github.com/joyent/node/wiki/modules)
|
||||
- [searching the npm registry](http://search.npmjs.org/)
|
||||
- [list of companies and projects using node](https://github.com/joyent/node/wiki/Projects,-Applications,-and-Companies-Using-Node)
|
||||
- [node.js mailing list](http://groups.google.com/group/nodejs)
|
||||
- irc chatroom, [#node.js on freenode.net](http://webchat.freenode.net?channels=node.js&uio=d4)
|
||||
- [community](https://github.com/joyent/node/wiki/Community)
|
||||
- [contributing](https://github.com/joyent/node/wiki/Contributing)
|
||||
- [big list of all the helpful wiki pages](https://github.com/joyent/node/wiki/_pages)
|
||||
15
benchmark/arrays/var_int.js
Normal file
15
benchmark/arrays/var_int.js
Normal file
@@ -0,0 +1,15 @@
|
||||
var types = 'Array Buffer Int8Array Uint8Array Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array'.split(' ');
|
||||
|
||||
var type = types[types.indexOf(process.argv[2])];
|
||||
if (!type)
|
||||
type = types[0];
|
||||
|
||||
console.error('Benchmarking', type);
|
||||
var clazz = global[type];
|
||||
|
||||
var arr = new clazz(25 * 10e5);
|
||||
for (var i = 0; i < 10; ++i) {
|
||||
for (var j = 0, k = arr.length; j < k; ++j) {
|
||||
arr[j] = (j ^ k) & 127;
|
||||
}
|
||||
}
|
||||
15
benchmark/arrays/zero_float.js
Normal file
15
benchmark/arrays/zero_float.js
Normal file
@@ -0,0 +1,15 @@
|
||||
var types = 'Array Buffer Int8Array Uint8Array Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array'.split(' ');
|
||||
|
||||
var type = types[types.indexOf(process.argv[2])];
|
||||
if (!type)
|
||||
type = types[0];
|
||||
|
||||
console.error('Benchmarking', type);
|
||||
var clazz = global[type];
|
||||
|
||||
var arr = new clazz(25 * 10e5);
|
||||
for (var i = 0; i < 10; ++i) {
|
||||
for (var j = 0, k = arr.length; j < k; ++j) {
|
||||
arr[j] = 0.0;
|
||||
}
|
||||
}
|
||||
15
benchmark/arrays/zero_int.js
Normal file
15
benchmark/arrays/zero_int.js
Normal file
@@ -0,0 +1,15 @@
|
||||
var types = 'Array Buffer Int8Array Uint8Array Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array'.split(' ');
|
||||
|
||||
var type = types[types.indexOf(process.argv[2])];
|
||||
if (!type)
|
||||
type = types[0];
|
||||
|
||||
console.error('Benchmarking', type);
|
||||
var clazz = global[type];
|
||||
|
||||
var arr = new clazz(25 * 10e5);
|
||||
for (var i = 0; i < 10; ++i) {
|
||||
for (var j = 0, k = arr.length; j < k; ++j) {
|
||||
arr[j] = 0;
|
||||
}
|
||||
}
|
||||
6
benchmark/buffer_creation.js
Normal file
6
benchmark/buffer_creation.js
Normal file
@@ -0,0 +1,6 @@
|
||||
SlowBuffer = require('buffer').SlowBuffer;
|
||||
|
||||
for (var i = 0; i < 1e6; i++) {
|
||||
b = new SlowBuffer(10);
|
||||
b[1] = 2
|
||||
}
|
||||
80
benchmark/client_latency.js
Normal file
80
benchmark/client_latency.js
Normal file
@@ -0,0 +1,80 @@
|
||||
// first start node http_simple.js
|
||||
var http = require('http');
|
||||
|
||||
var latency = [];
|
||||
|
||||
var numRequests = parseInt(process.argv[2], 10) || 100;
|
||||
var maxSockets = parseInt(process.argv[3], 10) || 100;
|
||||
var runs = parseInt(process.argv[4], 10) || 100;
|
||||
var prefix = process.argv[5] || '';
|
||||
if (prefix) prefix += '_';
|
||||
var r = 0;
|
||||
|
||||
var port = parseInt(process.env.PORT, 10) || 8000;
|
||||
var host = process.env.HOST || '127.0.0.1';
|
||||
|
||||
http.globalAgent.maxSockets = maxSockets;
|
||||
|
||||
run();
|
||||
|
||||
function run() {
|
||||
if (r++ === runs) {
|
||||
return finish();
|
||||
}
|
||||
|
||||
// make numRequests in parallel
|
||||
// retain the order in which they are *made*. This requires trapping
|
||||
// each one in a closure, since otherwise, we'll of course end
|
||||
// up mostly sorting them in ascending order, since the cb from a
|
||||
// fast request will almost always be called before the cb from a
|
||||
// slow one.
|
||||
var c = numRequests;
|
||||
var lat = [];
|
||||
latency.push(lat);
|
||||
for (var i = 0; i < numRequests; i++) (function (i) {
|
||||
makeRequest(function(l) {
|
||||
lat[i] = l;
|
||||
c--;
|
||||
if (c === 0) run();
|
||||
});
|
||||
})(i);
|
||||
}
|
||||
|
||||
function makeRequest(cb) {
|
||||
var opts = { host: host,
|
||||
port: port,
|
||||
uri: 'http://'+host+':'+port+'/bytes/12',
|
||||
forever: true,
|
||||
path: '/bytes/12' };
|
||||
var pre = Date.now();
|
||||
var req = http.get(opts, function(res) {
|
||||
return cb(Date.now() - pre);
|
||||
});
|
||||
}
|
||||
|
||||
function finish() {
|
||||
var data = [];
|
||||
latency.forEach(function(run, i) {
|
||||
run.forEach(function(l, j) {
|
||||
data[j] = data[j] || [];
|
||||
data[j][i] = l;
|
||||
});
|
||||
});
|
||||
|
||||
data = data.map(function (l, i) {
|
||||
return l.join('\t')
|
||||
}).join('\n') + '\n';
|
||||
|
||||
var fname = prefix +
|
||||
'client_latency_' +
|
||||
numRequests + '_' +
|
||||
maxSockets + '_' +
|
||||
runs + '.tab';
|
||||
var path = require('path');
|
||||
fname = path.resolve(__dirname, '..', 'out', fname);
|
||||
fname = path.relative(process.cwd(), fname);
|
||||
require('fs').writeFile(fname, data, function(er) {
|
||||
if (er) throw er;
|
||||
console.log('written: %s', fname);
|
||||
});
|
||||
}
|
||||
42
benchmark/fast_buffer2.js
Normal file
42
benchmark/fast_buffer2.js
Normal file
@@ -0,0 +1,42 @@
|
||||
var SlowBuffer = require('buffer').SlowBuffer;
|
||||
var POOLSIZE = 8*1024;
|
||||
var pool;
|
||||
|
||||
function allocPool () {
|
||||
pool = new SlowBuffer(POOLSIZE);
|
||||
pool.used = 0;
|
||||
}
|
||||
|
||||
function FastBuffer (length) {
|
||||
this.length = length;
|
||||
|
||||
if (length > POOLSIZE) {
|
||||
// Big buffer, just alloc one.
|
||||
this.parent = new Buffer(length);
|
||||
this.offset = 0;
|
||||
} else {
|
||||
// Small buffer.
|
||||
if (!pool || pool.length - pool.used < length) allocPool();
|
||||
this.parent = pool;
|
||||
this.offset = pool.used;
|
||||
pool.used += length;
|
||||
}
|
||||
|
||||
// HERE HERE HERE
|
||||
SlowBuffer.makeFastBuffer(this.parent, this, this.offset, this.length);
|
||||
}
|
||||
|
||||
exports.FastBuffer = FastBuffer;
|
||||
|
||||
FastBuffer.prototype.get = function (i) {
|
||||
if (i < 0 || i >= this.length) throw new Error("oob");
|
||||
return this.parent[this.offset + i];
|
||||
};
|
||||
|
||||
FastBuffer.prototype.set = function (i, v) {
|
||||
if (i < 0 || i >= this.length) throw new Error("oob");
|
||||
return this.parent[this.offset + i] = v;
|
||||
};
|
||||
|
||||
// TODO define slice, toString, write, etc.
|
||||
// slice should not use c++
|
||||
6
benchmark/fast_buffer2_creation.js
Normal file
6
benchmark/fast_buffer2_creation.js
Normal file
@@ -0,0 +1,6 @@
|
||||
|
||||
FastBuffer = require('./fast_buffer2').FastBuffer;
|
||||
for (var i = 0; i < 1e6; i++) {
|
||||
b = new FastBuffer(10);
|
||||
b[1] = 2;
|
||||
}
|
||||
4
benchmark/fast_buffer_creation.js
Normal file
4
benchmark/fast_buffer_creation.js
Normal file
@@ -0,0 +1,4 @@
|
||||
for (var i = 0; i < 1e6; i++) {
|
||||
b = new Buffer(10);
|
||||
b[1] = 2;
|
||||
}
|
||||
72
benchmark/fs-readfile.js
Normal file
72
benchmark/fs-readfile.js
Normal file
@@ -0,0 +1,72 @@
|
||||
// Call fs.readFile over and over again really fast.
|
||||
// Then see how many times it got called.
|
||||
// Yes, this is a silly benchmark. Most benchmarks are silly.
|
||||
|
||||
var path = require('path');
|
||||
var filename = path.resolve(__dirname, 'http.sh');
|
||||
var fs = require('fs');
|
||||
var count = 0;
|
||||
var go = true;
|
||||
var len = -1;
|
||||
var assert = require('assert');
|
||||
|
||||
var concurrency = 1;
|
||||
var encoding = null;
|
||||
var time = 10;
|
||||
|
||||
for (var i = 2; i < process.argv.length; i++) {
|
||||
var arg = process.argv[i];
|
||||
if (arg.match(/^-e$/)) {
|
||||
encoding = process.argv[++i] || null;
|
||||
} else if (arg.match(/^-c$/)) {
|
||||
concurrency = ~~process.argv[++i];
|
||||
if (concurrency < 1) concurrency = 1;
|
||||
} else if (arg === '-t') {
|
||||
time = ~~process.argv[++i];
|
||||
if (time < 1) time = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
setTimeout(function() {
|
||||
go = false;
|
||||
}, time * 1000);
|
||||
|
||||
function round(n) {
|
||||
return Math.floor(n * 100) / 100;
|
||||
}
|
||||
|
||||
var start = process.hrtime();
|
||||
while (concurrency--) readFile();
|
||||
|
||||
function readFile() {
|
||||
if (!go) {
|
||||
process.stdout.write('\n');
|
||||
console.log('read the file %d times (higher is better)', count);
|
||||
var end = process.hrtime();
|
||||
var elapsed = [end[0] - start[0], end[1] - start[1]];
|
||||
var ns = elapsed[0] * 1E9 + elapsed[1];
|
||||
var nsper = round(ns / count);
|
||||
console.log('%d ns per read (lower is better)', nsper);
|
||||
var readsper = round(count / (ns / 1E9));
|
||||
console.log('%d reads per sec (higher is better)', readsper);
|
||||
process.exit(0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(count % 1000)) {
|
||||
process.stdout.write('.');
|
||||
}
|
||||
|
||||
if (encoding) fs.readFile(filename, encoding, then);
|
||||
else fs.readFile(filename, then);
|
||||
|
||||
function then(er, data) {
|
||||
assert.ifError(er);
|
||||
count++;
|
||||
// basic sanity test: we should get the same number of bytes each time.
|
||||
if (count === 1) len = data.length;
|
||||
else assert(len === data.length);
|
||||
readFile();
|
||||
}
|
||||
}
|
||||
43
benchmark/function_call/bench.js
Normal file
43
benchmark/function_call/bench.js
Normal file
@@ -0,0 +1,43 @@
|
||||
var binding = require('./build/default/binding');
|
||||
|
||||
c = 0
|
||||
|
||||
function js() {
|
||||
return c++; //(new Date()).getTime();
|
||||
}
|
||||
|
||||
var cxx = binding.hello;
|
||||
|
||||
var i, N = 100000000;
|
||||
|
||||
console.log(js());
|
||||
console.log(cxx());
|
||||
|
||||
|
||||
|
||||
var start = new Date();
|
||||
for (i = 0; i < N; i++) {
|
||||
js();
|
||||
}
|
||||
var jsDiff = new Date() - start;
|
||||
console.log(N +" JS function calls: " + jsDiff);
|
||||
|
||||
|
||||
var start = new Date();
|
||||
for (i = 0; i < N; i++) {
|
||||
cxx();
|
||||
}
|
||||
var cxxDiff = new Date() - start;
|
||||
console.log(N +" C++ function calls: " + cxxDiff);
|
||||
|
||||
function toMicro (diff) {
|
||||
return (diff / N) * 1000000;
|
||||
}
|
||||
|
||||
console.log("\nJS function call speed: %d microseconds", toMicro(jsDiff));
|
||||
console.log("C++ function call speed: %d microseconds", toMicro(cxxDiff));
|
||||
|
||||
|
||||
console.log("\nJS speedup " + (cxxDiff / jsDiff));
|
||||
|
||||
|
||||
19
benchmark/function_call/binding.cc
Normal file
19
benchmark/function_call/binding.cc
Normal file
@@ -0,0 +1,19 @@
|
||||
#include <v8.h>
|
||||
#include <node.h>
|
||||
#include <time.h>
|
||||
|
||||
using namespace v8;
|
||||
|
||||
static int c = 0;
|
||||
|
||||
static Handle<Value> Hello(const Arguments& args) {
|
||||
HandleScope scope;
|
||||
//time_t tv = time(NULL);
|
||||
return scope.Close(Integer::New(c++));
|
||||
}
|
||||
|
||||
extern "C" void init (Handle<Object> target) {
|
||||
HandleScope scope;
|
||||
//target->Set(String::New("hello"), String::New("World"));
|
||||
NODE_SET_METHOD(target, "hello", Hello);
|
||||
}
|
||||
15
benchmark/function_call/wscript
Normal file
15
benchmark/function_call/wscript
Normal file
@@ -0,0 +1,15 @@
|
||||
srcdir = '.'
|
||||
blddir = 'build'
|
||||
VERSION = '0.0.1'
|
||||
|
||||
def set_options(opt):
|
||||
opt.tool_options('compiler_cxx')
|
||||
|
||||
def configure(conf):
|
||||
conf.check_tool('compiler_cxx')
|
||||
conf.check_tool('node_addon')
|
||||
|
||||
def build(bld):
|
||||
obj = bld.new_task_gen('cxx', 'shlib', 'node_addon')
|
||||
obj.target = 'binding'
|
||||
obj.source = 'binding.cc'
|
||||
43
benchmark/http.sh
Executable file
43
benchmark/http.sh
Executable file
@@ -0,0 +1,43 @@
|
||||
#!/bin/bash
|
||||
cd "$(dirname "$(dirname $0)")"
|
||||
|
||||
if type sysctl &>/dev/null; then
|
||||
# darwin and linux
|
||||
sudo sysctl -w net.ipv4.ip_local_port_range="12000 65535"
|
||||
sudo sysctl -w net.inet.ip.portrange.first=12000
|
||||
sudo sysctl -w net.inet.tcp.msl=1000
|
||||
sudo sysctl -w kern.maxfiles=1000000 kern.maxfilesperproc=1000000
|
||||
elif type /usr/sbin/ndd &>/dev/null; then
|
||||
# sunos
|
||||
/usr/sbin/ndd -set /dev/tcp tcp_smallest_anon_port 12000
|
||||
/usr/sbin/ndd -set /dev/tcp tcp_largest_anon_port 65535
|
||||
/usr/sbin/ndd -set /dev/tcp tcp_max_buf 2097152
|
||||
/usr/sbin/ndd -set /dev/tcp tcp_xmit_hiwat 1048576
|
||||
/usr/sbin/ndd -set /dev/tcp tcp_recv_hiwat 1048576
|
||||
fi
|
||||
|
||||
ulimit -n 100000
|
||||
|
||||
k=${KEEPALIVE}
|
||||
if [ "$k" = "no" ]; then
|
||||
k=""
|
||||
else
|
||||
k="-k"
|
||||
fi
|
||||
node=${NODE:-./node}
|
||||
|
||||
$node benchmark/http_simple.js &
|
||||
npid=$!
|
||||
|
||||
sleep 1
|
||||
|
||||
if [ "$k" = "-k" ]; then
|
||||
echo "using keepalive"
|
||||
fi
|
||||
|
||||
for i in a a a a a a a a a a a a a a a a a a a a; do
|
||||
ab $k -t 10 -c 100 http://127.0.0.1:8000/${TYPE:-bytes}/${LENGTH:-1024} \
|
||||
2>&1 | grep Req | egrep -o '[0-9\.]+'
|
||||
done
|
||||
|
||||
kill $npid
|
||||
127
benchmark/http_bench.js
Normal file
127
benchmark/http_bench.js
Normal file
@@ -0,0 +1,127 @@
|
||||
// Copyright Joyent, Inc. and other Node contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
// persons to whom the Software is furnished to do so, subject to the
|
||||
// following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
var spawn = require('child_process').spawn;
|
||||
var cluster = require('cluster');
|
||||
var http = require('http');
|
||||
|
||||
var options = {
|
||||
mode: 'master',
|
||||
host: '127.0.0.1',
|
||||
port: 22344,
|
||||
path: '/',
|
||||
servers: 1,
|
||||
clients: 1
|
||||
};
|
||||
|
||||
for (var i = 2; i < process.argv.length; ++i) {
|
||||
var args = process.argv[i].split('=', 2);
|
||||
var key = args[0];
|
||||
var val = args[1];
|
||||
options[key] = val;
|
||||
}
|
||||
|
||||
switch (options.mode) {
|
||||
case 'master': startMaster(); break;
|
||||
case 'server': startServer(); break;
|
||||
case 'client': startClient(); break;
|
||||
default: throw new Error('Bad mode: ' + options.mode);
|
||||
}
|
||||
|
||||
process.title = 'http_bench[' + options.mode + ']';
|
||||
|
||||
// monkey-patch the log functions so they include name + pid
|
||||
console.log = patch(console.log);
|
||||
console.trace = patch(console.trace);
|
||||
console.error = patch(console.error);
|
||||
|
||||
function patch(fun) {
|
||||
var prefix = process.title + '[' + process.pid + '] ';
|
||||
return function() {
|
||||
var args = Array.prototype.slice.call(arguments);
|
||||
args[0] = prefix + args[0];
|
||||
return fun.apply(console, args);
|
||||
};
|
||||
}
|
||||
|
||||
function startMaster() {
|
||||
if (!cluster.isMaster) return startServer();
|
||||
|
||||
for (var i = ~~options.servers; i > 0; --i) cluster.fork();
|
||||
|
||||
for (var i = ~~options.clients; i > 0; --i) {
|
||||
var cp = spawn(process.execPath, [__filename, 'mode=client']);
|
||||
cp.stdout.pipe(process.stdout);
|
||||
cp.stderr.pipe(process.stderr);
|
||||
}
|
||||
}
|
||||
|
||||
function startServer() {
|
||||
http.createServer(onRequest).listen(options.port, options.host);
|
||||
|
||||
var body = Array(1024).join('x');
|
||||
var headers = {'Content-Length': '' + body.length};
|
||||
|
||||
function onRequest(req, res) {
|
||||
req.on('error', onError);
|
||||
res.on('error', onError);
|
||||
res.writeHead(200, headers);
|
||||
res.end(body);
|
||||
}
|
||||
|
||||
function onError(err) {
|
||||
console.error(err.stack);
|
||||
}
|
||||
}
|
||||
|
||||
function startClient() {
|
||||
// send off a bunch of concurrent requests
|
||||
// TODO make configurable
|
||||
sendRequest();
|
||||
sendRequest();
|
||||
|
||||
function sendRequest() {
|
||||
var req = http.request(options, onConnection);
|
||||
req.on('error', onError);
|
||||
req.end();
|
||||
}
|
||||
|
||||
// add a little back-off to prevent EADDRNOTAVAIL errors, it's pretty easy
|
||||
// to exhaust the available port range
|
||||
function relaxedSendRequest() {
|
||||
setTimeout(sendRequest, 1);
|
||||
}
|
||||
|
||||
function onConnection(res) {
|
||||
res.on('error', onError);
|
||||
res.on('data', onData);
|
||||
res.on('end', relaxedSendRequest);
|
||||
}
|
||||
|
||||
function onError(err) {
|
||||
console.error(err.stack);
|
||||
relaxedSendRequest();
|
||||
}
|
||||
|
||||
function onData(data) {
|
||||
// this space intentionally left blank
|
||||
}
|
||||
}
|
||||
13
benchmark/http_server_lag.js
Normal file
13
benchmark/http_server_lag.js
Normal file
@@ -0,0 +1,13 @@
|
||||
var http = require('http');
|
||||
var port = parseInt(process.env.PORT, 10) || 8000;
|
||||
var defaultLag = parseInt(process.argv[2], 10) || 100;
|
||||
|
||||
http.createServer(function(req, res) {
|
||||
res.writeHead(200, { 'content-type': 'text/plain',
|
||||
'content-length': '2' });
|
||||
|
||||
var lag = parseInt(req.url.split("/").pop(), 10) || defaultLag;
|
||||
setTimeout(function() {
|
||||
res.end('ok');
|
||||
}, lag);
|
||||
}).listen(port, 'localhost');
|
||||
@@ -1,56 +1,128 @@
|
||||
libDir = node.path.join(node.path.dirname(__filename), "../lib");
|
||||
node.libraryPaths.unshift(libDir);
|
||||
var path = require('path'),
|
||||
exec = require('child_process').exec,
|
||||
http = require('http');
|
||||
|
||||
node.mixin(require("/utils.js"));
|
||||
http = require("/http.js");
|
||||
var port = parseInt(process.env.PORT || 8000);
|
||||
|
||||
fixed = ""
|
||||
for (var i = 0; i < 20*1024; i++) {
|
||||
fixed += "C";
|
||||
console.log('pid ' + process.pid);
|
||||
|
||||
var fixed = makeString(20 * 1024, 'C'),
|
||||
storedBytes = {},
|
||||
storedBuffer = {},
|
||||
storedUnicode = {};
|
||||
|
||||
var useDomains = process.env.NODE_USE_DOMAINS;
|
||||
|
||||
// set up one global domain.
|
||||
if (useDomains) {
|
||||
var domain = require('domain');
|
||||
var gdom = domain.create();
|
||||
gdom.on('error', function(er) {
|
||||
console.log('Error on global domain', er);
|
||||
throw er;
|
||||
});
|
||||
gdom.enter();
|
||||
}
|
||||
stored = {};
|
||||
http.createServer(function (req, res) {
|
||||
var commands = req.uri.path.split("/");
|
||||
|
||||
var server = http.createServer(function (req, res) {
|
||||
if (useDomains) {
|
||||
var dom = domain.create();
|
||||
dom.add(req);
|
||||
dom.add(res);
|
||||
}
|
||||
|
||||
var commands = req.url.split('/');
|
||||
var command = commands[1];
|
||||
var body = "";
|
||||
var body = '';
|
||||
var arg = commands[2];
|
||||
var n_chunks = parseInt(commands[3], 10);
|
||||
var status = 200;
|
||||
|
||||
p(req.uri.params);
|
||||
|
||||
if (command == "bytes") {
|
||||
var n = parseInt(arg, 10)
|
||||
if (command == 'bytes') {
|
||||
var n = ~~arg;
|
||||
if (n <= 0)
|
||||
throw "bytes called with n <= 0"
|
||||
if (stored[n] === undefined) {
|
||||
puts("create stored[n]");
|
||||
stored[n] = "";
|
||||
throw new Error('bytes called with n <= 0')
|
||||
if (storedBytes[n] === undefined) {
|
||||
console.log('create storedBytes[n]');
|
||||
storedBytes[n] = makeString(n, 'C');
|
||||
}
|
||||
body = storedBytes[n];
|
||||
|
||||
} else if (command == 'buffer') {
|
||||
var n = ~~arg;
|
||||
if (n <= 0)
|
||||
throw new Error('buffer called with n <= 0');
|
||||
if (storedBuffer[n] === undefined) {
|
||||
console.log('create storedBuffer[n]');
|
||||
storedBuffer[n] = new Buffer(n);
|
||||
for (var i = 0; i < n; i++) {
|
||||
stored[n] += "C"
|
||||
storedBuffer[n][i] = 'C'.charCodeAt(0);
|
||||
}
|
||||
}
|
||||
body = stored[n];
|
||||
body = storedBuffer[n];
|
||||
|
||||
} else if (command == "quit") {
|
||||
} else if (command == 'unicode') {
|
||||
var n = ~~arg;
|
||||
if (n <= 0)
|
||||
throw new Error('unicode called with n <= 0');
|
||||
if (storedUnicode[n] === undefined) {
|
||||
console.log('create storedUnicode[n]');
|
||||
storedUnicode[n] = makeString(n, '\u263A');
|
||||
}
|
||||
body = storedUnicode[n];
|
||||
|
||||
} else if (command == 'quit') {
|
||||
res.connection.server.close();
|
||||
body = "quitting";
|
||||
body = 'quitting';
|
||||
|
||||
} else if (command == "fixed") {
|
||||
} else if (command == 'fixed') {
|
||||
body = fixed;
|
||||
|
||||
} else if (command == 'echo') {
|
||||
res.writeHead(200, { 'Content-Type': 'text/plain',
|
||||
'Transfer-Encoding': 'chunked' });
|
||||
req.pipe(res);
|
||||
return;
|
||||
|
||||
} else {
|
||||
status = 404;
|
||||
body = "not found\n";
|
||||
body = 'not found\n';
|
||||
}
|
||||
|
||||
var content_length = body.length.toString();
|
||||
// example: http://localhost:port/bytes/512/4
|
||||
// sends a 512 byte body in 4 chunks of 128 bytes
|
||||
if (n_chunks > 0) {
|
||||
res.writeHead(status, { 'Content-Type': 'text/plain',
|
||||
'Transfer-Encoding': 'chunked' });
|
||||
// send body in chunks
|
||||
var len = body.length;
|
||||
var step = Math.floor(len / n_chunks) || 1;
|
||||
|
||||
res.sendHeader( status
|
||||
, { "Content-Type": "text/plain"
|
||||
, "Content-Length": content_length
|
||||
}
|
||||
);
|
||||
res.sendBody(body);
|
||||
|
||||
res.finish();
|
||||
}).listen(8000);
|
||||
for (var i = 0, n = (n_chunks - 1); i < n; ++i) {
|
||||
res.write(body.slice(i * step, i * step + step));
|
||||
}
|
||||
res.end(body.slice((n_chunks - 1) * step));
|
||||
} else {
|
||||
var content_length = body.length.toString();
|
||||
|
||||
res.writeHead(status, { 'Content-Type': 'text/plain',
|
||||
'Content-Length': content_length });
|
||||
res.end(body);
|
||||
}
|
||||
});
|
||||
|
||||
function makeString(size, c) {
|
||||
var s = '';
|
||||
while (s.length < size) {
|
||||
s += c;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
server.listen(port, function () {
|
||||
console.log('Listening at http://127.0.0.1:'+port+'/');
|
||||
});
|
||||
|
||||
process.on('exit', function() {
|
||||
console.error('libuv counters', process.uvCounters());
|
||||
});
|
||||
|
||||
@@ -7,45 +7,45 @@ end
|
||||
|
||||
def wait(seconds)
|
||||
n = (seconds / 0.01).to_i
|
||||
n.times do
|
||||
n.times do
|
||||
sleep(0.01)
|
||||
#File.read(DIR + '/yahoo.html')
|
||||
#File.read(DIR + '/yahoo.html')
|
||||
end
|
||||
end
|
||||
|
||||
class SimpleApp
|
||||
@@responses = {}
|
||||
|
||||
|
||||
def initialize
|
||||
@count = 0
|
||||
end
|
||||
|
||||
|
||||
def deferred?(env)
|
||||
false
|
||||
end
|
||||
|
||||
|
||||
def call(env)
|
||||
path = env['PATH_INFO'] || env['REQUEST_URI']
|
||||
commands = path.split('/')
|
||||
|
||||
|
||||
@count += 1
|
||||
if commands.include?('periodical_activity') and @count % 10 != 1
|
||||
return [200, {'Content-Type'=>'text/plain'}, "quick response!\r\n"]
|
||||
end
|
||||
|
||||
|
||||
if commands.include?('fibonacci')
|
||||
n = commands.last.to_i
|
||||
raise "fibonacci called with n <= 0" if n <= 0
|
||||
body = (1..n).to_a.map { |i| fib(i).to_s }.join(' ')
|
||||
status = 200
|
||||
|
||||
|
||||
elsif commands.include?('wait')
|
||||
n = commands.last.to_f
|
||||
raise "wait called with n <= 0" if n <= 0
|
||||
wait(n)
|
||||
body = "waited about #{n} seconds"
|
||||
status = 200
|
||||
|
||||
|
||||
elsif commands.include?('bytes')
|
||||
n = commands.last.to_i
|
||||
raise "bytes called with n <= 0" if n <= 0
|
||||
@@ -56,17 +56,17 @@ class SimpleApp
|
||||
n = 20 * 1024;
|
||||
body = @@responses[n] || "C"*n
|
||||
status = 200
|
||||
|
||||
|
||||
elsif commands.include?('test_post_length')
|
||||
input_body = ""
|
||||
while chunk = env['rack.input'].read(512)
|
||||
input_body << chunk
|
||||
input_body << chunk
|
||||
end
|
||||
if env['CONTENT_LENGTH'].to_i == input_body.length
|
||||
body = "Content-Length matches input length"
|
||||
status = 200
|
||||
else
|
||||
body = "Content-Length doesn't matches input length!
|
||||
body = "Content-Length doesn't matches input length!
|
||||
content_length = #{env['CONTENT_LENGTH'].to_i}
|
||||
input_body.length = #{input_body.length}"
|
||||
status = 500
|
||||
@@ -75,7 +75,7 @@ class SimpleApp
|
||||
status = 404
|
||||
body = "Undefined url"
|
||||
end
|
||||
|
||||
|
||||
body += "\r\n"
|
||||
headers = {'Content-Type' => 'text/plain', 'Content-Length' => body.length.to_s }
|
||||
[status, headers, [body]]
|
||||
@@ -90,6 +90,6 @@ if $0 == __FILE__
|
||||
require 'thin'
|
||||
require 'ebb'
|
||||
# Rack::Handler::Mongrel.run(SimpleApp.new, :Port => 8000)
|
||||
Thin::Server.start("0.0.0.0", 8000, SimpleApp.new)
|
||||
Thin::Server.start("0.0.0.0", 8000, SimpleApp.new)
|
||||
# Ebb::start_server(SimpleApp.new, :port => 8000)
|
||||
end
|
||||
|
||||
127
benchmark/http_simple_auto.js
Normal file
127
benchmark/http_simple_auto.js
Normal file
@@ -0,0 +1,127 @@
|
||||
//
|
||||
// Usage:
|
||||
// node benchmark/http_simple_auto.js <args> <target>
|
||||
//
|
||||
// Where:
|
||||
// <args> Arguments to pass to `ab`.
|
||||
// <target> Target to benchmark, e.g. `bytes/1024` or `buffer/8192`.
|
||||
//
|
||||
|
||||
var path = require("path");
|
||||
var http = require("http");
|
||||
var spawn = require("child_process").spawn;
|
||||
|
||||
var port = parseInt(process.env.PORT || 8000);
|
||||
|
||||
var fixed = ""
|
||||
for (var i = 0; i < 20*1024; i++) {
|
||||
fixed += "C";
|
||||
}
|
||||
|
||||
var stored = {};
|
||||
var storedBuffer = {};
|
||||
|
||||
var server = http.createServer(function (req, res) {
|
||||
var commands = req.url.split("/");
|
||||
var command = commands[1];
|
||||
var body = "";
|
||||
var arg = commands[2];
|
||||
var n_chunks = parseInt(commands[3], 10);
|
||||
var status = 200;
|
||||
|
||||
if (command == "bytes") {
|
||||
var n = parseInt(arg, 10)
|
||||
if (n <= 0)
|
||||
throw "bytes called with n <= 0"
|
||||
if (stored[n] === undefined) {
|
||||
stored[n] = "";
|
||||
for (var i = 0; i < n; i++) {
|
||||
stored[n] += "C"
|
||||
}
|
||||
}
|
||||
body = stored[n];
|
||||
|
||||
} else if (command == "buffer") {
|
||||
var n = parseInt(arg, 10)
|
||||
if (n <= 0) throw new Error("bytes called with n <= 0");
|
||||
if (storedBuffer[n] === undefined) {
|
||||
storedBuffer[n] = new Buffer(n);
|
||||
for (var i = 0; i < n; i++) {
|
||||
storedBuffer[n][i] = "C".charCodeAt(0);
|
||||
}
|
||||
}
|
||||
body = storedBuffer[n];
|
||||
|
||||
} else if (command == "quit") {
|
||||
res.connection.server.close();
|
||||
body = "quitting";
|
||||
|
||||
} else if (command == "fixed") {
|
||||
body = fixed;
|
||||
|
||||
} else if (command == "echo") {
|
||||
res.writeHead(200, { "Content-Type": "text/plain",
|
||||
"Transfer-Encoding": "chunked" });
|
||||
req.pipe(res);
|
||||
return;
|
||||
|
||||
} else {
|
||||
status = 404;
|
||||
body = "not found\n";
|
||||
}
|
||||
|
||||
// example: http://localhost:port/bytes/512/4
|
||||
// sends a 512 byte body in 4 chunks of 128 bytes
|
||||
if (n_chunks > 0) {
|
||||
res.writeHead(status, { "Content-Type": "text/plain",
|
||||
"Transfer-Encoding": "chunked" });
|
||||
// send body in chunks
|
||||
var len = body.length;
|
||||
var step = Math.floor(len / n_chunks) || 1;
|
||||
|
||||
for (var i = 0, n = (n_chunks - 1); i < n; ++i) {
|
||||
res.write(body.slice(i * step, i * step + step));
|
||||
}
|
||||
res.end(body.slice((n_chunks - 1) * step));
|
||||
} else {
|
||||
var content_length = body.length.toString();
|
||||
|
||||
res.writeHead(status, { "Content-Type": "text/plain",
|
||||
"Content-Length": content_length });
|
||||
res.end(body);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
server.listen(port, function () {
|
||||
var url = 'http://127.0.0.1:' + port + '/';
|
||||
|
||||
var n = process.argv.length - 1;
|
||||
process.argv[n] = url + process.argv[n];
|
||||
|
||||
var cp = spawn('ab', process.argv.slice(2));
|
||||
cp.stdout.pipe(process.stdout);
|
||||
cp.stderr.pipe(process.stderr);
|
||||
cp.on('exit', function() {
|
||||
server.close();
|
||||
process.nextTick(dump_mm_stats);
|
||||
});
|
||||
});
|
||||
|
||||
function dump_mm_stats() {
|
||||
if (typeof gc != 'function') return;
|
||||
|
||||
var before = process.memoryUsage();
|
||||
for (var i = 0; i < 10; ++i) gc();
|
||||
var after = process.memoryUsage();
|
||||
setTimeout(print_stats, 250); // give GC time to settle
|
||||
|
||||
function print_stats() {
|
||||
console.log('\nBEFORE / AFTER GC');
|
||||
['rss', 'heapTotal', 'heapUsed'].forEach(function(key) {
|
||||
var a = before[key] / (1024 * 1024);
|
||||
var b = after[key] / (1024 * 1024);
|
||||
console.log('%sM / %sM %s', a.toFixed(2), b.toFixed(2), key);
|
||||
});
|
||||
}
|
||||
}
|
||||
77
benchmark/http_simple_bench.sh
Executable file
77
benchmark/http_simple_bench.sh
Executable file
@@ -0,0 +1,77 @@
|
||||
#!/bin/bash
|
||||
|
||||
SERVER=127.0.0.1
|
||||
PORT=8000
|
||||
|
||||
# You may want to configure your TCP settings to make many ports available
|
||||
# to node and ab. On macintosh use:
|
||||
# sudo sysctl -w net.inet.ip.portrange.first=32768
|
||||
# sudo sysctl -w net.inet.tcp.msl=1000
|
||||
|
||||
if [ ! -d benchmark/ ]; then
|
||||
echo "Run this script from the node root directory"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ $SERVER == "127.0.0.1" ]; then
|
||||
./node benchmark/http_simple.js &
|
||||
node_pid=$!
|
||||
sleep 1
|
||||
fi
|
||||
|
||||
info=`curl -s http://$SERVER:$PORT/info`
|
||||
eval $info
|
||||
|
||||
date=`date "+%Y%m%d%H%M%S"`
|
||||
|
||||
ab_hello_world() {
|
||||
local type="$1"
|
||||
local ressize="$2"
|
||||
if [ $type == "string" ]; then
|
||||
local uri="bytes/$ressize"
|
||||
else
|
||||
local uri="buffer/$ressize"
|
||||
fi
|
||||
|
||||
|
||||
name="ab-hello-world-$type-$ressize"
|
||||
|
||||
dir=".benchmark_reports/$name/$rev/"
|
||||
if [ ! -d $dir ]; then
|
||||
mkdir -p $dir
|
||||
fi
|
||||
|
||||
summary_fn="$dir/$date.summary"
|
||||
data_fn="$dir/$date.data"
|
||||
|
||||
echo "Bench $name starts in 3 seconds..."
|
||||
# let shit calm down
|
||||
sleep 3
|
||||
|
||||
# hammer that as hard as it can for 10 seconds.
|
||||
ab -g $data_fn -c 100 -t 10 http://$SERVER:$PORT/$uri > $summary_fn
|
||||
|
||||
# add our data about the server
|
||||
echo >> $summary_fn
|
||||
echo >> $summary_fn
|
||||
echo "webserver-rev: $rev" >> $summary_fn
|
||||
echo "webserver-uname: $uname" >> $summary_fn
|
||||
|
||||
grep Req $summary_fn
|
||||
|
||||
echo "Summary: $summary_fn"
|
||||
echo
|
||||
}
|
||||
|
||||
# 1k
|
||||
ab_hello_world 'string' '1024'
|
||||
ab_hello_world 'buffer' '1024'
|
||||
|
||||
# 100k
|
||||
ab_hello_world 'string' '102400'
|
||||
ab_hello_world 'buffer' '102400'
|
||||
|
||||
|
||||
if [ ! -z $node_pid ]; then
|
||||
kill -9 $node_pid
|
||||
fi
|
||||
9
benchmark/http_simple_cluster.js
Normal file
9
benchmark/http_simple_cluster.js
Normal file
@@ -0,0 +1,9 @@
|
||||
var cluster = require('cluster');
|
||||
var os = require('os');
|
||||
|
||||
if (cluster.isMaster) {
|
||||
console.log('master running on pid %d', process.pid);
|
||||
for (var i = 0, n = os.cpus().length; i < n; ++i) cluster.fork();
|
||||
} else {
|
||||
require(__dirname + '/http_simple.js');
|
||||
}
|
||||
49
benchmark/idle_clients.js
Normal file
49
benchmark/idle_clients.js
Normal file
@@ -0,0 +1,49 @@
|
||||
net = require('net');
|
||||
|
||||
var errors = 0, connections = 0;
|
||||
|
||||
var lastClose = 0;
|
||||
|
||||
function connect () {
|
||||
process.nextTick(function () {
|
||||
var s = net.Stream();
|
||||
var gotConnected = false;
|
||||
s.connect(9000);
|
||||
|
||||
s.on('connect', function () {
|
||||
gotConnected = true;
|
||||
connections++;
|
||||
connect();
|
||||
});
|
||||
|
||||
s.on('close', function () {
|
||||
if (gotConnected) connections--;
|
||||
lastClose = new Date();
|
||||
});
|
||||
|
||||
s.on('error', function () {
|
||||
errors++;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
connect();
|
||||
|
||||
|
||||
var oldConnections, oldErrors;
|
||||
|
||||
// Try to start new connections every so often
|
||||
setInterval(connect, 5000);
|
||||
|
||||
setInterval(function () {
|
||||
if (oldConnections != connections) {
|
||||
oldConnections = connections;
|
||||
console.log("CLIENT %d connections: %d", process.pid, connections);
|
||||
}
|
||||
|
||||
if (oldErrors != errors) {
|
||||
oldErrors = errors;
|
||||
console.log("CLIENT %d errors: %d", process.pid, errors);
|
||||
}
|
||||
}, 1000);
|
||||
|
||||
31
benchmark/idle_server.js
Normal file
31
benchmark/idle_server.js
Normal file
@@ -0,0 +1,31 @@
|
||||
net = require('net');
|
||||
connections = 0;
|
||||
|
||||
var errors = 0;
|
||||
|
||||
server = net.Server(function (socket) {
|
||||
|
||||
socket.on('error', function () {
|
||||
errors++;
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
//server.maxConnections = 128;
|
||||
|
||||
server.listen(9000);
|
||||
|
||||
var oldConnections, oldErrors;
|
||||
|
||||
setInterval(function () {
|
||||
if (oldConnections != server.connections) {
|
||||
oldConnections = server.connections;
|
||||
console.log("SERVER %d connections: %d", process.pid, server.connections);
|
||||
}
|
||||
|
||||
if (oldErrors != errors) {
|
||||
oldErrors = errors;
|
||||
console.log("SERVER %d errors: %d", process.pid, errors);
|
||||
}
|
||||
}, 1000);
|
||||
|
||||
122
benchmark/io.c
Normal file
122
benchmark/io.c
Normal file
@@ -0,0 +1,122 @@
|
||||
/**
|
||||
* gcc -o iotest io.c
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/time.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
static int c = 0;
|
||||
static int tsize = 1000 * 1048576;
|
||||
static const char path[] = "/tmp/wt.dat";
|
||||
static char buf[65536];
|
||||
|
||||
static uint64_t now(void) {
|
||||
struct timeval tv;
|
||||
|
||||
if (gettimeofday(&tv, NULL))
|
||||
abort();
|
||||
|
||||
return tv.tv_sec * 1000000ULL + tv.tv_usec;
|
||||
}
|
||||
|
||||
static void writetest(int size, size_t bsize)
|
||||
{
|
||||
int i;
|
||||
uint64_t start, end;
|
||||
double elapsed;
|
||||
double mbps;
|
||||
|
||||
assert(bsize <= sizeof buf);
|
||||
|
||||
int fd = open(path, O_CREAT|O_WRONLY, 0644);
|
||||
if (fd < 0) {
|
||||
perror("open failed");
|
||||
exit(254);
|
||||
}
|
||||
|
||||
start = now();
|
||||
|
||||
for (i = 0; i < size; i += bsize) {
|
||||
int rv = write(fd, buf, bsize);
|
||||
if (c++ % 2000 == 0) fprintf(stderr, ".");
|
||||
if (rv < 0) {
|
||||
perror("write failed");
|
||||
exit(254);
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef NSYNC
|
||||
# ifdef __linux__
|
||||
fdatasync(fd);
|
||||
# else
|
||||
fsync(fd);
|
||||
# endif
|
||||
#endif /* SYNC */
|
||||
|
||||
close(fd);
|
||||
|
||||
end = now();
|
||||
elapsed = (end - start) / 1e6;
|
||||
mbps = ((tsize/elapsed)) / 1048576;
|
||||
|
||||
fprintf(stderr, "\nWrote %d bytes in %03fs using %ld byte buffers: %03fmB/s\n", size, elapsed, bsize, mbps);
|
||||
}
|
||||
|
||||
void readtest(int size, size_t bsize)
|
||||
{
|
||||
int i;
|
||||
uint64_t start, end;
|
||||
double elapsed;
|
||||
double mbps;
|
||||
|
||||
assert(bsize <= sizeof buf);
|
||||
|
||||
int fd = open(path, O_RDONLY, 0644);
|
||||
if (fd < 0) {
|
||||
perror("open failed");
|
||||
exit(254);
|
||||
}
|
||||
|
||||
start = now();
|
||||
|
||||
for (i = 0; i < size; i += bsize) {
|
||||
int rv = read(fd, buf, bsize);
|
||||
if (rv < 0) {
|
||||
perror("write failed");
|
||||
exit(254);
|
||||
}
|
||||
}
|
||||
close(fd);
|
||||
|
||||
end = now();
|
||||
elapsed = (end - start) / 1e6;
|
||||
mbps = ((tsize/elapsed)) / 1048576;
|
||||
|
||||
fprintf(stderr, "Read %d bytes in %03fs using %ld byte buffers: %03fmB/s\n", size, elapsed, bsize, mbps);
|
||||
}
|
||||
|
||||
void cleanup() {
|
||||
unlink(path);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int i;
|
||||
int bsizes[] = {1024, 4096, 8192, 16384, 32768, 65536, 0};
|
||||
|
||||
for (i = 0; bsizes[i] != 0; i++) {
|
||||
writetest(tsize, bsizes[i]);
|
||||
}
|
||||
for (i = 0; bsizes[i] != 0; i++) {
|
||||
readtest(tsize, bsizes[i]);
|
||||
}
|
||||
atexit(cleanup);
|
||||
return 0;
|
||||
}
|
||||
109
benchmark/io.js
Normal file
109
benchmark/io.js
Normal file
@@ -0,0 +1,109 @@
|
||||
var fs = require('fs');
|
||||
var util = require('util');
|
||||
var Buffer = require('buffer').Buffer;
|
||||
|
||||
var path = "/tmp/wt.dat";
|
||||
var tsize = 1000 * 1048576;
|
||||
var bsizes = [1024, 4096, 8192, 16384, 32768, 65536];
|
||||
|
||||
function bufit(size) {
|
||||
var buf = new Buffer(size);
|
||||
for (var i = 0; i <buf.length ; i += 1) {
|
||||
buf[i] = 33;
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
function once(emitter, name, cb) {
|
||||
function incb() {
|
||||
cb.apply(undefined, arguments);
|
||||
emitter.removeListener(name, incb);
|
||||
}
|
||||
emitter.addListener(name, incb);
|
||||
}
|
||||
|
||||
c = 0
|
||||
|
||||
function writetest(size, bsize) {
|
||||
var s = fs.createWriteStream(path, {'flags': 'w', 'mode': 0644});
|
||||
var remaining = size;
|
||||
var buf = bufit(bsize);
|
||||
|
||||
function dowrite() {
|
||||
var rv = s.write(buf);
|
||||
remaining -= buf.length;
|
||||
if (remaining > 0) {
|
||||
//if (remaining % 90000 == 0) console.error("remaining: %d", remaining);
|
||||
//process.nextTick(dowrite);
|
||||
} else {
|
||||
s.emit('done')
|
||||
s.end();
|
||||
}
|
||||
}
|
||||
|
||||
s.on('drain', function () {
|
||||
dowrite();
|
||||
if (c++ % 2000 == 0) util.print(".");
|
||||
});
|
||||
|
||||
dowrite();
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
function readtest(size, bsize) {
|
||||
var s = fs.createReadStream(path, {'flags': 'r', 'encoding': 'binary', 'mode': 0644, 'bufferSize': bsize});
|
||||
s.addListener("data", function (chunk) {
|
||||
// got a chunk...
|
||||
|
||||
});
|
||||
return s;
|
||||
}
|
||||
|
||||
function wt(tsize, bsize, done) {
|
||||
var start = Date.now();
|
||||
s = writetest(tsize, bsize);
|
||||
s.addListener('close', function() {
|
||||
var end = Date.now();
|
||||
var diff = end - start;
|
||||
console.log('Wrote '+ tsize +' bytes in '+ diff/1000 +'s using '+ bsize +' byte buffers: '+ ((tsize/(diff/1000)) / 1048576) +' mB/s');
|
||||
done();
|
||||
});
|
||||
}
|
||||
|
||||
function rt(tsize, bsize, done) {
|
||||
var start = Date.now();
|
||||
s = readtest(tsize, bsize);
|
||||
s.addListener('close', function() {
|
||||
var end = Date.now();
|
||||
var diff = end - start;
|
||||
console.log('Read '+ tsize +' bytes in '+ diff/1000 +'s using '+ bsize +' byte buffers: '+ ((tsize/(diff/1000)) / 1048576) +' mB/s');
|
||||
done();
|
||||
});
|
||||
}
|
||||
|
||||
var bs= 0;
|
||||
|
||||
function nextwt() {
|
||||
if (bsizes.length <= bs) {
|
||||
bs = 0;
|
||||
nextrt();
|
||||
return;
|
||||
}
|
||||
wt(tsize, bsizes[bs], nextwt);
|
||||
bs += 1;
|
||||
}
|
||||
|
||||
function nextrt() {
|
||||
if (bsizes.length <= bs) {
|
||||
fs.unlink(path, function (err) {
|
||||
if (err) throw err;
|
||||
console.log('All done!');
|
||||
});
|
||||
return;
|
||||
}
|
||||
rt(tsize, bsizes[bs], nextrt);
|
||||
bs += 1;
|
||||
}
|
||||
|
||||
nextwt();
|
||||
41
benchmark/next-tick-2.js
Normal file
41
benchmark/next-tick-2.js
Normal file
@@ -0,0 +1,41 @@
|
||||
// Copyright Joyent, Inc. and other Node contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
// persons to whom the Software is furnished to do so, subject to the
|
||||
// following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
var count = 2e6,
|
||||
left = count,
|
||||
start;
|
||||
|
||||
function onNextTick() {
|
||||
if (--left) {
|
||||
process.nextTick(onNextTick);
|
||||
} else {
|
||||
finalize();
|
||||
}
|
||||
}
|
||||
|
||||
function finalize() {
|
||||
var duration = (new Date()).getTime() - start,
|
||||
ticksPerSec = count / duration * 1000;
|
||||
console.log("nextTick callbacks per second: " + Math.round(ticksPerSec));
|
||||
}
|
||||
|
||||
start = (new Date()).getTime();
|
||||
process.nextTick(onNextTick);
|
||||
17
benchmark/next-tick.js
Normal file
17
benchmark/next-tick.js
Normal file
@@ -0,0 +1,17 @@
|
||||
// run with `time node benchmark/next-tick.js`
|
||||
var assert = require('assert');
|
||||
|
||||
var N = 1e7;
|
||||
var n = 0;
|
||||
|
||||
process.on('exit', function() {
|
||||
assert.equal(n, N);
|
||||
});
|
||||
|
||||
function cb() {
|
||||
n++;
|
||||
}
|
||||
|
||||
for (var i = 0; i < N; ++i) {
|
||||
process.nextTick(cb);
|
||||
}
|
||||
86
benchmark/plot.R
Executable file
86
benchmark/plot.R
Executable file
@@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env Rscript
|
||||
|
||||
# To use this script you'll need to install R: http://www.r-project.org/
|
||||
# and a library for R called ggplot2
|
||||
# Which can be done by starting R and typing install.packages("ggplot2")
|
||||
# like this:
|
||||
#
|
||||
# shell% R
|
||||
# R version 2.11.0 beta (2010-04-12 r51689)
|
||||
# > install.packages("ggplot2")
|
||||
# (follow prompt)
|
||||
#
|
||||
# Then you can try this script by providing a full path to .data file
|
||||
# outputed from 'make bench'
|
||||
#
|
||||
# > cd ~/src/node
|
||||
# > make bench
|
||||
# ...
|
||||
# > ./benchmark/plot.R .benchmark_reports/ab-hello-world-buffer-1024/ff456b38862de3fd0118c6ac6b3f46edb1fbb87f/20101013162056.data
|
||||
#
|
||||
# This will generate a PNG file which you can view
|
||||
#
|
||||
#
|
||||
# Hopefully these steps will be automated in the future.
|
||||
|
||||
|
||||
|
||||
library(ggplot2)
|
||||
|
||||
args <- commandArgs(TRUE)
|
||||
|
||||
ab.load <- function (filename, name) {
|
||||
raw <- data.frame(read.csv(filename, sep="\t", header=T), server=name)
|
||||
raw <- data.frame(raw, time=raw$seconds-min(raw$seconds))
|
||||
raw <- data.frame(raw, time_s=raw$time/1000000)
|
||||
raw
|
||||
}
|
||||
|
||||
#ab.tsPoint <- function (d) {
|
||||
# qplot(time_s, ttime, data=d, facets=server~.,
|
||||
# geom="point", alpha=I(1/15), ylab="response time (ms)",
|
||||
# xlab="time (s)", main="c=30, res=26kb",
|
||||
# ylim=c(0,100))
|
||||
#}
|
||||
#
|
||||
#ab.tsLine <- function (d) {
|
||||
# qplot(time_s, ttime, data=d, facets=server~.,
|
||||
# geom="line", ylab="response time (ms)",
|
||||
# xlab="time (s)", main="c=30, res=26kb",
|
||||
# ylim=c(0,100))
|
||||
#}
|
||||
|
||||
|
||||
filename <- args[0:1]
|
||||
data <- ab.load(filename, "node")
|
||||
|
||||
|
||||
# histogram
|
||||
|
||||
#hist_png_filename <- gsub(".data", "_hist.png", filename)
|
||||
hist_png_filename <- "hist.png"
|
||||
|
||||
png(filename = hist_png_filename, width = 480, height = 380, units = "px")
|
||||
|
||||
qplot(ttime, data=data, geom="histogram",
|
||||
main="xxx",
|
||||
binwidth=1, xlab="response time (ms)",
|
||||
xlim=c(0,100))
|
||||
|
||||
print(hist_png_filename)
|
||||
|
||||
|
||||
|
||||
# time series
|
||||
|
||||
#ts_png_filename <- gsub(".data", "_ts.png", filename)
|
||||
ts_png_filename = "ts.png"
|
||||
|
||||
png(filename = ts_png_filename, width = 480, height = 380, units = "px")
|
||||
|
||||
qplot(time, ttime, data=data, facets=server~.,
|
||||
geom="point", alpha=I(1/15), ylab="response time (ms)",
|
||||
xlab="time (s)", main="xxx",
|
||||
ylim=c(0,100))
|
||||
|
||||
print(ts_png_filename)
|
||||
@@ -1,13 +1,13 @@
|
||||
libDir = node.path.join(node.path.dirname(__filename), "../lib");
|
||||
node.libraryPaths.unshift(libDir);
|
||||
node.mixin(require("/utils.js"));
|
||||
var util = require("util"),
|
||||
childProcess = require("child_process");
|
||||
|
||||
function next (i) {
|
||||
if (i <= 0) return;
|
||||
|
||||
var child = node.createChildProcess("echo", ["hello"]);
|
||||
var child = childProcess.spawn("echo", ["hello"]);
|
||||
|
||||
child.addListener("output", function (chunk) {
|
||||
if (chunk) print(chunk);
|
||||
child.stdout.addListener("data", function (chunk) {
|
||||
util.print(chunk);
|
||||
});
|
||||
|
||||
child.addListener("exit", function (code) {
|
||||
|
||||
1
benchmark/report-startup-memory.js
Normal file
1
benchmark/report-startup-memory.js
Normal file
@@ -0,0 +1 @@
|
||||
console.log(process.memoryUsage().rss);
|
||||
@@ -1,16 +1,16 @@
|
||||
libDir = node.path.join(node.path.dirname(__filename), "../lib");
|
||||
node.libraryPaths.unshift(libDir);
|
||||
node.mixin(require("/utils.js"));
|
||||
var benchmarks = [ "static_http_server.js"
|
||||
, "timers.js"
|
||||
var path = require("path");
|
||||
var util = require("util");
|
||||
var childProcess = require("child_process");
|
||||
var benchmarks = [ "timers.js"
|
||||
, "process_loop.js"
|
||||
, "static_http_server.js"
|
||||
];
|
||||
|
||||
var benchmark_dir = node.path.dirname(__filename);
|
||||
var benchmarkDir = path.dirname(__filename);
|
||||
|
||||
function exec (script, callback) {
|
||||
var start = new Date();
|
||||
var child = node.createChildProcess(ARGV[0], [node.path.join(benchmark_dir, script)]);
|
||||
var child = childProcess.spawn(process.argv[0], [path.join(benchmarkDir, script)]);
|
||||
child.addListener("exit", function (code) {
|
||||
var elapsed = new Date() - start;
|
||||
callback(elapsed, code);
|
||||
@@ -19,12 +19,12 @@ function exec (script, callback) {
|
||||
|
||||
function runNext (i) {
|
||||
if (i >= benchmarks.length) return;
|
||||
print(benchmarks[i] + ": ");
|
||||
util.print(benchmarks[i] + ": ");
|
||||
exec(benchmarks[i], function (elapsed, code) {
|
||||
if (code != 0) {
|
||||
puts("ERROR ");
|
||||
console.log("ERROR ");
|
||||
}
|
||||
puts(elapsed);
|
||||
console.log(elapsed);
|
||||
runNext(i+1);
|
||||
});
|
||||
};
|
||||
|
||||
15
benchmark/settimeout.js
Normal file
15
benchmark/settimeout.js
Normal file
@@ -0,0 +1,15 @@
|
||||
console.log("wait...");
|
||||
var done = 0;
|
||||
var N = 5000000;
|
||||
var begin = new Date();
|
||||
for (var i = 0; i < N; i++) {
|
||||
setTimeout(function () {
|
||||
if (++done == N) {
|
||||
var end = new Date();
|
||||
console.log("smaller is better");
|
||||
console.log("startup: %d", start - begin);
|
||||
console.log("done: %d", end - start);
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
var start = new Date();
|
||||
26
benchmark/startup.js
Normal file
26
benchmark/startup.js
Normal file
@@ -0,0 +1,26 @@
|
||||
var spawn = require('child_process').spawn,
|
||||
path = require('path'),
|
||||
emptyJsFile = path.join(__dirname, '../test/fixtures/semicolon.js'),
|
||||
starts = 100,
|
||||
i = 0,
|
||||
start;
|
||||
|
||||
function startNode() {
|
||||
var node = spawn(process.execPath || process.argv[0], [emptyJsFile]);
|
||||
node.on('exit', function(exitCode) {
|
||||
if (exitCode !== 0) {
|
||||
throw new Error('Error during node startup');
|
||||
}
|
||||
|
||||
i++;
|
||||
if (i < starts) {
|
||||
startNode();
|
||||
} else{
|
||||
var duration = +new Date - start;
|
||||
console.log('Started node %d times in %s ms. %d ms / start.', starts, duration, duration / starts);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
start = +new Date;
|
||||
startNode();
|
||||
@@ -1,45 +1,43 @@
|
||||
libDir = node.path.join(node.path.dirname(__filename), "../lib");
|
||||
node.libraryPaths.unshift(libDir);
|
||||
http = require("/http.js");
|
||||
var http = require('http');
|
||||
|
||||
var concurrency = 30;
|
||||
var port = 8000;
|
||||
var port = 12346;
|
||||
var n = 700;
|
||||
var bytes = 1024*5;
|
||||
|
||||
var requests = 0;
|
||||
var responses = 0;
|
||||
|
||||
var body = "";
|
||||
var body = '';
|
||||
for (var i = 0; i < bytes; i++) {
|
||||
body += "C";
|
||||
body += 'C';
|
||||
}
|
||||
|
||||
var server = http.createServer(function (req, res) {
|
||||
res.sendHeader(200, {
|
||||
"Content-Type": "text/plain",
|
||||
"Content-Length": body.length
|
||||
var server = http.createServer(function(req, res) {
|
||||
res.writeHead(200, {
|
||||
'Content-Type': 'text/plain',
|
||||
'Content-Length': body.length
|
||||
});
|
||||
res.sendBody(body);
|
||||
res.finish();
|
||||
res.end(body);
|
||||
})
|
||||
server.listen(port);
|
||||
|
||||
function responseListener (res) {
|
||||
res.addListener("complete", function () {
|
||||
if (requests < n) {
|
||||
res.client.get("/").finish(responseListener);
|
||||
requests++;
|
||||
}
|
||||
server.listen(port, function() {
|
||||
var agent = new http.Agent();
|
||||
agent.maxSockets = concurrency;
|
||||
|
||||
if (++responses == n) {
|
||||
server.close();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
for (var i = 0; i < concurrency; i++) {
|
||||
var client = http.createClient(port);
|
||||
client.id = i;
|
||||
client.get("/").finish(responseListener);
|
||||
requests++;
|
||||
}
|
||||
for (var i = 0; i < n; i++) {
|
||||
var req = http.get({
|
||||
port: port,
|
||||
path: '/',
|
||||
agent: agent
|
||||
}, function(res) {
|
||||
res.on('end', function() {
|
||||
if (++responses === n) {
|
||||
server.close();
|
||||
}
|
||||
});
|
||||
});
|
||||
req.id = i;
|
||||
requests++;
|
||||
}
|
||||
});
|
||||
|
||||
6
benchmark/string_creation.js
Normal file
6
benchmark/string_creation.js
Normal file
@@ -0,0 +1,6 @@
|
||||
|
||||
|
||||
for (var i = 0; i < 9e7; i++) {
|
||||
s = '01234567890';
|
||||
s[1] = "a";
|
||||
}
|
||||
25
benchmark/throughput-child.js
Normal file
25
benchmark/throughput-child.js
Normal file
@@ -0,0 +1,25 @@
|
||||
var net = require('net');
|
||||
var received = 0;
|
||||
var start = new Date();
|
||||
var socket = net.connect(8000);
|
||||
|
||||
socket.on('data', function(d) {
|
||||
received += d.length;
|
||||
});
|
||||
|
||||
var interval = setInterval(function() {
|
||||
// After 1 gigabyte shutdown.
|
||||
if (received > 10 * 1024 * 1024 * 1024) {
|
||||
socket.destroy();
|
||||
clearInterval(interval);
|
||||
process.exit(0);
|
||||
} else {
|
||||
// Otherwise print some stats.
|
||||
var now = new Date();
|
||||
var gigabytes = received / (1024 * 1024 * 1024);
|
||||
var gigabits = gigabytes * 8.0;
|
||||
var millisec = now - start;
|
||||
var sec = millisec / 1000;
|
||||
console.log((gigabits / sec) + " gbit/sec")
|
||||
}
|
||||
}, 1000);
|
||||
21
benchmark/throughput.js
Normal file
21
benchmark/throughput.js
Normal file
@@ -0,0 +1,21 @@
|
||||
var fork = require('child_process').fork;
|
||||
var net = require('net');
|
||||
var buffer = new Buffer(1024 * 1024);
|
||||
|
||||
function write(socket) {
|
||||
if (!socket.writable) return;
|
||||
|
||||
socket.write(buffer, function() {
|
||||
write(socket);
|
||||
});
|
||||
}
|
||||
|
||||
var server = net.createServer(function(socket) {
|
||||
server.close();
|
||||
write(socket);
|
||||
});
|
||||
|
||||
server.listen(8000, function() {
|
||||
fork(__dirname + '/throughput-child.js');
|
||||
});
|
||||
|
||||
86
benchmark/tls-connect.js
Normal file
86
benchmark/tls-connect.js
Normal file
@@ -0,0 +1,86 @@
|
||||
|
||||
var assert = require('assert'),
|
||||
fs = require('fs'),
|
||||
path = require('path'),
|
||||
tls = require('tls');
|
||||
|
||||
|
||||
var target_connections = 10000,
|
||||
concurrency = 10;
|
||||
|
||||
for (var i = 2; i < process.argv.length; i++) {
|
||||
switch (process.argv[i]) {
|
||||
case '-c':
|
||||
concurrency = ~~process.argv[++i];
|
||||
break;
|
||||
|
||||
case '-n':
|
||||
target_connections = ~~process.argv[++i];
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new Error('Invalid flag: ' + process.argv[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var cert_dir = path.resolve(__dirname, '../test/fixtures'),
|
||||
options = { key: fs.readFileSync(cert_dir + '/test_key.pem'),
|
||||
cert: fs.readFileSync(cert_dir + '/test_cert.pem'),
|
||||
ca: [ fs.readFileSync(cert_dir + '/test_ca.pem') ] };
|
||||
|
||||
var server = tls.createServer(options, onConnection);
|
||||
server.listen(8000);
|
||||
|
||||
|
||||
var initiated_connections = 0,
|
||||
server_connections = 0,
|
||||
client_connections = 0,
|
||||
start = Date.now();
|
||||
|
||||
for (var i = 0; i < concurrency; i++)
|
||||
makeConnection();
|
||||
|
||||
|
||||
process.on('exit', onExit);
|
||||
|
||||
|
||||
function makeConnection() {
|
||||
if (initiated_connections >= target_connections)
|
||||
return;
|
||||
|
||||
initiated_connections++;
|
||||
|
||||
var conn = tls.connect(8000, function() {
|
||||
client_connections++;
|
||||
|
||||
if (client_connections % 100 === 0)
|
||||
console.log(client_connections + ' of ' + target_connections +
|
||||
' connections made');
|
||||
|
||||
conn.end();
|
||||
makeConnection();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function onConnection(conn) {
|
||||
server_connections++;
|
||||
|
||||
if (server_connections === target_connections)
|
||||
server.close();
|
||||
}
|
||||
|
||||
|
||||
function onExit() {
|
||||
var end = Date.now(),
|
||||
s = (end - start) / 1000,
|
||||
persec = Math.round(target_connections / s);
|
||||
|
||||
assert.equal(initiated_connections, target_connections);
|
||||
assert.equal(client_connections, target_connections);
|
||||
assert.equal(server_connections, target_connections);
|
||||
|
||||
console.log('%d connections in %d s', target_connections, s);
|
||||
console.log('%d connections per second', persec);
|
||||
}
|
||||
63
benchmark/tls-fragmentation.js
Normal file
63
benchmark/tls-fragmentation.js
Normal file
@@ -0,0 +1,63 @@
|
||||
// Copyright Joyent, Inc. and other Node contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
// persons to whom the Software is furnished to do so, subject to the
|
||||
// following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
if (!process.versions.openssl) {
|
||||
console.error('Skipping because node compiled without OpenSSL.');
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
var common = require('../common');
|
||||
var assert = require('assert');
|
||||
var tls = require('tls');
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
|
||||
var options = {
|
||||
key: fs.readFileSync(path.join(common.fixturesDir, 'test_key.pem')),
|
||||
cert: fs.readFileSync(path.join(common.fixturesDir, 'test_cert.pem'))
|
||||
};
|
||||
|
||||
var fragment = 'fr';
|
||||
var dataSize = 1024 * 1024;
|
||||
var sent = 0;
|
||||
var received = 0;
|
||||
|
||||
var server = tls.createServer(options, function (stream) {
|
||||
for (sent = 0; sent <= dataSize; sent += fragment.length) {
|
||||
stream.write(fragment);
|
||||
}
|
||||
stream.end();
|
||||
});
|
||||
|
||||
server.listen(common.PORT, function () {
|
||||
var client = tls.connect(common.PORT, function () {
|
||||
client.on('data', function (data) {
|
||||
received += data.length;
|
||||
});
|
||||
client.on('end', function () {
|
||||
server.close();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
process.on('exit', function () {
|
||||
assert.equal(sent, received);
|
||||
});
|
||||
15
benchmark/v8_bench.js
Normal file
15
benchmark/v8_bench.js
Normal file
@@ -0,0 +1,15 @@
|
||||
// compare with "google-chrome deps/v8/benchmarks/run.html"
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var vm = require('vm');
|
||||
|
||||
var dir = path.join(__dirname, '..', 'deps', 'v8', 'benchmarks');
|
||||
|
||||
global.print = console.log;
|
||||
|
||||
global.load = function (x) {
|
||||
var source = fs.readFileSync(path.join(dir, x), 'utf8');
|
||||
vm.runInThisContext(source, x);
|
||||
}
|
||||
|
||||
load('run.js');
|
||||
@@ -1,11 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
node.mixin(require("/utils.js"));
|
||||
puts("Welcome to the Node.js REPL.");
|
||||
puts("Enter ECMAScript at the prompt.");
|
||||
puts("Tip 1: Use 'rlwrap node-repl' for a better interface");
|
||||
puts("Tip 2: Type Control-D to exit.");
|
||||
|
||||
require("/repl.js").start();
|
||||
|
||||
// vim:ft=javascript
|
||||
225
common.gypi
Normal file
225
common.gypi
Normal file
@@ -0,0 +1,225 @@
|
||||
{
|
||||
'variables': {
|
||||
'visibility%': 'hidden', # V8's visibility setting
|
||||
'target_arch%': 'ia32', # set v8's target architecture
|
||||
'host_arch%': 'ia32', # set v8's host architecture
|
||||
'want_separate_host_toolset': 0, # V8 should not build target and host
|
||||
'library%': 'static_library', # allow override to 'shared_library' for DLL/.so builds
|
||||
'component%': 'static_library', # NB. these names match with what V8 expects
|
||||
'msvs_multi_core_compile': '0', # we do enable multicore compiles, but not using the V8 way
|
||||
'gcc_version%': 'unknown',
|
||||
'clang%': 0,
|
||||
|
||||
# Turn on optimizations that may trigger compiler bugs.
|
||||
# Use at your own risk. Do *NOT* report bugs if this option is enabled.
|
||||
'node_unsafe_optimizations%': 0,
|
||||
|
||||
# Enable V8's post-mortem debugging only on unix flavors.
|
||||
'conditions': [
|
||||
['OS != "win"', {
|
||||
'v8_postmortem_support': 'true'
|
||||
}]
|
||||
],
|
||||
},
|
||||
|
||||
'target_defaults': {
|
||||
'default_configuration': 'Release',
|
||||
'configurations': {
|
||||
'Debug': {
|
||||
'defines': [ 'DEBUG', '_DEBUG' ],
|
||||
'cflags': [ '-g', '-O0' ],
|
||||
'conditions': [
|
||||
['target_arch=="x64"', {
|
||||
'msvs_configuration_platform': 'x64',
|
||||
}],
|
||||
],
|
||||
'msvs_settings': {
|
||||
'VCCLCompilerTool': {
|
||||
'RuntimeLibrary': 1, # static debug
|
||||
'Optimization': 0, # /Od, no optimization
|
||||
'MinimalRebuild': 'false',
|
||||
'OmitFramePointers': 'false',
|
||||
'BasicRuntimeChecks': 3, # /RTC1
|
||||
},
|
||||
'VCLinkerTool': {
|
||||
'LinkIncremental': 2, # enable incremental linking
|
||||
},
|
||||
},
|
||||
},
|
||||
'Release': {
|
||||
'conditions': [
|
||||
['target_arch=="x64"', {
|
||||
'msvs_configuration_platform': 'x64',
|
||||
}],
|
||||
['node_unsafe_optimizations==1', {
|
||||
'cflags': [ '-O3', '-ffunction-sections', '-fdata-sections' ],
|
||||
'ldflags': [ '-Wl,--gc-sections' ],
|
||||
}, {
|
||||
'cflags': [ '-O2', '-fno-strict-aliasing' ],
|
||||
'cflags!': [ '-O3', '-fstrict-aliasing' ],
|
||||
'conditions': [
|
||||
# Required by the dtrace post-processor. Unfortunately,
|
||||
# some gcc/binutils combos generate bad code when
|
||||
# -ffunction-sections is enabled. Let's hope for the best.
|
||||
['OS=="solaris"', {
|
||||
'cflags': [ '-ffunction-sections', '-fdata-sections' ],
|
||||
}, {
|
||||
'cflags!': [ '-ffunction-sections', '-fdata-sections' ],
|
||||
}],
|
||||
['clang == 0 and gcc_version >= 40', {
|
||||
'cflags': [ '-fno-tree-vrp' ],
|
||||
}],
|
||||
['clang == 0 and gcc_version <= 44', {
|
||||
'cflags': [ '-fno-tree-sink' ],
|
||||
}],
|
||||
],
|
||||
}],
|
||||
['OS=="solaris"', {
|
||||
'cflags': [ '-fno-omit-frame-pointer' ],
|
||||
# pull in V8's postmortem metadata
|
||||
'ldflags': [ '-Wl,-z,allextract' ]
|
||||
}],
|
||||
],
|
||||
'msvs_settings': {
|
||||
'VCCLCompilerTool': {
|
||||
'RuntimeLibrary': 0, # static release
|
||||
'Optimization': 3, # /Ox, full optimization
|
||||
'FavorSizeOrSpeed': 1, # /Ot, favour speed over size
|
||||
'InlineFunctionExpansion': 2, # /Ob2, inline anything eligible
|
||||
'WholeProgramOptimization': 'true', # /GL, whole program optimization, needed for LTCG
|
||||
'OmitFramePointers': 'true',
|
||||
'EnableFunctionLevelLinking': 'true',
|
||||
'EnableIntrinsicFunctions': 'true',
|
||||
'RuntimeTypeInfo': 'false',
|
||||
'ExceptionHandling': '0',
|
||||
'AdditionalOptions': [
|
||||
'/MP', # compile across multiple CPUs
|
||||
],
|
||||
},
|
||||
'VCLibrarianTool': {
|
||||
'AdditionalOptions': [
|
||||
'/LTCG', # link time code generation
|
||||
],
|
||||
},
|
||||
'VCLinkerTool': {
|
||||
'LinkTimeCodeGeneration': 1, # link-time code generation
|
||||
'OptimizeReferences': 2, # /OPT:REF
|
||||
'EnableCOMDATFolding': 2, # /OPT:ICF
|
||||
'LinkIncremental': 1, # disable incremental linking
|
||||
},
|
||||
},
|
||||
}
|
||||
},
|
||||
'msvs_settings': {
|
||||
'VCCLCompilerTool': {
|
||||
'StringPooling': 'true', # pool string literals
|
||||
'DebugInformationFormat': 3, # Generate a PDB
|
||||
'WarningLevel': 3,
|
||||
'BufferSecurityCheck': 'true',
|
||||
'ExceptionHandling': 1, # /EHsc
|
||||
'SuppressStartupBanner': 'true',
|
||||
'WarnAsError': 'false',
|
||||
},
|
||||
'VCLibrarianTool': {
|
||||
},
|
||||
'VCLinkerTool': {
|
||||
'conditions': [
|
||||
['target_arch=="x64"', {
|
||||
'TargetMachine' : 17 # /MACHINE:X64
|
||||
}],
|
||||
],
|
||||
'GenerateDebugInformation': 'true',
|
||||
'RandomizedBaseAddress': 2, # enable ASLR
|
||||
'DataExecutionPrevention': 2, # enable DEP
|
||||
'AllowIsolation': 'true',
|
||||
'SuppressStartupBanner': 'true',
|
||||
'target_conditions': [
|
||||
['_type=="executable"', {
|
||||
'SubSystem': 1, # console executable
|
||||
}],
|
||||
],
|
||||
},
|
||||
},
|
||||
'conditions': [
|
||||
['OS == "win"', {
|
||||
'msvs_cygwin_shell': 0, # prevent actions from trying to use cygwin
|
||||
'defines': [
|
||||
'WIN32',
|
||||
# we don't really want VC++ warning us about
|
||||
# how dangerous C functions are...
|
||||
'_CRT_SECURE_NO_DEPRECATE',
|
||||
# ... or that C implementations shouldn't use
|
||||
# POSIX names
|
||||
'_CRT_NONSTDC_NO_DEPRECATE',
|
||||
'BUILDING_V8_SHARED=1',
|
||||
'BUILDING_UV_SHARED=1',
|
||||
],
|
||||
}, {
|
||||
'defines': [
|
||||
'_LARGEFILE_SOURCE',
|
||||
'_FILE_OFFSET_BITS=64',
|
||||
],
|
||||
}],
|
||||
[ 'OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris"', {
|
||||
'cflags': [ '-Wall', '-pthread', ],
|
||||
'cflags_cc': [ '-fno-rtti', '-fno-exceptions' ],
|
||||
'ldflags': [ '-pthread', '-rdynamic' ],
|
||||
'conditions': [
|
||||
[ 'target_arch=="ia32"', {
|
||||
'cflags': [ '-m32' ],
|
||||
'ldflags': [ '-m32' ],
|
||||
}],
|
||||
[ 'target_arch=="x64"', {
|
||||
'cflags': [ '-m64' ],
|
||||
'ldflags': [ '-m64' ],
|
||||
}],
|
||||
[ 'OS=="solaris"', {
|
||||
'cflags': [ '-pthreads' ],
|
||||
'ldflags': [ '-pthreads' ],
|
||||
'cflags!': [ '-pthread' ],
|
||||
'ldflags!': [ '-pthread' ],
|
||||
}],
|
||||
],
|
||||
}],
|
||||
['OS=="mac"', {
|
||||
'defines': ['_DARWIN_USE_64_BIT_INODE=1'],
|
||||
'xcode_settings': {
|
||||
'ALWAYS_SEARCH_USER_PATHS': 'NO',
|
||||
'GCC_CW_ASM_SYNTAX': 'NO', # No -fasm-blocks
|
||||
'GCC_DYNAMIC_NO_PIC': 'NO', # No -mdynamic-no-pic
|
||||
# (Equivalent to -fPIC)
|
||||
'GCC_ENABLE_CPP_EXCEPTIONS': 'NO', # -fno-exceptions
|
||||
'GCC_ENABLE_CPP_RTTI': 'NO', # -fno-rtti
|
||||
'GCC_ENABLE_PASCAL_STRINGS': 'NO', # No -mpascal-strings
|
||||
'GCC_THREADSAFE_STATICS': 'NO', # -fno-threadsafe-statics
|
||||
'GCC_VERSION': '4.2',
|
||||
'PREBINDING': 'NO', # No -Wl,-prebind
|
||||
'MACOSX_DEPLOYMENT_TARGET': '10.5', # -mmacosx-version-min=10.5
|
||||
'USE_HEADERMAP': 'NO',
|
||||
'OTHER_CFLAGS': [
|
||||
'-fno-strict-aliasing',
|
||||
],
|
||||
'WARNING_CFLAGS': [
|
||||
'-Wall',
|
||||
'-Wendif-labels',
|
||||
'-W',
|
||||
'-Wno-unused-parameter',
|
||||
],
|
||||
},
|
||||
'target_conditions': [
|
||||
['_type!="static_library"', {
|
||||
'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-search_paths_first']},
|
||||
}],
|
||||
],
|
||||
'conditions': [
|
||||
['target_arch=="ia32"', {
|
||||
'xcode_settings': {'ARCHS': ['i386']},
|
||||
}],
|
||||
['target_arch=="x64"', {
|
||||
'xcode_settings': {'ARCHS': ['x86_64']},
|
||||
}],
|
||||
],
|
||||
}],
|
||||
],
|
||||
}
|
||||
}
|
||||
513
configure
vendored
513
configure
vendored
@@ -1,16 +1,507 @@
|
||||
#! /bin/sh
|
||||
#!/usr/bin/env python
|
||||
import optparse
|
||||
import os
|
||||
import pprint
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
CUR_DIR=$PWD
|
||||
CC = os.environ.get('CC', 'cc')
|
||||
|
||||
#possible relative path
|
||||
WORKINGDIR=`dirname $0`
|
||||
cd $WORKINGDIR
|
||||
#abs path
|
||||
WORKINGDIR=`pwd`
|
||||
cd $CUR_DIR
|
||||
root_dir = os.path.dirname(__file__)
|
||||
sys.path.insert(0, os.path.join(root_dir, 'deps', 'v8', 'tools'))
|
||||
|
||||
WAF="${WORKINGDIR}/tools/waf-light"
|
||||
# parse our options
|
||||
parser = optparse.OptionParser()
|
||||
|
||||
"${WAF}" configure $*
|
||||
parser.add_option("--debug",
|
||||
action="store_true",
|
||||
dest="debug",
|
||||
help="Also build debug build")
|
||||
|
||||
exit $?
|
||||
parser.add_option("--prefix",
|
||||
action="store",
|
||||
dest="prefix",
|
||||
help="Select the install prefix (defaults to /usr/local)")
|
||||
|
||||
parser.add_option("--without-npm",
|
||||
action="store_true",
|
||||
dest="without_npm",
|
||||
help="Don\'t install the bundled npm package manager")
|
||||
|
||||
parser.add_option("--without-waf",
|
||||
action="store_true",
|
||||
dest="without_waf",
|
||||
help="Don\'t install node-waf")
|
||||
|
||||
parser.add_option("--without-ssl",
|
||||
action="store_true",
|
||||
dest="without_ssl",
|
||||
help="Build without SSL")
|
||||
|
||||
parser.add_option("--without-snapshot",
|
||||
action="store_true",
|
||||
dest="without_snapshot",
|
||||
help="Build without snapshotting V8 libraries. You might want to set"
|
||||
" this for cross-compiling. [Default: False]")
|
||||
|
||||
parser.add_option("--shared-v8",
|
||||
action="store_true",
|
||||
dest="shared_v8",
|
||||
help="Link to a shared V8 DLL instead of static linking")
|
||||
|
||||
parser.add_option("--shared-v8-includes",
|
||||
action="store",
|
||||
dest="shared_v8_includes",
|
||||
help="Directory containing V8 header files")
|
||||
|
||||
parser.add_option("--shared-v8-libpath",
|
||||
action="store",
|
||||
dest="shared_v8_libpath",
|
||||
help="A directory to search for the shared V8 DLL")
|
||||
|
||||
parser.add_option("--shared-v8-libname",
|
||||
action="store",
|
||||
dest="shared_v8_libname",
|
||||
help="Alternative lib name to link to (default: 'v8')")
|
||||
|
||||
parser.add_option("--shared-openssl",
|
||||
action="store_true",
|
||||
dest="shared_openssl",
|
||||
help="Link to a shared OpenSSl DLL instead of static linking")
|
||||
|
||||
parser.add_option("--shared-openssl-includes",
|
||||
action="store",
|
||||
dest="shared_openssl_includes",
|
||||
help="Directory containing OpenSSL header files")
|
||||
|
||||
parser.add_option("--shared-openssl-libpath",
|
||||
action="store",
|
||||
dest="shared_openssl_libpath",
|
||||
help="A directory to search for the shared OpenSSL DLLs")
|
||||
|
||||
parser.add_option("--shared-openssl-libname",
|
||||
action="store",
|
||||
dest="shared_openssl_libname",
|
||||
help="Alternative lib name to link to (default: 'crypto,ssl')")
|
||||
|
||||
# deprecated
|
||||
parser.add_option("--openssl-use-sys",
|
||||
action="store_true",
|
||||
dest="shared_openssl",
|
||||
help=optparse.SUPPRESS_HELP)
|
||||
|
||||
# deprecated
|
||||
parser.add_option("--openssl-includes",
|
||||
action="store",
|
||||
dest="shared_openssl_includes",
|
||||
help=optparse.SUPPRESS_HELP)
|
||||
|
||||
# deprecated
|
||||
parser.add_option("--openssl-libpath",
|
||||
action="store",
|
||||
dest="shared_openssl_libpath",
|
||||
help=optparse.SUPPRESS_HELP)
|
||||
|
||||
parser.add_option("--no-ssl2",
|
||||
action="store_true",
|
||||
dest="no_ssl2",
|
||||
help="Disable OpenSSL v2")
|
||||
|
||||
parser.add_option("--shared-zlib",
|
||||
action="store_true",
|
||||
dest="shared_zlib",
|
||||
help="Link to a shared zlib DLL instead of static linking")
|
||||
|
||||
parser.add_option("--shared-zlib-includes",
|
||||
action="store",
|
||||
dest="shared_zlib_includes",
|
||||
help="Directory containing zlib header files")
|
||||
|
||||
parser.add_option("--shared-zlib-libpath",
|
||||
action="store",
|
||||
dest="shared_zlib_libpath",
|
||||
help="A directory to search for the shared zlib DLL")
|
||||
|
||||
parser.add_option("--shared-zlib-libname",
|
||||
action="store",
|
||||
dest="shared_zlib_libname",
|
||||
help="Alternative lib name to link to (default: 'z')")
|
||||
|
||||
parser.add_option("--with-dtrace",
|
||||
action="store_true",
|
||||
dest="with_dtrace",
|
||||
help="Build with DTrace (default is true on supported systems)")
|
||||
|
||||
parser.add_option("--without-dtrace",
|
||||
action="store_true",
|
||||
dest="without_dtrace",
|
||||
help="Build without DTrace")
|
||||
|
||||
parser.add_option("--with-etw",
|
||||
action="store_true",
|
||||
dest="with_etw",
|
||||
help="Build with ETW (default is true on Windows)")
|
||||
|
||||
parser.add_option("--without-etw",
|
||||
action="store_true",
|
||||
dest="without_etw",
|
||||
help="Build without ETW")
|
||||
|
||||
# CHECKME does this still work with recent releases of V8?
|
||||
parser.add_option("--gdb",
|
||||
action="store_true",
|
||||
dest="gdb",
|
||||
help="add gdb support")
|
||||
|
||||
parser.add_option("--dest-cpu",
|
||||
action="store",
|
||||
dest="dest_cpu",
|
||||
help="CPU architecture to build for. Valid values are: arm, ia32, x64")
|
||||
|
||||
parser.add_option("--dest-os",
|
||||
action="store",
|
||||
dest="dest_os",
|
||||
help="Operating system to build for. Valid values are: "
|
||||
"win, mac, solaris, freebsd, linux")
|
||||
|
||||
parser.add_option("--no-ifaddrs",
|
||||
action="store_true",
|
||||
dest="no_ifaddrs",
|
||||
help="Use on deprecated SunOS systems that do not support ifaddrs.h")
|
||||
|
||||
parser.add_option("--with-arm-float-abi",
|
||||
action="store",
|
||||
dest="arm_float_abi",
|
||||
help="Specifies which floating-point ABI to use. Valid values are: "
|
||||
"soft, softfp, hard")
|
||||
|
||||
# Using --unsafe-optimizations voids your warranty.
|
||||
parser.add_option("--unsafe-optimizations",
|
||||
action="store_true",
|
||||
dest="unsafe_optimizations",
|
||||
help=optparse.SUPPRESS_HELP)
|
||||
|
||||
parser.add_option("--tag",
|
||||
action="store",
|
||||
dest="tag",
|
||||
help="Custom build tag")
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
|
||||
def b(value):
|
||||
"""Returns the string 'true' if value is truthy, 'false' otherwise."""
|
||||
if value:
|
||||
return 'true'
|
||||
else:
|
||||
return 'false'
|
||||
|
||||
|
||||
def pkg_config(pkg):
|
||||
cmd = os.popen('pkg-config --libs %s' % pkg, 'r')
|
||||
libs = cmd.readline().strip()
|
||||
ret = cmd.close()
|
||||
if (ret): return None
|
||||
|
||||
cmd = os.popen('pkg-config --cflags %s' % pkg, 'r')
|
||||
cflags = cmd.readline().strip()
|
||||
ret = cmd.close()
|
||||
if (ret): return None
|
||||
|
||||
return (libs, cflags)
|
||||
|
||||
|
||||
def cc_macros():
|
||||
"""Checks predefined macros using the CC command."""
|
||||
|
||||
try:
|
||||
p = subprocess.Popen(CC.split() + ['-dM', '-E', '-'],
|
||||
stdin=subprocess.PIPE,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE)
|
||||
except OSError:
|
||||
print '''Node.js configure error: No acceptable C compiler found!
|
||||
|
||||
Please make sure you have a C compiler installed on your system and/or
|
||||
consider adjusting the CC environment variable if you installed
|
||||
it in a non-standard prefix.
|
||||
'''
|
||||
sys.exit()
|
||||
|
||||
p.stdin.write('\n')
|
||||
out = p.communicate()[0]
|
||||
|
||||
out = str(out).split('\n')
|
||||
|
||||
k = {}
|
||||
for line in out:
|
||||
import shlex
|
||||
lst = shlex.split(line)
|
||||
if len(lst) > 2:
|
||||
key = lst[1]
|
||||
val = lst[2]
|
||||
k[key] = val
|
||||
return k
|
||||
|
||||
|
||||
def is_arch_armv7():
|
||||
"""Check for ARMv7 instructions"""
|
||||
cc_macros_cache = cc_macros()
|
||||
return ('__ARM_ARCH_7__' in cc_macros_cache or
|
||||
'__ARM_ARCH_7A__' in cc_macros_cache or
|
||||
'__ARM_ARCH_7R__' in cc_macros_cache or
|
||||
'__ARM_ARCH_7M__' in cc_macros_cache)
|
||||
|
||||
|
||||
def arm_hard_float_abi():
|
||||
"""Check for hardfloat or softfloat eabi on ARM"""
|
||||
# GCC versions 4.6 and above define __ARM_PCS or __ARM_PCS_VFP to specify
|
||||
# the Floating Point ABI used (PCS stands for Procedure Call Standard).
|
||||
# We use these as well as a couple of other defines to statically determine
|
||||
# what FP ABI used.
|
||||
# GCC versions 4.4 and below don't support hard-fp.
|
||||
# GCC versions 4.5 may support hard-fp without defining __ARM_PCS or
|
||||
# __ARM_PCS_VFP.
|
||||
|
||||
if compiler_version() >= (4, 6, 0):
|
||||
return '__ARM_PCS_VFP' in cc_macros()
|
||||
elif compiler_version() < (4, 5, 0):
|
||||
return False
|
||||
elif '__ARM_PCS_VFP' in cc_macros():
|
||||
return True
|
||||
elif ('__ARM_PCS' in cc_macros() or
|
||||
'__SOFTFP' in cc_macros() or
|
||||
not '__VFP_FP__' in cc_macros()):
|
||||
return False
|
||||
else:
|
||||
print '''Node.js configure error: Your version of GCC does not report
|
||||
the Floating-Point ABI to compile for your hardware
|
||||
|
||||
Please manually specify which floating-point ABI to use with the
|
||||
--with-arm-float-abi option.
|
||||
'''
|
||||
sys.exit()
|
||||
|
||||
|
||||
def host_arch_cc():
|
||||
"""Host architecture check using the CC command."""
|
||||
|
||||
k = cc_macros()
|
||||
|
||||
matchup = {
|
||||
'__x86_64__' : 'x64',
|
||||
'__i386__' : 'ia32',
|
||||
'__arm__' : 'arm',
|
||||
}
|
||||
|
||||
rtn = 'ia32' # default
|
||||
|
||||
for i in matchup:
|
||||
if i in k and k[i] != '0':
|
||||
rtn = matchup[i]
|
||||
break
|
||||
|
||||
return rtn
|
||||
|
||||
|
||||
def host_arch_win():
|
||||
"""Host architecture check using environ vars (better way to do this?)"""
|
||||
|
||||
arch = os.environ.get('PROCESSOR_ARCHITECTURE', 'x86')
|
||||
|
||||
matchup = {
|
||||
'AMD64' : 'x64',
|
||||
'x86' : 'ia32',
|
||||
'arm' : 'arm',
|
||||
}
|
||||
|
||||
return matchup.get(arch, 'ia32')
|
||||
|
||||
|
||||
def compiler_version():
|
||||
try:
|
||||
proc = subprocess.Popen(CC.split() + ['--version'], stdout=subprocess.PIPE)
|
||||
except WindowsError:
|
||||
return (0, False)
|
||||
|
||||
is_clang = 'clang' in proc.communicate()[0].split('\n')[0]
|
||||
|
||||
proc = subprocess.Popen(CC.split() + ['-dumpversion'], stdout=subprocess.PIPE)
|
||||
version = tuple(map(int, proc.communicate()[0].split('.')))
|
||||
|
||||
return (version, is_clang)
|
||||
|
||||
|
||||
def configure_arm(o):
|
||||
# V8 on ARM requires that armv7 is set. CPU Model detected by
|
||||
# the presence of __ARM_ARCH_7__ and the like defines in compiler
|
||||
if options.arm_float_abi:
|
||||
hard_float = options.arm_float_abi == 'hard'
|
||||
else:
|
||||
hard_float = arm_hard_float_abi()
|
||||
o['variables']['v8_use_arm_eabi_hardfloat'] = b(hard_float)
|
||||
|
||||
armv7 = is_arch_armv7()
|
||||
if armv7:
|
||||
# CHECKME VFPv3 implies ARMv7+ but is the reverse true as well?
|
||||
o['variables']['arm_fpu'] = 'vfpv3'
|
||||
o['variables']['arm_neon'] = 0
|
||||
o['variables']['armv7'] = int(armv7)
|
||||
|
||||
|
||||
def configure_node(o):
|
||||
# TODO add gdb
|
||||
o['variables']['v8_no_strict_aliasing'] = 1 # work around compiler bugs
|
||||
o['variables']['node_prefix'] = os.path.expanduser(options.prefix or '')
|
||||
o['variables']['node_install_npm'] = b(not options.without_npm)
|
||||
o['variables']['node_install_waf'] = b(not options.without_waf)
|
||||
o['variables']['node_unsafe_optimizations'] = (
|
||||
1 if options.unsafe_optimizations else 0)
|
||||
o['default_configuration'] = 'Debug' if options.debug else 'Release'
|
||||
|
||||
host_arch = host_arch_win() if os.name == 'nt' else host_arch_cc()
|
||||
target_arch = options.dest_cpu or host_arch
|
||||
o['variables']['host_arch'] = host_arch
|
||||
o['variables']['target_arch'] = target_arch
|
||||
|
||||
if target_arch == 'arm':
|
||||
configure_arm(o)
|
||||
|
||||
cc_version, is_clang = compiler_version()
|
||||
o['variables']['clang'] = 1 if is_clang else 0
|
||||
|
||||
if not is_clang and cc_version != 0:
|
||||
o['variables']['gcc_version'] = 10 * cc_version[0] + cc_version[1]
|
||||
|
||||
# clang has always supported -fvisibility=hidden, right?
|
||||
if not is_clang and cc_version < (4,0,0):
|
||||
o['variables']['visibility'] = ''
|
||||
|
||||
# By default, enable DTrace on SunOS systems. Don't allow it on other
|
||||
# systems, since it won't work. (The MacOS build process is different than
|
||||
# SunOS, and we haven't implemented it.)
|
||||
if sys.platform.startswith('sunos'):
|
||||
o['variables']['node_use_dtrace'] = b(not options.without_dtrace)
|
||||
elif b(options.with_dtrace) == 'true':
|
||||
raise Exception('DTrace is currently only supported on SunOS systems.')
|
||||
else:
|
||||
o['variables']['node_use_dtrace'] = 'false'
|
||||
|
||||
if options.no_ifaddrs:
|
||||
o['defines'] += ['SUNOS_NO_IFADDRS']
|
||||
|
||||
# By default, enable ETW on Windows.
|
||||
if sys.platform.startswith('win32'):
|
||||
o['variables']['node_use_etw'] = b(not options.without_etw);
|
||||
elif b(options.with_etw) == 'true':
|
||||
raise Exception('ETW is only supported on Windows.')
|
||||
else:
|
||||
o['variables']['node_use_etw'] = 'false'
|
||||
|
||||
if options.tag:
|
||||
o['variables']['node_tag'] = '-' + options.tag
|
||||
else:
|
||||
o['variables']['node_tag'] = ''
|
||||
|
||||
|
||||
def configure_libz(o):
|
||||
o['variables']['node_shared_zlib'] = b(options.shared_zlib)
|
||||
|
||||
# assume shared_zlib if one of these is set?
|
||||
if options.shared_zlib_libpath:
|
||||
o['libraries'] += ['-L%s' % options.shared_zlib_libpath]
|
||||
if options.shared_zlib_libname:
|
||||
o['libraries'] += ['-l%s' % options.shared_zlib_libname]
|
||||
elif options.shared_zlib:
|
||||
o['libraries'] += ['-lz']
|
||||
if options.shared_zlib_includes:
|
||||
o['include_dirs'] += [options.shared_zlib_includes]
|
||||
|
||||
|
||||
def configure_v8(o):
|
||||
o['variables']['v8_use_snapshot'] = b(not options.without_snapshot)
|
||||
o['variables']['node_shared_v8'] = b(options.shared_v8)
|
||||
|
||||
# assume shared_v8 if one of these is set?
|
||||
if options.shared_v8_libpath:
|
||||
o['libraries'] += ['-L%s' % options.shared_v8_libpath]
|
||||
if options.shared_v8_libname:
|
||||
o['libraries'] += ['-l%s' % options.shared_v8_libname]
|
||||
elif options.shared_v8:
|
||||
o['libraries'] += ['-lv8']
|
||||
if options.shared_v8_includes:
|
||||
o['include_dirs'] += [options.shared_v8_includes]
|
||||
|
||||
|
||||
def configure_openssl(o):
|
||||
o['variables']['node_use_openssl'] = b(not options.without_ssl)
|
||||
o['variables']['node_shared_openssl'] = b(options.shared_openssl)
|
||||
|
||||
if options.without_ssl:
|
||||
return
|
||||
|
||||
if options.no_ssl2:
|
||||
o['defines'] += ['OPENSSL_NO_SSL2=1']
|
||||
|
||||
if options.shared_openssl:
|
||||
(libs, cflags) = pkg_config('openssl') or ('-lssl -lcrypto', '')
|
||||
|
||||
if options.shared_openssl_libpath:
|
||||
o['libraries'] += ['-L%s' % options.shared_openssl_libpath]
|
||||
|
||||
if options.shared_openssl_libname:
|
||||
libnames = options.shared_openssl_libname.split(',')
|
||||
o['libraries'] += ['-l%s' % s for s in libnames]
|
||||
else:
|
||||
o['libraries'] += libs.split()
|
||||
|
||||
if options.shared_openssl_includes:
|
||||
o['include_dirs'] += [options.shared_openssl_includes]
|
||||
else:
|
||||
o['cflags'] += cflags.split()
|
||||
|
||||
|
||||
output = {
|
||||
'variables': {},
|
||||
'include_dirs': [],
|
||||
'libraries': [],
|
||||
'defines': [],
|
||||
'cflags': [],
|
||||
}
|
||||
|
||||
configure_node(output)
|
||||
configure_libz(output)
|
||||
configure_v8(output)
|
||||
configure_openssl(output)
|
||||
|
||||
# variables should be a root level element,
|
||||
# move everything else to target_defaults
|
||||
variables = output['variables']
|
||||
del output['variables']
|
||||
output = {
|
||||
'variables': variables,
|
||||
'target_defaults': output
|
||||
}
|
||||
pprint.pprint(output, indent=2)
|
||||
|
||||
def write(filename, data):
|
||||
filename = os.path.join(root_dir, filename)
|
||||
print "creating ", filename
|
||||
f = open(filename, 'w+')
|
||||
f.write(data)
|
||||
|
||||
write('config.gypi', "# Do not edit. Generated by the configure script.\n" +
|
||||
pprint.pformat(output, indent=2) + "\n")
|
||||
|
||||
write('config.mk', "# Do not edit. Generated by the configure script.\n" +
|
||||
("BUILDTYPE=%s\n" % ('Debug' if options.debug else 'Release')))
|
||||
|
||||
if os.name == 'nt':
|
||||
gyp_args = ['-f', 'msvs', '-G', 'msvs_version=2010']
|
||||
elif options.dest_os:
|
||||
gyp_args = ['-f', 'make-' + options.dest_os]
|
||||
else:
|
||||
gyp_args = ['-f', 'make']
|
||||
|
||||
subprocess.call([sys.executable, 'tools/gyp_node'] + gyp_args)
|
||||
|
||||
33
deps/coupling/Makefile
vendored
33
deps/coupling/Makefile
vendored
@@ -1,33 +0,0 @@
|
||||
# CFLAGS and LDFLAGS are for the users to override from the command line.
|
||||
CFLAGS = -g -I. -Wall -Werror -Wextra #-DNDEBUG=1
|
||||
LDFLAGS = -pthread
|
||||
|
||||
CC = gcc
|
||||
AR = ar
|
||||
RANLIB = ranlib
|
||||
|
||||
DEP = coupling.h
|
||||
SRC = coupling.c
|
||||
OBJ = ${SRC:.c=.o}
|
||||
|
||||
NAME=libcoupling
|
||||
OUTPUT_A=$(NAME).a
|
||||
|
||||
all: $(OUTPUT_A)
|
||||
|
||||
$(OUTPUT_A): $(OBJ)
|
||||
$(AR) cru $(OUTPUT_A) $(OBJ)
|
||||
$(RANLIB) $(OUTPUT_A)
|
||||
|
||||
.c.o:
|
||||
$(CC) -c ${CFLAGS} $<
|
||||
|
||||
${OBJ}: ${DEP}
|
||||
|
||||
test: test.c $(OUTPUT_A)
|
||||
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ test.c $(OUTPUT_A)
|
||||
|
||||
clean:
|
||||
rm -f $(OUTPUT_A) *.o test
|
||||
|
||||
.PHONY: all clean
|
||||
337
deps/coupling/coupling.c
vendored
337
deps/coupling/coupling.c
vendored
@@ -1,337 +0,0 @@
|
||||
/* Copyright (c) 2009 Ryan Dahl (ry@tinyclouds.org)
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include "coupling.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/uio.h>
|
||||
#include <sys/select.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
#ifdef PIPE_BUF
|
||||
# define BUFSIZE PIPE_BUF
|
||||
#else
|
||||
# define BUFSIZE 4096
|
||||
#endif
|
||||
|
||||
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
||||
|
||||
// ring buffer
|
||||
typedef struct {
|
||||
int head;
|
||||
int tail;
|
||||
int size;
|
||||
char buf[BUFSIZE];
|
||||
} ring_buffer;
|
||||
|
||||
static inline void
|
||||
ring_buffer_inspect (ring_buffer *ring)
|
||||
{
|
||||
printf("size %5d head %5d tail %5d\n", ring->size, ring->head, ring->tail);
|
||||
}
|
||||
|
||||
static inline void
|
||||
ring_buffer_init (ring_buffer *ring)
|
||||
{
|
||||
ring->head = 0;
|
||||
ring->tail = 0;
|
||||
ring->size = 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
ring_buffer_filled_p (ring_buffer *ring)
|
||||
{
|
||||
assert(BUFSIZE - (long)ring->size >= 0);
|
||||
return (BUFSIZE == ring->size);
|
||||
}
|
||||
|
||||
static inline int
|
||||
ring_buffer_empty_p (ring_buffer *ring)
|
||||
{
|
||||
return 0 == ring->size;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
ring_buffer_pull (ring_buffer *ring, int fd)
|
||||
{
|
||||
// DO NOT CALL WHEN FILLED
|
||||
assert(!ring_buffer_filled_p(ring));
|
||||
|
||||
struct iovec iov[2];
|
||||
int iovcnt = 1;
|
||||
|
||||
// Very tough logic. Can you follow? Barely can I.
|
||||
iov[0].iov_base = ring->buf + ring->tail;
|
||||
if (ring->tail < ring->head) {
|
||||
iov[0].iov_len = ring->head - ring->tail;
|
||||
} else {
|
||||
iov[0].iov_len = BUFSIZE - ring->tail;
|
||||
if (ring->head != 0) {
|
||||
iovcnt = 2;
|
||||
iov[1].iov_base = ring->buf;
|
||||
iov[1].iov_len = ring->head;
|
||||
}
|
||||
}
|
||||
|
||||
int r = readv(fd, iov, iovcnt);
|
||||
|
||||
if (r > 0) {
|
||||
ring->size += r;
|
||||
ring->tail = (ring->tail + r) % BUFSIZE;
|
||||
}
|
||||
assert(ring->size <= BUFSIZE);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
ring_buffer_push (ring_buffer *ring, int fd)
|
||||
{
|
||||
// DO NOT CALL WHEN EMPTY
|
||||
assert(!ring_buffer_empty_p(ring));
|
||||
|
||||
struct iovec iov[2];
|
||||
int iovcnt = 1;
|
||||
|
||||
iov[0].iov_base = ring->buf + ring->head;
|
||||
if (ring->head < ring->tail) {
|
||||
iov[0].iov_len = ring->tail - ring->head;
|
||||
} else {
|
||||
iov[0].iov_len = BUFSIZE - ring->head;
|
||||
if (ring->tail != 0) {
|
||||
iovcnt = 2;
|
||||
iov[1].iov_base = ring->buf;
|
||||
iov[1].iov_len = ring->tail;
|
||||
}
|
||||
}
|
||||
|
||||
int r = writev(fd, iov, iovcnt);
|
||||
|
||||
if (r > 0) {
|
||||
ring->size -= r;
|
||||
ring->head = (ring->head + r) % BUFSIZE;
|
||||
}
|
||||
assert(0 <= (long)ring->size);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static void
|
||||
pump (int is_pull, int pullfd, int pushfd)
|
||||
{
|
||||
int r;
|
||||
ring_buffer ring;
|
||||
fd_set readfds, writefds, exceptfds;
|
||||
|
||||
ring_buffer_init(&ring);
|
||||
|
||||
int maxfd;
|
||||
|
||||
while (pushfd >= 0 && (pullfd >= 0 || !ring_buffer_empty_p(&ring))) {
|
||||
FD_ZERO(&exceptfds);
|
||||
FD_ZERO(&readfds);
|
||||
FD_ZERO(&writefds);
|
||||
|
||||
maxfd = -1;
|
||||
|
||||
if (is_pull) {
|
||||
if (!ring_buffer_empty_p(&ring)) {
|
||||
maxfd = pushfd;
|
||||
FD_SET(pushfd, &exceptfds);
|
||||
FD_SET(pushfd, &writefds);
|
||||
}
|
||||
} else {
|
||||
if (pullfd >= 0) {
|
||||
if (!ring_buffer_filled_p(&ring)) {
|
||||
maxfd = pullfd;
|
||||
FD_SET(pullfd, &exceptfds);
|
||||
FD_SET(pullfd, &readfds);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (maxfd >= 0) {
|
||||
r = select(maxfd+1, &readfds, &writefds, &exceptfds, NULL);
|
||||
|
||||
if (r < 0 || (pullfd >= 0 && FD_ISSET(pushfd, &exceptfds))) {
|
||||
close(pushfd);
|
||||
close(pullfd);
|
||||
pushfd = pullfd = -1;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (pullfd >= 0 && FD_ISSET(pullfd, &exceptfds)) {
|
||||
close(pullfd);
|
||||
pullfd = -1;
|
||||
}
|
||||
|
||||
if (pullfd >= 0 && (is_pull || FD_ISSET(pullfd, &readfds))) {
|
||||
r = ring_buffer_pull(&ring, pullfd);
|
||||
if (r == 0) {
|
||||
/* eof */
|
||||
close(pullfd);
|
||||
pullfd = -1;
|
||||
|
||||
} else if (r < 0) {
|
||||
if (errno != EINTR && errno != EAGAIN) goto error;
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_pull || FD_ISSET(pushfd, &writefds)) {
|
||||
r = ring_buffer_push(&ring, pushfd);
|
||||
if (r < 0) {
|
||||
switch (errno) {
|
||||
case EINTR:
|
||||
case EAGAIN:
|
||||
continue;
|
||||
|
||||
case EPIPE:
|
||||
/* TODO catch SIGPIPE? */
|
||||
close(pushfd);
|
||||
close(pullfd);
|
||||
pushfd = pullfd = -1;
|
||||
return;
|
||||
|
||||
default:
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
close(pushfd);
|
||||
close(pullfd);
|
||||
return;
|
||||
|
||||
error:
|
||||
close(pushfd);
|
||||
close(pullfd);
|
||||
perror("(coupling) pump");
|
||||
}
|
||||
|
||||
static inline int
|
||||
set_nonblock (int fd)
|
||||
{
|
||||
int flags = fcntl(fd, F_GETFL, 0);
|
||||
if (flags == -1) return -1;
|
||||
|
||||
int r = fcntl(fd, F_SETFL, flags | O_NONBLOCK);
|
||||
if (r == -1) return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct coupling {
|
||||
int is_pull;
|
||||
int pullfd;
|
||||
int pushfd;
|
||||
int exposedfd;
|
||||
pthread_t tid;
|
||||
};
|
||||
|
||||
static void *
|
||||
pump_thread (void *data)
|
||||
{
|
||||
struct coupling *c = (struct coupling*)data;
|
||||
|
||||
pump(c->is_pull, c->pullfd, c->pushfd);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct coupling*
|
||||
create_coupling (int fd, int is_pull)
|
||||
{
|
||||
int pipefd[2];
|
||||
|
||||
struct coupling *c = malloc(sizeof(struct coupling));
|
||||
if (!c) return NULL;
|
||||
|
||||
int r = pipe(pipefd);
|
||||
if (r < 0) return NULL;
|
||||
|
||||
r = set_nonblock(pipefd[0]);
|
||||
if (r < 0) return NULL;
|
||||
assert(pipefd[0] >= 0);
|
||||
|
||||
r = set_nonblock(pipefd[1]);
|
||||
if (r < 0) return NULL;
|
||||
assert(pipefd[1] >= 0);
|
||||
|
||||
if (is_pull) {
|
||||
c->is_pull = 1;
|
||||
c->pullfd = fd;
|
||||
c->pushfd = pipefd[1];
|
||||
c->exposedfd = pipefd[0];
|
||||
} else {
|
||||
c->is_pull = 0;
|
||||
c->pushfd = fd;
|
||||
c->pullfd = pipefd[0];
|
||||
c->exposedfd = pipefd[1];
|
||||
}
|
||||
|
||||
r = pthread_create(&c->tid, NULL, pump_thread, c);
|
||||
if (r < 0) return NULL;
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
struct coupling*
|
||||
coupling_new_pull (int fd)
|
||||
{
|
||||
return create_coupling(fd, 1);
|
||||
}
|
||||
|
||||
struct coupling*
|
||||
coupling_new_push (int fd)
|
||||
{
|
||||
return create_coupling(fd, 0);
|
||||
}
|
||||
|
||||
int
|
||||
coupling_nonblocking_fd (struct coupling *c)
|
||||
{
|
||||
return c->exposedfd;
|
||||
}
|
||||
|
||||
void
|
||||
coupling_join (struct coupling *c)
|
||||
{
|
||||
int r = pthread_join(c->tid, NULL);
|
||||
assert(r == 0);
|
||||
}
|
||||
|
||||
void
|
||||
coupling_destroy (struct coupling *c)
|
||||
{
|
||||
close(c->is_pull ? c->pushfd : c->pullfd);
|
||||
free(c);
|
||||
}
|
||||
42
deps/coupling/coupling.h
vendored
42
deps/coupling/coupling.h
vendored
@@ -1,42 +0,0 @@
|
||||
/* Copyright (c) 2009 Ryan Dahl (ry@tinyclouds.org)
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#ifndef coupling_h
|
||||
#define coupling_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct coupling;
|
||||
|
||||
struct coupling* coupling_new_pull (int fd);
|
||||
struct coupling* coupling_new_push (int fd);
|
||||
int coupling_nonblocking_fd (struct coupling*);
|
||||
void coupling_join (struct coupling*);
|
||||
void coupling_destroy (struct coupling*);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
73
deps/coupling/test.c
vendored
73
deps/coupling/test.c
vendored
@@ -1,73 +0,0 @@
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/select.h>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include "coupling.h"
|
||||
|
||||
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
||||
#define CHUNKSIZE 44231
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
struct coupling *c = coupling_new_push(STDERR_FILENO);
|
||||
int stderr_fd = coupling_nonblocking_fd(c);
|
||||
|
||||
int size;
|
||||
if (argc == 2) {
|
||||
size = atoi(argv[1]);
|
||||
printf("size = %d\n", size);
|
||||
} else {
|
||||
printf("usage: ./test 123 2> stderr; wc -c stderr\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
char *msg = malloc(CHUNKSIZE);
|
||||
int i, r;
|
||||
for (i = 0; i < CHUNKSIZE; i++) {
|
||||
msg[i] = 'A' + i % 26;
|
||||
}
|
||||
|
||||
int written = 0;
|
||||
|
||||
fd_set writefds, exceptfds;
|
||||
|
||||
FD_ZERO(&exceptfds);
|
||||
FD_SET(stderr_fd, &exceptfds);
|
||||
|
||||
FD_ZERO(&writefds);
|
||||
FD_SET(stderr_fd, &writefds);
|
||||
|
||||
while (written < size) {
|
||||
r = select(stderr_fd+1, NULL, &writefds, &exceptfds, NULL);
|
||||
if (r < 0) {
|
||||
printf("test.c select(): %s\n", strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (FD_ISSET(stderr_fd, &exceptfds)) {
|
||||
printf("exception on stderr fd\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (FD_ISSET(stderr_fd, &writefds)) {
|
||||
r = write(stderr_fd, msg, MIN(size - written, CHUNKSIZE));
|
||||
if (r < 0 && errno != EAGAIN) {
|
||||
printf("test.c write(): %s\n", strerror(errno));
|
||||
exit(1);
|
||||
} else {
|
||||
written += r;
|
||||
printf("%d\n", written);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
close(stderr_fd);
|
||||
coupling_join(c);
|
||||
coupling_destroy(c);
|
||||
|
||||
return 0;
|
||||
}
|
||||
75
deps/evcom/Makefile
vendored
75
deps/evcom/Makefile
vendored
@@ -1,75 +0,0 @@
|
||||
# Define EVDIR=/foo/bar if your libev header and library files are in
|
||||
# /foo/bar/include and /foo/bar/lib directories.
|
||||
EVDIR=$(HOME)/local/libev
|
||||
|
||||
# Define GNUTLSDIR=/foo/bar if your gnutls header and library files are in
|
||||
# /foo/bar/include and /foo/bar/lib directories.
|
||||
#
|
||||
# Comment out the following line to disable TLS
|
||||
GNUTLSDIR=/usr
|
||||
|
||||
# CFLAGS and LDFLAGS are for the users to override from the command line.
|
||||
CFLAGS = -g -I. -Wall -Werror -Wextra #-DNDEBUG=1
|
||||
LDFLAGS =
|
||||
|
||||
CC = gcc
|
||||
AR = ar
|
||||
RANLIB = ranlib
|
||||
|
||||
ifdef EVDIR
|
||||
CFLAGS += -I$(EVDIR)/include
|
||||
LDFLAGS += -L$(EVDIR)/lib
|
||||
endif
|
||||
|
||||
LDFLAGS += -lev
|
||||
|
||||
ifdef GNUTLSDIR
|
||||
CFLAGS += -I$(GNUTLSDIR)/include -DEVCOM_HAVE_GNUTLS=1
|
||||
LDFLAGS += -L$(GNUTLSDIR)/lib
|
||||
LDFLAGS += -lgnutls
|
||||
endif
|
||||
|
||||
DEP = evcom.h
|
||||
SRC = evcom.c
|
||||
OBJ = ${SRC:.c=.o}
|
||||
|
||||
NAME=libevcom
|
||||
OUTPUT_A=$(NAME).a
|
||||
|
||||
all: $(OUTPUT_A) test/test test/echo
|
||||
|
||||
$(OUTPUT_A): $(OBJ)
|
||||
$(AR) cru $(OUTPUT_A) $(OBJ)
|
||||
$(RANLIB) $(OUTPUT_A)
|
||||
|
||||
.c.o:
|
||||
$(CC) -c ${CFLAGS} $<
|
||||
|
||||
${OBJ}: ${DEP}
|
||||
|
||||
FAIL=ruby -e 'puts "\033[1;31m FAIL\033[m"'
|
||||
PASS=ruby -e 'puts "\033[1;32m PASS\033[m"'
|
||||
|
||||
test: test/test test/echo test/timeout.rb
|
||||
@echo test.c
|
||||
@test/test > /dev/null && $(PASS) || $(FAIL)
|
||||
@echo timeout.rb
|
||||
@test/timeout.rb
|
||||
|
||||
test/test: test/test.c $(OUTPUT_A)
|
||||
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ test/test.c $(OUTPUT_A)
|
||||
|
||||
test/echo: test/echo.c $(OUTPUT_A)
|
||||
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ test/echo.c $(OUTPUT_A)
|
||||
|
||||
send_states.png: send_states.dot
|
||||
dot -Tpng -o send_states.png send_states.dot
|
||||
|
||||
recv_states.png: recv_states.dot
|
||||
dot -Tpng -o recv_states.png recv_states.dot
|
||||
|
||||
clean:
|
||||
rm -rf test/test test/echo
|
||||
rm -f $(OUTPUT_A) *.o
|
||||
|
||||
.PHONY: all clean test
|
||||
1571
deps/evcom/evcom.c
vendored
1571
deps/evcom/evcom.c
vendored
File diff suppressed because it is too large
Load Diff
259
deps/evcom/evcom.h
vendored
259
deps/evcom/evcom.h
vendored
@@ -1,259 +0,0 @@
|
||||
/* Copyright (c) 2008,2009 Ryan Dahl
|
||||
*
|
||||
* evcom_queue comes from Nginx, ngx_queue.h
|
||||
* Copyright (C) 2002-2009 Igor Sysoev
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
#include <netdb.h>
|
||||
#include <ev.h>
|
||||
#include <stddef.h> /* offsetof() */
|
||||
|
||||
#ifndef evcom_h
|
||||
#define evcom_h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef EVCOM_HAVE_GNUTLS
|
||||
# define EVCOM_HAVE_GNUTLS 0
|
||||
#endif
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
# include <gnutls/gnutls.h>
|
||||
#endif
|
||||
|
||||
/* The maximum evcom_stream will try to read in one callback */
|
||||
#ifndef EVCOM_CHUNKSIZE
|
||||
# define EVCOM_CHUNKSIZE (8*1024)
|
||||
#endif
|
||||
|
||||
/* flags for stream and server */
|
||||
#define EVCOM_ATTACHED 0x0001
|
||||
#define EVCOM_LISTENING 0x0002
|
||||
#define EVCOM_CONNECTED 0x0004
|
||||
#define EVCOM_SECURE 0x0008
|
||||
#define EVCOM_DUPLEX 0x0010
|
||||
#define EVCOM_GOT_CLOSE 0x0020
|
||||
#define EVCOM_PAUSED 0x0040
|
||||
#define EVCOM_READABLE 0x0080
|
||||
#define EVCOM_WRITABLE 0x0100
|
||||
#define EVCOM_TOO_MANY_CONN 0x0200
|
||||
|
||||
enum evcom_stream_state { EVCOM_INITIALIZED
|
||||
, EVCOM_CONNECTING
|
||||
, EVCOM_CONNECTED_RW /* read write */
|
||||
, EVCOM_CONNECTED_RO /* read only */
|
||||
, EVCOM_CONNECTED_WO /* write only */
|
||||
, EVCOM_CLOSING
|
||||
, EVCOM_CLOSED
|
||||
};
|
||||
|
||||
typedef struct evcom_queue {
|
||||
struct evcom_queue *prev;
|
||||
struct evcom_queue *next;
|
||||
} evcom_queue;
|
||||
|
||||
typedef struct evcom_buf {
|
||||
/* public */
|
||||
char *base;
|
||||
size_t len;
|
||||
void (*release) (struct evcom_buf *); /* called when oi is done with the object */
|
||||
void *data;
|
||||
|
||||
/* private */
|
||||
size_t written;
|
||||
evcom_queue queue;
|
||||
} evcom_buf;
|
||||
|
||||
#if EV_MULTIPLICITY
|
||||
# define EVCOM_LOOP struct ev_loop *loop;
|
||||
#else
|
||||
# define EVCOM_LOOP
|
||||
#endif
|
||||
|
||||
#define EVCOM_DESCRIPTOR(type) \
|
||||
/* private */ unsigned int flags; \
|
||||
/* private */ int (*action) (struct evcom_descriptor*); \
|
||||
/* read-only */ int errorno; \
|
||||
/* read-only */ int fd; \
|
||||
/* read-only */ EVCOM_LOOP \
|
||||
/* public */ void *data; \
|
||||
/* public */ void (*on_close) (struct type*);
|
||||
|
||||
/* abstract base class */
|
||||
typedef struct evcom_descriptor {
|
||||
EVCOM_DESCRIPTOR(evcom_descriptor)
|
||||
} evcom_descriptor;
|
||||
|
||||
typedef struct evcom_reader {
|
||||
EVCOM_DESCRIPTOR(evcom_reader)
|
||||
ev_io read_watcher; /* private */
|
||||
void (*on_read) (struct evcom_reader*, const void* buf, size_t len); /* public */
|
||||
} evcom_reader;
|
||||
|
||||
typedef struct evcom_writer {
|
||||
EVCOM_DESCRIPTOR(evcom_writer)
|
||||
ev_io write_watcher; /* private */
|
||||
evcom_queue out; /* private */
|
||||
} evcom_writer;
|
||||
|
||||
typedef struct evcom_stream {
|
||||
/* PRIVATE */
|
||||
EVCOM_LOOP
|
||||
int errorno;
|
||||
unsigned int flags;
|
||||
evcom_queue out;
|
||||
ev_io read_watcher;
|
||||
ev_io write_watcher;
|
||||
int (*send_action) (struct evcom_stream*);
|
||||
int (*recv_action) (struct evcom_stream*);
|
||||
ev_timer timeout_watcher;
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
gnutls_session_t session;
|
||||
#endif
|
||||
|
||||
/* READ-ONLY */
|
||||
int recvfd;
|
||||
int sendfd;
|
||||
struct evcom_server *server;
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
int gnutls_errorno;
|
||||
#endif
|
||||
|
||||
/* PUBLIC */
|
||||
void (*on_connect) (struct evcom_stream *);
|
||||
void (*on_timeout) (struct evcom_stream *);
|
||||
void (*on_read) (struct evcom_stream *, const void* buf, size_t len);
|
||||
void (*on_close) (struct evcom_stream *);
|
||||
void *data;
|
||||
} evcom_stream;
|
||||
|
||||
typedef struct evcom_server {
|
||||
EVCOM_DESCRIPTOR(evcom_server)
|
||||
|
||||
/* PRIVATE */
|
||||
ev_io watcher;
|
||||
|
||||
/* PUBLIC */
|
||||
struct evcom_stream*
|
||||
(*on_connection)(struct evcom_server *, struct sockaddr *remote_addr);
|
||||
} evcom_server;
|
||||
|
||||
/* Highly recommended to ignore SIGPIPE! */
|
||||
void evcom_ignore_sigpipe (void);
|
||||
|
||||
void evcom_reader_init (evcom_reader*);
|
||||
void evcom_reader_set (evcom_reader*, int fd);
|
||||
void evcom_reader_attach (EV_P_ evcom_reader*);
|
||||
void evcom_reader_detach (evcom_reader*);
|
||||
void evcom_reader_close (evcom_reader*);
|
||||
|
||||
void evcom_writer_init (evcom_writer*);
|
||||
void evcom_writer_set (evcom_writer*, int fd);
|
||||
void evcom_writer_attach (EV_P_ evcom_writer*);
|
||||
void evcom_writer_detach (evcom_writer*);
|
||||
void evcom_writer_write (evcom_writer*, const char *str, size_t len);
|
||||
void evcom_writer_close (evcom_writer*);
|
||||
|
||||
void evcom_server_init (evcom_server *);
|
||||
int evcom_server_listen (evcom_server *, struct sockaddr *address, int backlog);
|
||||
void evcom_server_attach (EV_P_ evcom_server *);
|
||||
void evcom_server_detach (evcom_server *);
|
||||
void evcom_server_close (evcom_server *);
|
||||
|
||||
void evcom_stream_init (evcom_stream *);
|
||||
|
||||
int evcom_stream_pair (evcom_stream *a, evcom_stream *b);
|
||||
int evcom_stream_connect (evcom_stream *, struct sockaddr *address);
|
||||
void evcom_stream_assign_fds (evcom_stream *, int recvfd, int sendfd);
|
||||
|
||||
void evcom_stream_attach (EV_P_ evcom_stream *);
|
||||
void evcom_stream_detach (evcom_stream *);
|
||||
void evcom_stream_read_resume (evcom_stream *);
|
||||
void evcom_stream_read_pause (evcom_stream *);
|
||||
void evcom_stream_reset_timeout (evcom_stream *, float timeout);
|
||||
void evcom_stream_set_no_delay (evcom_stream *, int no_delay);
|
||||
void evcom_stream_write (evcom_stream *, const char *str, size_t len);
|
||||
/* Once the write buffer is drained, evcom_stream_close will shutdown the
|
||||
* writing end of the stream and will close the read end once the server
|
||||
* replies with an EOF.
|
||||
*/
|
||||
void evcom_stream_close (evcom_stream *);
|
||||
|
||||
/* Will not wait for the write queue to complete. Closes both directions */
|
||||
void evcom_stream_force_close (evcom_stream *);
|
||||
|
||||
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
/* Tells the stream to use transport layer security (SSL). evcom_stream does
|
||||
* not want to make any decisions about security requirements, so the
|
||||
* majoirty of GnuTLS configuration is left to the user. Only the transport
|
||||
* layer of GnuTLS is controlled by evcom_stream. That is, do not use
|
||||
* gnutls_transport_* functions. Do use the rest of GnuTLS's API.
|
||||
*/
|
||||
void evcom_stream_set_secure_session (evcom_stream *, gnutls_session_t);
|
||||
#endif
|
||||
|
||||
enum evcom_stream_state evcom_stream_state (evcom_stream *stream);
|
||||
|
||||
evcom_buf* evcom_buf_new (const char* base, size_t len);
|
||||
evcom_buf* evcom_buf_new2 (size_t len);
|
||||
|
||||
EV_INLINE void
|
||||
evcom_queue_init (evcom_queue *q)
|
||||
{
|
||||
q->prev = q;
|
||||
q->next = q;
|
||||
}
|
||||
|
||||
EV_INLINE void
|
||||
evcom_queue_insert_head (evcom_queue *h, evcom_queue *x)
|
||||
{
|
||||
(x)->next = (h)->next;
|
||||
(x)->next->prev = x;
|
||||
(x)->prev = h;
|
||||
(h)->next = x;
|
||||
}
|
||||
|
||||
EV_INLINE void
|
||||
evcom_queue_remove (evcom_queue *x)
|
||||
{
|
||||
(x)->next->prev = (x)->prev;
|
||||
(x)->prev->next = (x)->next;
|
||||
#ifndef NDEBUG
|
||||
(x)->prev = NULL;
|
||||
(x)->next = NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
#define evcom_queue_empty(h) (h == (h)->prev)
|
||||
#define evcom_queue_head(h) (h)->next
|
||||
#define evcom_queue_last(h) (h)->prev
|
||||
#define evcom_queue_data(q, type, link) \
|
||||
(type *) ((unsigned char *) q - offsetof(type, link))
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* evcom_h */
|
||||
37
deps/evcom/recv_states.dot
vendored
37
deps/evcom/recv_states.dot
vendored
@@ -1,37 +0,0 @@
|
||||
strict digraph recv_states {
|
||||
start [peripheries=2];
|
||||
end [peripheries=2];
|
||||
handshake;
|
||||
recv_data;
|
||||
wait_for_resume;
|
||||
wait_for_close;
|
||||
close_one;
|
||||
close_both;
|
||||
|
||||
node [label="", shape="box", height=0.1, width=0.1];
|
||||
close;
|
||||
|
||||
|
||||
|
||||
start -> handshake [label="tls"];
|
||||
start -> recv_data;
|
||||
|
||||
handshake -> close [label="error"];
|
||||
handshake -> recv_data;
|
||||
|
||||
recv_data -> handshake [label="rehandshake"];
|
||||
recv_data -> wait_for_resume [label="pause"];
|
||||
recv_data -> wait_for_close [label="eof"];
|
||||
recv_data -> close [label="error"];
|
||||
|
||||
wait_for_resume -> recv_data;
|
||||
|
||||
wait_for_close -> close;
|
||||
|
||||
close -> close_one [label="duplex"];
|
||||
close -> close_both;
|
||||
|
||||
close_one -> end;
|
||||
close_both -> end;
|
||||
|
||||
}
|
||||
65
deps/evcom/send_states.dot
vendored
65
deps/evcom/send_states.dot
vendored
@@ -1,65 +0,0 @@
|
||||
strict digraph send_states {
|
||||
start [peripheries=2];
|
||||
end [peripheries=2];
|
||||
connection_established;
|
||||
handshake;
|
||||
send_data;
|
||||
shutdown;
|
||||
gnutls_bye;
|
||||
close_one;
|
||||
close_both;
|
||||
|
||||
wait_for_connect;
|
||||
wait_for_buf;
|
||||
wait_for_eof;
|
||||
|
||||
node [label="", shape="box", height=0.1, width=0.1];
|
||||
close;
|
||||
drain;
|
||||
hangup;
|
||||
hangup_unsecure;
|
||||
|
||||
|
||||
|
||||
start -> wait_for_connect [label="duplex"];
|
||||
start -> connection_established;
|
||||
|
||||
wait_for_connect -> connection_established;
|
||||
wait_for_connect -> close [label="error"];
|
||||
|
||||
connection_established -> handshake [label="tls"];
|
||||
connection_established -> send_data;
|
||||
|
||||
handshake -> close [label="error"];
|
||||
handshake -> send_data;
|
||||
|
||||
send_data -> close [label="error"];
|
||||
send_data -> drain [label="drain"];
|
||||
|
||||
drain -> wait_for_buf;
|
||||
drain -> hangup [label="got_close"];
|
||||
|
||||
wait_for_buf -> send_data;
|
||||
wait_for_buf -> drain [label="empty_buf"];
|
||||
|
||||
hangup -> gnutls_bye [label="tls"];
|
||||
hangup -> hangup_unsecure;
|
||||
|
||||
gnutls_bye -> wait_for_eof;
|
||||
gnutls_bye -> close [label="error"];
|
||||
|
||||
hangup_unsecure -> shutdown [label="duplex"];
|
||||
hangup_unsecure -> close_one;
|
||||
|
||||
shutdown -> wait_for_eof;
|
||||
shutdown -> close [label="error"];
|
||||
|
||||
wait_for_eof -> close_one;
|
||||
close_one -> wait_for_eof [label="readable"];
|
||||
|
||||
close -> close_both;
|
||||
close -> close_one [label="duplex"];
|
||||
|
||||
close_both -> end;
|
||||
close_one -> end;
|
||||
}
|
||||
100
deps/evcom/test/echo.c
vendored
100
deps/evcom/test/echo.c
vendored
@@ -1,100 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
|
||||
#include <ev.h>
|
||||
#include <evcom.h>
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
# include <gnutls/gnutls.h>
|
||||
#endif
|
||||
|
||||
#define HOST "127.0.0.1"
|
||||
#define SOCKFILE "/tmp/oi.sock"
|
||||
#define PORT 5000
|
||||
|
||||
static int nconnections;
|
||||
|
||||
static void
|
||||
on_peer_close (evcom_stream *stream)
|
||||
{
|
||||
assert(stream->errorno == 0);
|
||||
//printf("server connection closed\n");
|
||||
free(stream);
|
||||
}
|
||||
|
||||
static void
|
||||
on_peer_timeout (evcom_stream *stream)
|
||||
{
|
||||
assert(stream);
|
||||
fprintf(stderr, "peer connection timeout\n");
|
||||
assert(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// timeout must match the timeout in timeout.rb
|
||||
#define TIMEOUT 5.0
|
||||
|
||||
static void
|
||||
on_peer_read (evcom_stream *stream, const void *base, size_t len)
|
||||
{
|
||||
if(len == 0) return;
|
||||
|
||||
evcom_stream_write(stream, base, len);
|
||||
}
|
||||
|
||||
static evcom_stream*
|
||||
on_server_connection (evcom_server *server, struct sockaddr *addr)
|
||||
{
|
||||
assert(server);
|
||||
assert(addr);
|
||||
|
||||
evcom_stream *stream = malloc(sizeof(evcom_stream));
|
||||
evcom_stream_init(stream);
|
||||
stream->on_read = on_peer_read;
|
||||
stream->on_close = on_peer_close;
|
||||
stream->on_timeout = on_peer_timeout;
|
||||
evcom_stream_reset_timeout(stream, TIMEOUT);
|
||||
|
||||
nconnections++;
|
||||
|
||||
|
||||
//printf("on server connection\n");
|
||||
|
||||
return stream;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
int r;
|
||||
evcom_server server;
|
||||
|
||||
//printf("sizeof(evcom_server): %d\n", sizeof(evcom_server));
|
||||
//printf("sizeof(evcom_stream): %d\n", sizeof(evcom_stream));
|
||||
|
||||
evcom_server_init(&server);
|
||||
server.on_connection = on_server_connection;
|
||||
|
||||
struct sockaddr_in address;
|
||||
memset(&address, 0, sizeof(struct sockaddr_in));
|
||||
address.sin_family = AF_INET;
|
||||
address.sin_port = htons(PORT);
|
||||
address.sin_addr.s_addr = INADDR_ANY;
|
||||
|
||||
r = evcom_server_listen(&server, (struct sockaddr*)&address, 10);
|
||||
assert(r == 0);
|
||||
evcom_server_attach(EV_DEFAULT_ &server);
|
||||
|
||||
ev_loop(EV_DEFAULT_ 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
892
deps/evcom/test/test.c
vendored
892
deps/evcom/test/test.c
vendored
@@ -1,892 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include <ev.h>
|
||||
#include <evcom.h>
|
||||
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
# include <gnutls/gnutls.h>
|
||||
#endif
|
||||
|
||||
#undef MAX
|
||||
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
||||
|
||||
#undef MIN
|
||||
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
||||
|
||||
#define MARK_PROGRESS(c,cur,max) \
|
||||
if (cur % (MAX(max,50)/50) == 0) write(STDERR_FILENO, c, 1)
|
||||
|
||||
#define SOCKFILE "/tmp/oi.sock"
|
||||
#define PORT 5000
|
||||
|
||||
static evcom_server server;
|
||||
static int nconnections;
|
||||
static int use_tls;
|
||||
static int got_server_close;
|
||||
|
||||
static void
|
||||
common_on_server_close (evcom_server *s)
|
||||
{
|
||||
printf("server on_close\n");
|
||||
assert(s == &server);
|
||||
assert(s->errorno == 0);
|
||||
got_server_close = 1;
|
||||
evcom_server_detach(s);
|
||||
}
|
||||
|
||||
static void
|
||||
common_on_peer_close (evcom_stream *stream)
|
||||
{
|
||||
assert(EVCOM_CLOSED == evcom_stream_state(stream));
|
||||
assert(stream->errorno == 0);
|
||||
printf("server connection closed\n");
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
assert(stream->gnutls_errorno == 0);
|
||||
if (use_tls) gnutls_deinit(stream->session);
|
||||
#endif
|
||||
evcom_stream_detach(stream);
|
||||
free(stream);
|
||||
}
|
||||
|
||||
static void
|
||||
common_on_client_timeout (evcom_stream *stream)
|
||||
{
|
||||
assert(stream);
|
||||
printf("client connection timeout\n");
|
||||
}
|
||||
|
||||
static void
|
||||
common_on_peer_timeout (evcom_stream *stream)
|
||||
{
|
||||
assert(stream);
|
||||
fprintf(stderr, "peer connection timeout\n");
|
||||
assert(0);
|
||||
}
|
||||
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
#define DH_BITS 768
|
||||
static gnutls_anon_server_credentials_t server_credentials;
|
||||
const int kx_prio[] = { GNUTLS_KX_ANON_DH, 0 };
|
||||
static gnutls_dh_params_t dh_params;
|
||||
|
||||
void anon_tls_server (evcom_stream *stream)
|
||||
{
|
||||
gnutls_session_t session;
|
||||
stream->data = session;
|
||||
|
||||
int r = gnutls_init(&session, GNUTLS_SERVER);
|
||||
assert(r == 0);
|
||||
gnutls_set_default_priority(session);
|
||||
gnutls_kx_set_priority (session, kx_prio);
|
||||
gnutls_credentials_set(session, GNUTLS_CRD_ANON, server_credentials);
|
||||
gnutls_dh_set_prime_bits(session, DH_BITS);
|
||||
|
||||
evcom_stream_set_secure_session(stream, session);
|
||||
}
|
||||
|
||||
void anon_tls_client (evcom_stream *stream)
|
||||
{
|
||||
gnutls_session_t client_session;
|
||||
gnutls_anon_client_credentials_t client_credentials;
|
||||
|
||||
gnutls_anon_allocate_client_credentials (&client_credentials);
|
||||
gnutls_init(&client_session, GNUTLS_CLIENT);
|
||||
gnutls_set_default_priority(client_session);
|
||||
gnutls_kx_set_priority(client_session, kx_prio);
|
||||
/* Need to enable anonymous KX specifically. */
|
||||
gnutls_credentials_set(client_session, GNUTLS_CRD_ANON, client_credentials);
|
||||
|
||||
evcom_stream_set_secure_session(stream, client_session);
|
||||
assert(stream->flags & EVCOM_SECURE);
|
||||
}
|
||||
|
||||
#endif // EVCOM_HAVE_GNUTLS
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define PING "PING"
|
||||
#define PONG "PONG"
|
||||
#define EXCHANGES 500
|
||||
#define PINGPONG_TIMEOUT 5.0
|
||||
|
||||
static int successful_ping_count;
|
||||
|
||||
static void
|
||||
pingpong_on_peer_read (evcom_stream *stream, const void *base, size_t len)
|
||||
{
|
||||
if (len == 0) {
|
||||
evcom_stream_close(stream);
|
||||
return;
|
||||
}
|
||||
|
||||
char buf[2000];
|
||||
strncpy(buf, base, len);
|
||||
buf[len] = 0;
|
||||
printf("server got message: %s\n", buf);
|
||||
|
||||
evcom_stream_write(stream, PONG, sizeof PONG);
|
||||
}
|
||||
|
||||
static void
|
||||
pingpong_on_client_close (evcom_stream *stream)
|
||||
{
|
||||
assert(EVCOM_CLOSED == evcom_stream_state(stream));
|
||||
assert(stream);
|
||||
printf("client connection closed\n");
|
||||
evcom_server_close(&server);
|
||||
evcom_stream_detach(stream);
|
||||
}
|
||||
|
||||
static evcom_stream*
|
||||
pingpong_on_server_connection (evcom_server *_server, struct sockaddr *addr)
|
||||
{
|
||||
assert(_server == &server);
|
||||
assert(addr);
|
||||
|
||||
evcom_stream *stream = malloc(sizeof(evcom_stream));
|
||||
evcom_stream_init(stream);
|
||||
stream->on_read = pingpong_on_peer_read;
|
||||
stream->on_close = common_on_peer_close;
|
||||
stream->on_timeout = common_on_peer_timeout;
|
||||
evcom_stream_reset_timeout(stream, PINGPONG_TIMEOUT);
|
||||
|
||||
assert(EVCOM_INITIALIZED == evcom_stream_state(stream));
|
||||
|
||||
nconnections++;
|
||||
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
if (use_tls) anon_tls_server(stream);
|
||||
#endif
|
||||
|
||||
printf("on server connection\n");
|
||||
|
||||
return stream;
|
||||
}
|
||||
|
||||
static void
|
||||
pingpong_on_client_connect (evcom_stream *stream)
|
||||
{
|
||||
printf("client connected. sending ping\n");
|
||||
evcom_stream_write(stream, PING, sizeof PING);
|
||||
assert(EVCOM_CONNECTED_RW == evcom_stream_state(stream));
|
||||
}
|
||||
|
||||
static void
|
||||
pingpong_on_client_read (evcom_stream *stream, const void *base, size_t len)
|
||||
{
|
||||
if(len == 0) {
|
||||
evcom_stream_close(stream);
|
||||
return;
|
||||
}
|
||||
|
||||
assert(len = strlen(PONG));
|
||||
|
||||
char buf[len+1];
|
||||
strncpy(buf, base, len);
|
||||
buf[len] = 0;
|
||||
printf("client got message: %s\n", buf);
|
||||
|
||||
assert(strcmp(buf, PONG) == 0);
|
||||
|
||||
if (++successful_ping_count > EXCHANGES) {
|
||||
evcom_stream_close(stream);
|
||||
return;
|
||||
}
|
||||
|
||||
MARK_PROGRESS(".", successful_ping_count, EXCHANGES);
|
||||
|
||||
evcom_stream_write(stream, PING, sizeof PING);
|
||||
}
|
||||
|
||||
int
|
||||
pingpong (struct sockaddr *address)
|
||||
{
|
||||
int r;
|
||||
evcom_stream client;
|
||||
|
||||
successful_ping_count = 0;
|
||||
nconnections = 0;
|
||||
got_server_close = 0;
|
||||
|
||||
evcom_server_init(&server);
|
||||
server.on_connection = pingpong_on_server_connection;
|
||||
server.on_close = common_on_server_close;
|
||||
|
||||
r = evcom_server_listen(&server, address, 10);
|
||||
assert(r == 0);
|
||||
evcom_server_attach(EV_DEFAULT_ &server);
|
||||
|
||||
evcom_stream_init(&client);
|
||||
client.on_read = pingpong_on_client_read;
|
||||
client.on_connect = pingpong_on_client_connect;
|
||||
client.on_close = pingpong_on_client_close;
|
||||
client.on_timeout = common_on_client_timeout;
|
||||
evcom_stream_reset_timeout(&client, PINGPONG_TIMEOUT);
|
||||
|
||||
assert(EVCOM_INITIALIZED == evcom_stream_state(&client));
|
||||
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
if (use_tls) anon_tls_client(&client);
|
||||
#endif
|
||||
|
||||
r = evcom_stream_connect(&client, address);
|
||||
assert(r == 0 && "problem connecting");
|
||||
evcom_stream_attach(EV_DEFAULT_ &client);
|
||||
|
||||
ev_loop(EV_DEFAULT_ 0);
|
||||
|
||||
printf("successful_ping_count = %d\n", successful_ping_count);
|
||||
assert(successful_ping_count == EXCHANGES + 1);
|
||||
assert(nconnections == 1);
|
||||
assert(got_server_close);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#define NCONN 50
|
||||
#define CONNINT_TIMEOUT 10.0
|
||||
|
||||
static void
|
||||
send_bye_and_close(evcom_stream *stream, const void *base, size_t len)
|
||||
{
|
||||
assert(base);
|
||||
assert(len == 0);
|
||||
evcom_stream_write(stream, "BYE", 3);
|
||||
printf("server wrote bye\n");
|
||||
evcom_stream_close(stream);
|
||||
}
|
||||
|
||||
static evcom_stream*
|
||||
connint_on_connection(evcom_server *_server, struct sockaddr *addr)
|
||||
{
|
||||
assert(_server == &server);
|
||||
assert(addr);
|
||||
|
||||
evcom_stream *stream = malloc(sizeof(evcom_stream));
|
||||
evcom_stream_init(stream);
|
||||
stream->on_read = send_bye_and_close;
|
||||
stream->on_close = common_on_peer_close;
|
||||
stream->on_timeout = common_on_peer_timeout;
|
||||
evcom_stream_reset_timeout(stream, CONNINT_TIMEOUT);
|
||||
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
if (use_tls) anon_tls_server(stream);
|
||||
#endif
|
||||
|
||||
printf("on server connection\n");
|
||||
|
||||
return stream;
|
||||
}
|
||||
|
||||
static void
|
||||
connint_on_client_connect (evcom_stream *stream)
|
||||
{
|
||||
printf("on client connection\n");
|
||||
evcom_stream_close(stream);
|
||||
}
|
||||
|
||||
static void
|
||||
connint_on_client_close (evcom_stream *stream)
|
||||
{
|
||||
evcom_stream_close(stream); // already closed, but it shouldn't crash if we try to do it again
|
||||
|
||||
printf("client connection closed\n");
|
||||
|
||||
MARK_PROGRESS(".", nconnections, NCONN);
|
||||
|
||||
if(++nconnections == NCONN) {
|
||||
evcom_server_close(&server);
|
||||
printf("closing server\n");
|
||||
}
|
||||
|
||||
evcom_stream_detach(stream);
|
||||
}
|
||||
|
||||
static void
|
||||
connint_on_client_read (evcom_stream *stream, const void *base, size_t len)
|
||||
{
|
||||
if (len == 0) {
|
||||
evcom_stream_close(stream);
|
||||
return;
|
||||
}
|
||||
|
||||
char buf[200000];
|
||||
strncpy(buf, base, len);
|
||||
buf[len] = 0;
|
||||
|
||||
printf("client got message: %s\n", buf);
|
||||
|
||||
assert(strcmp(buf, "BYE") == 0);
|
||||
evcom_stream_close(stream);
|
||||
}
|
||||
|
||||
int
|
||||
connint (struct sockaddr *address)
|
||||
{
|
||||
int r;
|
||||
|
||||
nconnections = 0;
|
||||
got_server_close = 0;
|
||||
|
||||
evcom_server_init(&server);
|
||||
server.on_connection = connint_on_connection;
|
||||
server.on_close = common_on_server_close;
|
||||
|
||||
evcom_server_listen(&server, address, 1000);
|
||||
evcom_server_attach(EV_DEFAULT_ &server);
|
||||
|
||||
evcom_stream clients[NCONN];
|
||||
int i;
|
||||
for (i = 0; i < NCONN; i++) {
|
||||
evcom_stream *client = &clients[i];
|
||||
evcom_stream_init(client);
|
||||
client->on_read = connint_on_client_read;
|
||||
client->on_connect = connint_on_client_connect;
|
||||
client->on_close = connint_on_client_close;
|
||||
client->on_timeout = common_on_client_timeout;
|
||||
evcom_stream_reset_timeout(client, CONNINT_TIMEOUT);
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
if (use_tls) anon_tls_client(client);
|
||||
#endif
|
||||
r = evcom_stream_connect(client, address);
|
||||
assert(r == 0 && "problem connecting");
|
||||
evcom_stream_attach(EV_DEFAULT_ client);
|
||||
}
|
||||
|
||||
ev_loop(EV_DEFAULT_ 0);
|
||||
|
||||
assert(nconnections == NCONN);
|
||||
assert(got_server_close);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static evcom_reader reader;
|
||||
static evcom_writer writer;
|
||||
static int reader_got_close = 0;
|
||||
static int reader_got_eof = 0;
|
||||
static int reader_got_hello = 0;
|
||||
static int reader_cnt = 0;
|
||||
static int writer_got_close = 0;
|
||||
#define PIPE_MSG "hello world"
|
||||
#define PIPE_CNT 5000
|
||||
|
||||
static void
|
||||
reader_read (evcom_reader *r, const void *str, size_t len)
|
||||
{
|
||||
assert(r == &reader);
|
||||
|
||||
if (len == 0) {
|
||||
reader_got_eof = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
assert(len == strlen(PIPE_MSG));
|
||||
|
||||
if (strncmp(str, PIPE_MSG, strlen(PIPE_MSG)) == 0) {
|
||||
reader_got_hello = 1;
|
||||
}
|
||||
|
||||
if (++reader_cnt < PIPE_CNT) {
|
||||
MARK_PROGRESS(".", reader_cnt, PIPE_CNT);
|
||||
evcom_writer_write(&writer, PIPE_MSG, strlen(PIPE_MSG));
|
||||
} else {
|
||||
evcom_writer_close(&writer);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
reader_close (evcom_reader *r)
|
||||
{
|
||||
assert(r == &reader);
|
||||
reader_got_close = 1;
|
||||
evcom_reader_detach(r);
|
||||
}
|
||||
|
||||
static void
|
||||
writer_close (evcom_writer *w)
|
||||
{
|
||||
assert(w == &writer);
|
||||
writer_got_close = 1;
|
||||
evcom_writer_detach(w);
|
||||
}
|
||||
|
||||
int
|
||||
pipe_stream (void)
|
||||
{
|
||||
reader_cnt = 0;
|
||||
reader_got_close = 0;
|
||||
reader_got_hello = 0;
|
||||
reader_got_eof = 0;
|
||||
writer_got_close = 0;
|
||||
|
||||
int pipefd[2];
|
||||
int r = pipe(pipefd);
|
||||
if (r < 0) {
|
||||
perror("pipe()");
|
||||
return -1;
|
||||
}
|
||||
|
||||
evcom_reader_init(&reader);
|
||||
reader.on_read = reader_read;
|
||||
reader.on_close = reader_close;
|
||||
evcom_reader_set(&reader, pipefd[0]);
|
||||
evcom_reader_attach(EV_DEFAULT_ &reader);
|
||||
|
||||
evcom_writer_init(&writer);
|
||||
writer.on_close = writer_close;
|
||||
evcom_writer_set(&writer, pipefd[1]);
|
||||
evcom_writer_attach(EV_DEFAULT_ &writer);
|
||||
|
||||
evcom_writer_write(&writer, PIPE_MSG, strlen(PIPE_MSG));
|
||||
|
||||
ev_loop(EV_DEFAULT_ 0);
|
||||
|
||||
assert(reader_got_close);
|
||||
assert(reader_got_hello);
|
||||
assert(reader_got_eof);
|
||||
assert(writer_got_close);
|
||||
assert(reader_cnt == PIPE_CNT);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define PAIR_PINGPONG_TIMEOUT 5000.0
|
||||
#define PAIR_PINGPONG_EXCHANGES 50
|
||||
static int a_got_close;
|
||||
static int a_got_connect;
|
||||
static int b_got_close;
|
||||
static int b_got_connect;
|
||||
static int pair_pingpong_cnt;
|
||||
static evcom_stream a, b;
|
||||
|
||||
void a_connect (evcom_stream *stream)
|
||||
{
|
||||
assert(stream == &a);
|
||||
a_got_connect = 1;
|
||||
}
|
||||
|
||||
void a_close (evcom_stream *stream)
|
||||
{
|
||||
evcom_stream_detach(stream);
|
||||
assert(stream == &a);
|
||||
a_got_close = 1;
|
||||
|
||||
assert(stream->errorno == 0);
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
if (stream->gnutls_errorno) {
|
||||
fprintf(stderr, "\nGNUTLS ERROR: %s\n", gnutls_strerror(stream->gnutls_errorno));
|
||||
}
|
||||
assert(stream->gnutls_errorno == 0);
|
||||
if (use_tls) gnutls_deinit(stream->session);
|
||||
#endif
|
||||
}
|
||||
|
||||
void a_read (evcom_stream *stream, const void *buf, size_t len)
|
||||
{
|
||||
assert(stream == &a);
|
||||
if (len == 0) return;
|
||||
|
||||
assert(len == strlen(PONG));
|
||||
assert(strncmp(buf, PONG, strlen(PONG)) == 0);
|
||||
|
||||
if (++pair_pingpong_cnt < PAIR_PINGPONG_EXCHANGES) {
|
||||
evcom_stream_write(&a, PING, strlen(PING));
|
||||
} else if (pair_pingpong_cnt == PAIR_PINGPONG_EXCHANGES) {
|
||||
evcom_stream_close(stream);
|
||||
}
|
||||
|
||||
MARK_PROGRESS(".", pair_pingpong_cnt, PAIR_PINGPONG_EXCHANGES);
|
||||
}
|
||||
|
||||
void b_connect (evcom_stream *stream)
|
||||
{
|
||||
assert(stream == &b);
|
||||
b_got_connect = 1;
|
||||
}
|
||||
|
||||
void b_close (evcom_stream *stream)
|
||||
{
|
||||
evcom_stream_detach(stream);
|
||||
assert(stream == &b);
|
||||
b_got_close = 1;
|
||||
|
||||
assert(stream->errorno == 0);
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
if (stream->gnutls_errorno) {
|
||||
fprintf(stderr, "\nGNUTLS ERROR: %s\n", gnutls_strerror(stream->gnutls_errorno));
|
||||
}
|
||||
assert(stream->gnutls_errorno == 0);
|
||||
if (use_tls) gnutls_deinit(stream->session);
|
||||
#endif
|
||||
}
|
||||
|
||||
void b_read (evcom_stream *stream, const void *buf, size_t len)
|
||||
{
|
||||
assert(stream == &b);
|
||||
if (len == 0) {
|
||||
evcom_stream_close(stream);
|
||||
return;
|
||||
}
|
||||
|
||||
assert(len == strlen(PING));
|
||||
assert(strncmp(buf, PING, strlen(PING)) == 0);
|
||||
|
||||
evcom_stream_write(&b, PONG, strlen(PONG));
|
||||
}
|
||||
|
||||
int
|
||||
pair_pingpong (int use_pipe)
|
||||
{
|
||||
a_got_close = 0;
|
||||
a_got_connect = 0;
|
||||
b_got_close = 0;
|
||||
b_got_connect = 0;
|
||||
pair_pingpong_cnt = 0;
|
||||
|
||||
evcom_stream_init(&a);
|
||||
a.on_close = a_close;
|
||||
a.on_connect = a_connect;
|
||||
a.on_read = a_read;
|
||||
evcom_stream_reset_timeout(&a, PAIR_PINGPONG_TIMEOUT);
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
if (use_tls) anon_tls_client(&a);
|
||||
#endif
|
||||
|
||||
evcom_stream_init(&b);
|
||||
b.on_close = b_close;
|
||||
b.on_connect = b_connect;
|
||||
b.on_read = b_read;
|
||||
evcom_stream_reset_timeout(&b, PAIR_PINGPONG_TIMEOUT);
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
if (use_tls) anon_tls_server(&b);
|
||||
#endif
|
||||
|
||||
if (use_pipe) {
|
||||
int pipeA[2], pipeB[2];
|
||||
assert(0 == pipe(pipeA));
|
||||
assert(0 == pipe(pipeB));
|
||||
|
||||
evcom_stream_assign_fds(&a, pipeA[0], pipeB[1]);
|
||||
evcom_stream_assign_fds(&b, pipeB[0], pipeA[1]);
|
||||
|
||||
} else {
|
||||
int r = evcom_stream_pair(&a, &b);
|
||||
assert(r == 0);
|
||||
}
|
||||
|
||||
evcom_stream_attach(EV_DEFAULT_ &a);
|
||||
evcom_stream_attach(EV_DEFAULT_ &b);
|
||||
|
||||
evcom_stream_write(&a, PING, strlen(PING));
|
||||
|
||||
ev_loop(EV_DEFAULT_ 0);
|
||||
|
||||
assert(a_got_close);
|
||||
assert(a_got_connect);
|
||||
assert(b_got_close);
|
||||
assert(b_got_connect);
|
||||
assert(pair_pingpong_cnt == PAIR_PINGPONG_EXCHANGES);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
free_stream (evcom_stream *stream)
|
||||
{
|
||||
assert(stream->errorno == 0);
|
||||
free(stream);
|
||||
}
|
||||
|
||||
#define ZERO_TIMEOUT 50.0
|
||||
static size_t zero_to_write = 0;
|
||||
static size_t zero_written = 0;
|
||||
static size_t zero_read = 0;
|
||||
static size_t zero_client_closed = 0;
|
||||
|
||||
static void
|
||||
error_out (evcom_stream *stream)
|
||||
{
|
||||
assert(stream);
|
||||
fprintf(stderr, "peer connection timeout\n");
|
||||
assert(0);
|
||||
}
|
||||
|
||||
static void
|
||||
echo (evcom_stream *stream, const void *base, size_t len)
|
||||
{
|
||||
if(len == 0) {
|
||||
fprintf(stderr, "close");
|
||||
evcom_stream_close(stream);
|
||||
} else {
|
||||
evcom_stream_write(stream, base, len);
|
||||
}
|
||||
}
|
||||
|
||||
static evcom_stream*
|
||||
make_echo_connection (evcom_server *server, struct sockaddr *addr)
|
||||
{
|
||||
assert(server);
|
||||
assert(addr);
|
||||
|
||||
evcom_stream *stream = malloc(sizeof(evcom_stream));
|
||||
evcom_stream_init(stream);
|
||||
stream->on_read = echo;
|
||||
stream->on_close = free_stream;
|
||||
stream->on_timeout = error_out;
|
||||
evcom_stream_reset_timeout(stream, ZERO_TIMEOUT);
|
||||
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
if (use_tls) anon_tls_server(stream);
|
||||
#endif
|
||||
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
zero_start (evcom_stream *stream)
|
||||
{
|
||||
evcom_stream_write(stream, "0", 1);
|
||||
zero_written++;
|
||||
}
|
||||
|
||||
static void
|
||||
zero_close (evcom_stream *stream)
|
||||
{
|
||||
assert(stream);
|
||||
zero_client_closed = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
zero_recv (evcom_stream *stream, const void *buf, size_t len)
|
||||
{
|
||||
MARK_PROGRESS("-", zero_read, zero_to_write);
|
||||
zero_read += len;
|
||||
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
assert(((char*)buf)[i] == '0');
|
||||
}
|
||||
|
||||
for (i = 0; i < MIN(zero_to_write - zero_written, 90000); i++) {
|
||||
evcom_stream_write(stream, "0", 1);
|
||||
zero_written++;
|
||||
|
||||
MARK_PROGRESS(".", zero_written, zero_to_write);
|
||||
|
||||
if (zero_written == zero_to_write) {
|
||||
|
||||
fprintf(stderr, "CLOSE");
|
||||
evcom_stream_close(stream);
|
||||
}
|
||||
}
|
||||
|
||||
if (len == 0) {
|
||||
fprintf(stderr, "finish");
|
||||
evcom_server_close(&server);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
zero_stream (struct sockaddr *address, size_t to_write)
|
||||
{
|
||||
int r;
|
||||
|
||||
assert(to_write >= 1024); // should be kind of big at least.
|
||||
zero_to_write = to_write;
|
||||
got_server_close = 0;
|
||||
zero_written = 0;
|
||||
zero_read = 0;
|
||||
zero_client_closed = 0;
|
||||
|
||||
evcom_server_init(&server);
|
||||
server.on_connection = make_echo_connection;
|
||||
server.on_close = common_on_server_close;
|
||||
|
||||
evcom_server_listen(&server, address, 1000);
|
||||
evcom_server_attach(EV_DEFAULT_ &server);
|
||||
|
||||
evcom_stream client;
|
||||
evcom_stream_init(&client);
|
||||
client.on_read = zero_recv;
|
||||
client.on_connect = zero_start;
|
||||
client.on_close = zero_close;
|
||||
client.on_timeout = error_out;
|
||||
evcom_stream_reset_timeout(&client, ZERO_TIMEOUT);
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
if (use_tls) anon_tls_client(&client);
|
||||
#endif
|
||||
r = evcom_stream_connect(&client, address);
|
||||
assert(r == 0 && "problem connecting");
|
||||
evcom_stream_attach(EV_DEFAULT_ &client);
|
||||
|
||||
ev_loop(EV_DEFAULT_ 0);
|
||||
|
||||
assert(got_server_close);
|
||||
assert(zero_written == zero_to_write);
|
||||
assert(zero_read == zero_to_write);
|
||||
assert(zero_client_closed) ;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
struct sockaddr *
|
||||
create_unix_address (void)
|
||||
{
|
||||
struct stat tstat;
|
||||
if (lstat(SOCKFILE, &tstat) == 0) {
|
||||
assert(S_ISSOCK(tstat.st_mode));
|
||||
unlink(SOCKFILE);
|
||||
}
|
||||
|
||||
struct sockaddr_un *address = calloc(1, sizeof(struct sockaddr_un));
|
||||
address->sun_family = AF_UNIX;
|
||||
strcpy(address->sun_path, SOCKFILE);
|
||||
|
||||
return (struct sockaddr*)address;
|
||||
}
|
||||
|
||||
void
|
||||
free_unix_address (struct sockaddr *address)
|
||||
{
|
||||
struct stat tstat;
|
||||
if (lstat(SOCKFILE, &tstat) == 0) {
|
||||
assert(S_ISSOCK(tstat.st_mode));
|
||||
unlink(SOCKFILE);
|
||||
}
|
||||
free(address);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
fprintf(stderr, "sizeof(evcom_server): %d\n", (int)sizeof(evcom_server));
|
||||
fprintf(stderr, "sizeof(evcom_stream): %d\n", (int)sizeof(evcom_stream));
|
||||
fprintf(stderr, "sizeof(evcom_reader): %d\n", (int)sizeof(evcom_reader));
|
||||
fprintf(stderr, "sizeof(evcom_writer): %d\n", (int)sizeof(evcom_writer));
|
||||
|
||||
evcom_ignore_sigpipe();
|
||||
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
gnutls_global_init();
|
||||
|
||||
gnutls_dh_params_init (&dh_params);
|
||||
|
||||
fsync((int)stderr);
|
||||
gnutls_dh_params_generate2 (dh_params, DH_BITS);
|
||||
|
||||
gnutls_anon_allocate_server_credentials (&server_credentials);
|
||||
gnutls_anon_set_server_dh_params (server_credentials, dh_params);
|
||||
#endif
|
||||
|
||||
|
||||
struct sockaddr_in tcp_address;
|
||||
memset(&tcp_address, 0, sizeof(struct sockaddr_in));
|
||||
tcp_address.sin_family = AF_INET;
|
||||
tcp_address.sin_port = htons(PORT);
|
||||
tcp_address.sin_addr.s_addr = INADDR_ANY;
|
||||
|
||||
use_tls = 0;
|
||||
|
||||
fprintf(stderr, "pair_pingpong use_pipe=1: ");
|
||||
assert(pair_pingpong(1) == 0);
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
fprintf(stderr, "pair_pingpong use_pipe=0: ");
|
||||
assert(pair_pingpong(0) == 0);
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
fprintf(stderr, "zero_stream tcp: ");
|
||||
assert(zero_stream((struct sockaddr*)&tcp_address, 5*1024*1024) == 0);
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
fprintf(stderr, "pipe_stream: ");
|
||||
assert(pipe_stream() == 0);
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
fprintf(stderr, "pingpong tcp: ");
|
||||
assert(pingpong((struct sockaddr*)&tcp_address) == 0);
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
fprintf(stderr, "connint tcp: ");
|
||||
assert(connint((struct sockaddr*)&tcp_address) == 0);
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
use_tls = 1;
|
||||
|
||||
fprintf(stderr, "zero_stream ssl: ");
|
||||
assert(zero_stream((struct sockaddr*)&tcp_address, 50*1024) == 0);
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
fprintf(stderr, "pair_pingpong ssl use_pipe=1: ");
|
||||
assert(pair_pingpong(1) == 0);
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
fprintf(stderr, "pair_pingpong ssl use_pipe=0: ");
|
||||
assert(pair_pingpong(0) == 0);
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
fprintf(stderr, "pingpong ssl: ");
|
||||
assert(pingpong((struct sockaddr*)&tcp_address) == 0);
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
fprintf(stderr, "connint ssl: ");
|
||||
assert(connint((struct sockaddr*)&tcp_address) == 0);
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
#endif
|
||||
|
||||
struct sockaddr *unix_address;
|
||||
|
||||
use_tls = 0;
|
||||
|
||||
fprintf(stderr, "pingpong unix: ");
|
||||
unix_address = create_unix_address();
|
||||
assert(pingpong(unix_address) == 0);
|
||||
free_unix_address(unix_address);
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
fprintf(stderr, "connint unix: ");
|
||||
unix_address = create_unix_address();
|
||||
assert(connint(unix_address) == 0);
|
||||
free_unix_address(unix_address);
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
#if EVCOM_HAVE_GNUTLS
|
||||
use_tls = 1;
|
||||
|
||||
fprintf(stderr, "pingpong unix ssl: ");
|
||||
unix_address = create_unix_address();
|
||||
assert(pingpong(unix_address) == 0);
|
||||
free_unix_address(unix_address);
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
fprintf(stderr, "connint unix ssl: ");
|
||||
unix_address = create_unix_address();
|
||||
assert(connint(unix_address) == 0);
|
||||
free_unix_address(unix_address);
|
||||
fprintf(stderr, "\n");
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
98
deps/evcom/test/timeout.rb
vendored
98
deps/evcom/test/timeout.rb
vendored
@@ -1,98 +0,0 @@
|
||||
#!/usr/bin/env ruby
|
||||
require 'socket'
|
||||
|
||||
def test(description)
|
||||
pid = fork do
|
||||
exec(File.dirname(__FILE__) + "/echo")
|
||||
end
|
||||
|
||||
puts "#{description}: "
|
||||
begin
|
||||
sleep 0.5 # give time for the server to start
|
||||
yield(pid)
|
||||
rescue
|
||||
puts "\033[1;31mFAIL\033[m"
|
||||
raise $!
|
||||
ensure
|
||||
`kill -9 #{pid}`
|
||||
end
|
||||
puts "\033[1;32mPASS\033[m"
|
||||
end
|
||||
|
||||
test("make sure echo server works") do
|
||||
socket = TCPSocket.open("localhost", 5000)
|
||||
w = socket.write("hello");
|
||||
raise "error" unless w == 5
|
||||
|
||||
got = socket.recv(5);
|
||||
raise "error" unless got == "hello"
|
||||
|
||||
socket.close
|
||||
end
|
||||
|
||||
test("doing nothing should not timeout the server") do |pid|
|
||||
10.times do
|
||||
print "."
|
||||
STDOUT.flush
|
||||
if Process.waitpid(pid, Process::WNOHANG)
|
||||
raise "server died when it shouldn't have"
|
||||
end
|
||||
sleep 1
|
||||
end
|
||||
puts ""
|
||||
end
|
||||
|
||||
test("connecting and doing nothing to should timeout in 5 seconds") do |pid|
|
||||
socket = TCPSocket.open("localhost", 5000)
|
||||
i = 0
|
||||
10.times do
|
||||
print "."
|
||||
STDOUT.flush
|
||||
break if Process.waitpid(pid, Process::WNOHANG)
|
||||
sleep 1
|
||||
i+=1
|
||||
end
|
||||
puts ""
|
||||
raise "died too soon (after #{i} seconds)" if i < 5
|
||||
raise "died too late (after #{i} seconds)" if i > 6
|
||||
end
|
||||
|
||||
|
||||
test("connecting and writing once to should timeout in 5 seconds") do |pid|
|
||||
socket = TCPSocket.open("localhost", 5000)
|
||||
w = socket.write("hello");
|
||||
raise "error" unless w == 5
|
||||
|
||||
i = 0
|
||||
10.times do
|
||||
print "."
|
||||
STDOUT.flush
|
||||
break if Process.waitpid(pid, Process::WNOHANG)
|
||||
sleep 1
|
||||
i+=1
|
||||
end
|
||||
puts ""
|
||||
raise "died too soon (after #{i} seconds)" if i < 5
|
||||
raise "died too late (after #{i} seconds)" if i > 6
|
||||
end
|
||||
|
||||
test("connecting waiting 3, writing once to should timeout in 8 seconds") do |pid|
|
||||
socket = TCPSocket.open("localhost", 5000)
|
||||
|
||||
sleep 3
|
||||
|
||||
w = socket.write("hello");
|
||||
raise "error" unless w == 5
|
||||
|
||||
i = 0
|
||||
10.times do
|
||||
print "."
|
||||
STDOUT.flush
|
||||
break if Process.waitpid(pid, Process::WNOHANG)
|
||||
sleep 1
|
||||
i+=1
|
||||
end
|
||||
puts ""
|
||||
raise "died too soon (after #{i} seconds)" if i < 5
|
||||
raise "died too late (after #{i} seconds)" if i > 6
|
||||
end
|
||||
8
deps/http_parser/.gitignore
vendored
Normal file
8
deps/http_parser/.gitignore
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
core
|
||||
tags
|
||||
*.o
|
||||
test
|
||||
test_g
|
||||
test_fast
|
||||
*.mk
|
||||
*.Makefile
|
||||
4
deps/http_parser/.mailmap
vendored
Normal file
4
deps/http_parser/.mailmap
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
# update AUTHORS with:
|
||||
# git log --all --reverse --format='%aN <%aE>' | perl -ne 'BEGIN{print "# Authors ordered by first contribution.\n"} print unless $h{$_}; $h{$_} = 1' > AUTHORS
|
||||
Ryan Dahl <ry@tinyclouds.org>
|
||||
Salman Haq <salman.haq@asti-usa.com>
|
||||
32
deps/http_parser/AUTHORS
vendored
Normal file
32
deps/http_parser/AUTHORS
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
# Authors ordered by first contribution.
|
||||
Ryan Dahl <ry@tinyclouds.org>
|
||||
Jeremy Hinegardner <jeremy@hinegardner.org>
|
||||
Sergey Shepelev <temotor@gmail.com>
|
||||
Joe Damato <ice799@gmail.com>
|
||||
tomika <tomika_nospam@freemail.hu>
|
||||
Phoenix Sol <phoenix@burninglabs.com>
|
||||
Cliff Frey <cliff@meraki.com>
|
||||
Ewen Cheslack-Postava <ewencp@cs.stanford.edu>
|
||||
Santiago Gala <sgala@apache.org>
|
||||
Tim Becker <tim.becker@syngenio.de>
|
||||
Jeff Terrace <jterrace@gmail.com>
|
||||
Ben Noordhuis <info@bnoordhuis.nl>
|
||||
Nathan Rajlich <nathan@tootallnate.net>
|
||||
Mark Nottingham <mnot@mnot.net>
|
||||
Aman Gupta <aman@tmm1.net>
|
||||
Tim Becker <tim.becker@kuriositaet.de>
|
||||
Sean Cunningham <sean.cunningham@mandiant.com>
|
||||
Peter Griess <pg@std.in>
|
||||
Salman Haq <salman.haq@asti-usa.com>
|
||||
Cliff Frey <clifffrey@gmail.com>
|
||||
Jon Kolb <jon@b0g.us>
|
||||
Fouad Mardini <f.mardini@gmail.com>
|
||||
Paul Querna <pquerna@apache.org>
|
||||
Felix Geisendörfer <felix@debuggable.com>
|
||||
koichik <koichik@improvement.jp>
|
||||
Andre Caron <andre.l.caron@gmail.com>
|
||||
Ivo Raisr <ivosh@ivosh.net>
|
||||
James McLaughlin <jamie@lacewing-project.org>
|
||||
David Gwynne <loki@animata.net>
|
||||
LE ROUX Thomas <thomas@procheo.fr>
|
||||
Randy Rizun <rrizun@ortivawireless.com>
|
||||
4
deps/http_parser/CONTRIBUTIONS
vendored
Normal file
4
deps/http_parser/CONTRIBUTIONS
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
Contributors must agree to the Contributor License Agreement before patches
|
||||
can be accepted.
|
||||
|
||||
http://spreadsheets2.google.com/viewform?hl=en&formkey=dDJXOGUwbzlYaWM4cHN1MERwQS1CSnc6MQ
|
||||
79
deps/http_parser/LICENSE
vendored
79
deps/http_parser/LICENSE
vendored
@@ -1,79 +0,0 @@
|
||||
Copyright 2009, Ryan Lienhart Dahl. All rights reserved.
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to
|
||||
deal in the Software without restriction, including without limitation the
|
||||
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
sell copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
IN THE SOFTWARE.
|
||||
|
||||
|
||||
|
||||
|
||||
http_parser is based on Zed Shaw's Mongrel. Mongrel's license is as follows.
|
||||
|
||||
-- CUT ---- CUT ---- CUT ---- CUT ---- CUT ---- CUT ---- CUT ---- CUT --
|
||||
Mongrel Web Server (Mongrel) is copyrighted free software by Zed A. Shaw
|
||||
<zedshaw at zedshaw dot com> and contributors. You can redistribute it
|
||||
and/or modify it under either the terms of the GPL2 or the conditions below:
|
||||
|
||||
1. You may make and give away verbatim copies of the source form of the
|
||||
software without restriction, provided that you duplicate all of the
|
||||
original copyright notices and associated disclaimers.
|
||||
|
||||
2. You may modify your copy of the software in any way, provided that
|
||||
you do at least ONE of the following:
|
||||
|
||||
a) place your modifications in the Public Domain or otherwise make them
|
||||
Freely Available, such as by posting said modifications to Usenet or an
|
||||
equivalent medium, or by allowing the author to include your
|
||||
modifications in the software.
|
||||
|
||||
b) use the modified software only within your corporation or
|
||||
organization.
|
||||
|
||||
c) rename any non-standard executables so the names do not conflict with
|
||||
standard executables, which must also be provided.
|
||||
|
||||
d) make other distribution arrangements with the author.
|
||||
|
||||
3. You may distribute the software in object code or executable
|
||||
form, provided that you do at least ONE of the following:
|
||||
|
||||
a) distribute the executables and library files of the software,
|
||||
together with instructions (in the manual page or equivalent) on where
|
||||
to get the original distribution.
|
||||
|
||||
b) accompany the distribution with the machine-readable source of the
|
||||
software.
|
||||
|
||||
c) give non-standard executables non-standard names, with
|
||||
instructions on where to get the original software distribution.
|
||||
|
||||
d) make other distribution arrangements with the author.
|
||||
|
||||
4. You may modify and include the part of the software into any other
|
||||
software (possibly commercial). But some files in the distribution
|
||||
are not written by the author, so that they are not under this terms.
|
||||
|
||||
5. The scripts and library files supplied as input to or produced as
|
||||
output from the software do not automatically fall under the
|
||||
copyright of the software, but belong to whomever generated them,
|
||||
and may be sold commercially, and may be aggregated with this
|
||||
software.
|
||||
|
||||
6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE.
|
||||
-- CUT ---- CUT ---- CUT ---- CUT ---- CUT ---- CUT ---- CUT ---- CUT --
|
||||
23
deps/http_parser/LICENSE-MIT
vendored
Normal file
23
deps/http_parser/LICENSE-MIT
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
http_parser.c is based on src/http/ngx_http_parse.c from NGINX copyright
|
||||
Igor Sysoev.
|
||||
|
||||
Additional changes are licensed under the same terms as NGINX and
|
||||
copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to
|
||||
deal in the Software without restriction, including without limitation the
|
||||
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
sell copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
IN THE SOFTWARE.
|
||||
67
deps/http_parser/Makefile
vendored
67
deps/http_parser/Makefile
vendored
@@ -1,27 +1,58 @@
|
||||
#OPT=-O0 -g -Wall -Wextra -Werror
|
||||
OPT=-O2
|
||||
CC?=gcc
|
||||
AR?=ar
|
||||
|
||||
test: http_parser.o test.c
|
||||
gcc $(OPT) http_parser.o test.c -o $@
|
||||
CPPFLAGS += -I.
|
||||
CPPFLAGS_DEBUG = $(CPPFLAGS) -DHTTP_PARSER_STRICT=1 -DHTTP_PARSER_DEBUG=1
|
||||
CPPFLAGS_DEBUG += $(CPPFLAGS_DEBUG_EXTRA)
|
||||
CPPFLAGS_FAST = $(CPPFLAGS) -DHTTP_PARSER_STRICT=0 -DHTTP_PARSER_DEBUG=0
|
||||
CPPFLAGS_FAST += $(CPPFLAGS_FAST_EXTRA)
|
||||
|
||||
CFLAGS += -Wall -Wextra -Werror
|
||||
CFLAGS_DEBUG = $(CFLAGS) -O0 -g $(CFLAGS_DEBUG_EXTRA)
|
||||
CFLAGS_FAST = $(CFLAGS) -O3 $(CFLAGS_FAST_EXTRA)
|
||||
CFLAGS_LIB = $(CFLAGS_FAST) -fPIC
|
||||
|
||||
test: test_g test_fast
|
||||
./test_g
|
||||
./test_fast
|
||||
|
||||
test_g: http_parser_g.o test_g.o
|
||||
$(CC) $(CFLAGS_DEBUG) $(LDFLAGS) http_parser_g.o test_g.o -o $@
|
||||
|
||||
test_g.o: test.c http_parser.h Makefile
|
||||
$(CC) $(CPPFLAGS_DEBUG) $(CFLAGS_DEBUG) -c test.c -o $@
|
||||
|
||||
http_parser_g.o: http_parser.c http_parser.h Makefile
|
||||
$(CC) $(CPPFLAGS_DEBUG) $(CFLAGS_DEBUG) -c http_parser.c -o $@
|
||||
|
||||
test_fast: http_parser.o test.o http_parser.h
|
||||
$(CC) $(CFLAGS_FAST) $(LDFLAGS) http_parser.o test.o -o $@
|
||||
|
||||
test.o: test.c http_parser.h Makefile
|
||||
$(CC) $(CPPFLAGS_FAST) $(CFLAGS_FAST) -c test.c -o $@
|
||||
|
||||
http_parser.o: http_parser.c http_parser.h Makefile
|
||||
gcc $(OPT) -c http_parser.c
|
||||
$(CC) $(CPPFLAGS_FAST) $(CFLAGS_FAST) -c http_parser.c
|
||||
|
||||
http_parser.c: http_parser.rl Makefile
|
||||
ragel -s -G2 http_parser.rl -o $@
|
||||
test-run-timed: test_fast
|
||||
while(true) do time ./test_fast > /dev/null; done
|
||||
|
||||
tags: http_parser.rl http_parser.h test.c
|
||||
test-valgrind: test_g
|
||||
valgrind ./test_g
|
||||
|
||||
libhttp_parser.o: http_parser.c http_parser.h Makefile
|
||||
$(CC) $(CPPFLAGS_FAST) $(CFLAGS_LIB) -c http_parser.c -o libhttp_parser.o
|
||||
|
||||
library: libhttp_parser.o
|
||||
$(CC) -shared -o libhttp_parser.so libhttp_parser.o
|
||||
|
||||
package: http_parser.o
|
||||
$(AR) rcs libhttp_parser.a http_parser.o
|
||||
|
||||
tags: http_parser.c http_parser.h test.c
|
||||
ctags $^
|
||||
|
||||
clean:
|
||||
rm -f *.o http_parser.c test http_parser.tar
|
||||
rm -f *.o *.a test test_fast test_g http_parser.tar tags libhttp_parser.so libhttp_parser.o
|
||||
|
||||
package: http_parser.c
|
||||
@rm -rf /tmp/http_parser && mkdir /tmp/http_parser && \
|
||||
cp LICENSE README.md Makefile http_parser.c http_parser.rl \
|
||||
http_parser.h test.c /tmp/http_parser && \
|
||||
cd /tmp && \
|
||||
tar -cf http_parser.tar http_parser/
|
||||
@echo /tmp/http_parser.tar
|
||||
|
||||
.PHONY: clean package
|
||||
.PHONY: clean package test-run test-run-timed test-valgrind
|
||||
|
||||
149
deps/http_parser/README.md
vendored
149
deps/http_parser/README.md
vendored
@@ -1,88 +1,137 @@
|
||||
HTTP Parser
|
||||
===========
|
||||
|
||||
This is a parser for HTTP messages written in C. It parses both requests
|
||||
and responses. The parser is designed to be used in performance HTTP
|
||||
applications. It does not make any allocations, it does not buffer data, and
|
||||
it can be interrupted at anytime. It only requires about 128 bytes of data
|
||||
per message stream (in a web server that is per connection).
|
||||
This is a parser for HTTP messages written in C. It parses both requests and
|
||||
responses. The parser is designed to be used in performance HTTP
|
||||
applications. It does not make any syscalls nor allocations, it does not
|
||||
buffer data, it can be interrupted at anytime. Depending on your
|
||||
architecture, it only requires about 40 bytes of data per message
|
||||
stream (in a web server that is per connection).
|
||||
|
||||
Features:
|
||||
|
||||
* No dependencies
|
||||
* Parses both requests and responses.
|
||||
* Handles keep-alive streams.
|
||||
* No dependencies
|
||||
* Handles persistent streams (keep-alive).
|
||||
* Decodes chunked encoding.
|
||||
* Extracts the following data from a message
|
||||
* header fields and values
|
||||
* content-length
|
||||
* request method
|
||||
* response status code
|
||||
* transfer-encoding
|
||||
* http version
|
||||
* request path, query string, fragment
|
||||
* message body
|
||||
* Upgrade support
|
||||
* Defends against buffer overflow attacks.
|
||||
|
||||
The parser extracts the following information from HTTP messages:
|
||||
|
||||
* Header fields and values
|
||||
* Content-Length
|
||||
* Request method
|
||||
* Response status code
|
||||
* Transfer-Encoding
|
||||
* HTTP version
|
||||
* Request URL
|
||||
* Message body
|
||||
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
One `http_parser` object is used per TCP connection. Initialize the struct
|
||||
using `http_parser_init()` and set the callbacks. That might look something
|
||||
like this:
|
||||
like this for a request parser:
|
||||
|
||||
http_parser_settings settings;
|
||||
settings.on_path = my_path_callback;
|
||||
settings.on_header_field = my_header_field_callback;
|
||||
/* ... */
|
||||
|
||||
http_parser *parser = malloc(sizeof(http_parser));
|
||||
http_parser_init(parser, HTTP_REQUEST);
|
||||
parser->on_path = my_path_callback;
|
||||
parser->on_header_field = my_header_field_callback;
|
||||
parser->data = my_socket;
|
||||
|
||||
When data is received on the socket execute the parser and check for errors.
|
||||
|
||||
size_t len = 80*1024;
|
||||
size_t len = 80*1024, nparsed;
|
||||
char buf[len];
|
||||
ssize_t recved;
|
||||
|
||||
recved = read(fd, buf, len);
|
||||
if (recved != 0) // handle error
|
||||
recved = recv(fd, buf, len, 0);
|
||||
|
||||
http_parser_execute(parser, buf, recved);
|
||||
|
||||
if (http_parser_has_error(parser)) {
|
||||
// handle error. usually just close the connection
|
||||
if (recved < 0) {
|
||||
/* Handle error. */
|
||||
}
|
||||
|
||||
/* Start up / continue the parser.
|
||||
* Note we pass recved==0 to signal that EOF has been recieved.
|
||||
*/
|
||||
nparsed = http_parser_execute(parser, &settings, buf, recved);
|
||||
|
||||
if (parser->upgrade) {
|
||||
/* handle new protocol */
|
||||
} else if (nparsed != recved) {
|
||||
/* Handle error. Usually just close the connection. */
|
||||
}
|
||||
|
||||
HTTP needs to know where the end of the stream is. For example, sometimes
|
||||
servers send responses without Content-Length and expect the client to
|
||||
consume input (for the body) until EOF. To tell http_parser about EOF, give
|
||||
`0` as the forth parameter to `http_parser_execute()`. Callbacks and errors
|
||||
can still be encountered during an EOF, so one must still be prepared
|
||||
to receive them.
|
||||
|
||||
Scalar valued message information such as `status_code`, `method`, and the
|
||||
HTTP version are stored in the parser structure. This data is only
|
||||
temporarlly stored in `http_parser` and gets reset on each new message. If
|
||||
temporally stored in `http_parser` and gets reset on each new message. If
|
||||
this information is needed later, copy it out of the structure during the
|
||||
`headers_complete` callback.
|
||||
|
||||
|
||||
The parser decodes the transfer-encoding for both requests and responses
|
||||
transparently. That is, a chunked encoding is decoded before being sent to
|
||||
the on_body callback.
|
||||
|
||||
It does not decode the content-encoding (gzip). Not all HTTP applications
|
||||
need to inspect the body. Decoding gzip is non-neglagable amount of
|
||||
processing (and requires making allocations). HTTP proxies using this
|
||||
parser, for example, would not want such a feature.
|
||||
|
||||
The Special Problem of Upgrade
|
||||
------------------------------
|
||||
|
||||
HTTP supports upgrading the connection to a different protocol. An
|
||||
increasingly common example of this is the Web Socket protocol which sends
|
||||
a request like
|
||||
|
||||
GET /demo HTTP/1.1
|
||||
Upgrade: WebSocket
|
||||
Connection: Upgrade
|
||||
Host: example.com
|
||||
Origin: http://example.com
|
||||
WebSocket-Protocol: sample
|
||||
|
||||
followed by non-HTTP data.
|
||||
|
||||
(See http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-75 for more
|
||||
information the Web Socket protocol.)
|
||||
|
||||
To support this, the parser will treat this as a normal HTTP message without a
|
||||
body. Issuing both on_headers_complete and on_message_complete callbacks. However
|
||||
http_parser_execute() will stop parsing at the end of the headers and return.
|
||||
|
||||
The user is expected to check if `parser->upgrade` has been set to 1 after
|
||||
`http_parser_execute()` returns. Non-HTTP data begins at the buffer supplied
|
||||
offset by the return value of `http_parser_execute()`.
|
||||
|
||||
|
||||
Callbacks
|
||||
---------
|
||||
|
||||
During the `http_parser_execute()` call, the callbacks set in `http_parser`
|
||||
will be executed. The parser maintains state and never looks behind, so
|
||||
buffering the data is not necessary. If you need to save certain data for
|
||||
later usage, you can do that from the callbacks.
|
||||
During the `http_parser_execute()` call, the callbacks set in
|
||||
`http_parser_settings` will be executed. The parser maintains state and
|
||||
never looks behind, so buffering the data is not necessary. If you need to
|
||||
save certain data for later usage, you can do that from the callbacks.
|
||||
|
||||
There are two types of callbacks:
|
||||
|
||||
* notification `typedef int (*http_cb) (http_parser*);`
|
||||
Callbacks: on_message_begin, on_headers_complete, on_message_complete.
|
||||
* data `typedef int (*http_data_cb) (http_parser*, const char *at, size_t length);`
|
||||
Callbacks: (requests only) on_path, on_query_string, on_uri, on_fragment,
|
||||
Callbacks: (requests only) on_uri,
|
||||
(common) on_header_field, on_header_value, on_body;
|
||||
|
||||
Callbacks must return 0 on success. Returning a non-zero value indicates
|
||||
error to the parser, making it exit immediately.
|
||||
|
||||
In case you parse HTTP message in chunks (i.e. `read()` request line
|
||||
from socket, parse, read half headers, parse, etc) your data callbacks
|
||||
may be called more than once. Http-parser guarantees that data pointer is only
|
||||
@@ -93,7 +142,7 @@ Reading headers may be a tricky task if you read/parse headers partially.
|
||||
Basically, you need to remember whether last header callback was field or value
|
||||
and apply following logic:
|
||||
|
||||
/* on_header_field and on_header_value shortened to on_h_*
|
||||
(on_header_field and on_header_value shortened to on_h_*)
|
||||
------------------------ ------------ --------------------------------------------
|
||||
| State (prev. callback) | Callback | Description/action |
|
||||
------------------------ ------------ --------------------------------------------
|
||||
@@ -113,19 +162,17 @@ and apply following logic:
|
||||
| value | on_h_value | Value continues. Reallocate value buffer |
|
||||
| | | and append callback data to it |
|
||||
------------------------ ------------ --------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
Parsing URLs
|
||||
------------
|
||||
|
||||
A simplistic zero-copy URL parser is provided as `http_parser_parse_url()`.
|
||||
Users of this library may wish to use it to parse URLs constructed from
|
||||
consecutive `on_url` callbacks.
|
||||
|
||||
See examples of reading in headers:
|
||||
|
||||
* [partial example](http://gist.github.com/155877) in C
|
||||
* [from http-parser tests](http://github.com/ry/http-parser/blob/37a0ff8928fb0d83cec0d0d8909c5a4abcd221af/test.c#L403) in C
|
||||
* [from Node library](http://github.com/ry/node/blob/842eaf446d2fdcb33b296c67c911c32a0dabc747/src/http.js#L284) in Javascript
|
||||
|
||||
Releases
|
||||
--------
|
||||
|
||||
* [0.2](http://s3.amazonaws.com/four.livejournal/20090807/http_parser-0.2.tar.gz)
|
||||
|
||||
* [0.1](http://s3.amazonaws.com/four.livejournal/20090427/http_parser-0.1.tar.gz)
|
||||
|
||||
The source repo is at [github](http://github.com/ry/http-parser).
|
||||
* [from http-parser tests](http://github.com/joyent/http-parser/blob/37a0ff8/test.c#L403) in C
|
||||
* [from Node library](http://github.com/joyent/node/blob/842eaf4/src/http.js#L284) in Javascript
|
||||
|
||||
8031
deps/http_parser/http_parser.c
vendored
8031
deps/http_parser/http_parser.c
vendored
File diff suppressed because it is too large
Load Diff
79
deps/http_parser/http_parser.gyp
vendored
Normal file
79
deps/http_parser/http_parser.gyp
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
# This file is used with the GYP meta build system.
|
||||
# http://code.google.com/p/gyp/
|
||||
# To build try this:
|
||||
# svn co http://gyp.googlecode.com/svn/trunk gyp
|
||||
# ./gyp/gyp -f make --depth=`pwd` http_parser.gyp
|
||||
# ./out/Debug/test
|
||||
{
|
||||
'target_defaults': {
|
||||
'default_configuration': 'Debug',
|
||||
'configurations': {
|
||||
# TODO: hoist these out and put them somewhere common, because
|
||||
# RuntimeLibrary MUST MATCH across the entire project
|
||||
'Debug': {
|
||||
'defines': [ 'DEBUG', '_DEBUG' ],
|
||||
'msvs_settings': {
|
||||
'VCCLCompilerTool': {
|
||||
'RuntimeLibrary': 1, # static debug
|
||||
},
|
||||
},
|
||||
},
|
||||
'Release': {
|
||||
'defines': [ 'NDEBUG' ],
|
||||
'msvs_settings': {
|
||||
'VCCLCompilerTool': {
|
||||
'RuntimeLibrary': 0, # static release
|
||||
},
|
||||
},
|
||||
}
|
||||
},
|
||||
'msvs_settings': {
|
||||
'VCCLCompilerTool': {
|
||||
},
|
||||
'VCLibrarianTool': {
|
||||
},
|
||||
'VCLinkerTool': {
|
||||
'GenerateDebugInformation': 'true',
|
||||
},
|
||||
},
|
||||
'conditions': [
|
||||
['OS == "win"', {
|
||||
'defines': [
|
||||
'WIN32'
|
||||
],
|
||||
}]
|
||||
],
|
||||
},
|
||||
|
||||
'targets': [
|
||||
{
|
||||
'target_name': 'http_parser',
|
||||
'type': 'static_library',
|
||||
'include_dirs': [ '.' ],
|
||||
'direct_dependent_settings': {
|
||||
'include_dirs': [ '.' ],
|
||||
},
|
||||
'defines': [ 'HTTP_PARSER_STRICT=0' ],
|
||||
'sources': [ './http_parser.c', ],
|
||||
'conditions': [
|
||||
['OS=="win"', {
|
||||
'msvs_settings': {
|
||||
'VCCLCompilerTool': {
|
||||
# Compile as C++. http_parser.c is actually C99, but C++ is
|
||||
# close enough in this case.
|
||||
'CompileAs': 2,
|
||||
},
|
||||
},
|
||||
}]
|
||||
],
|
||||
},
|
||||
|
||||
{
|
||||
'target_name': 'test',
|
||||
'type': 'executable',
|
||||
'dependencies': [ 'http_parser' ],
|
||||
'sources': [ 'test.c' ]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
372
deps/http_parser/http_parser.h
vendored
372
deps/http_parser/http_parser.h
vendored
@@ -1,40 +1,81 @@
|
||||
/* Copyright (c) 2008, 2009 Ryan Dahl (ry@tinyclouds.org)
|
||||
* Based on Zed Shaw's Mongrel, copyright (c) Zed A. Shaw
|
||||
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
#ifndef http_parser_h
|
||||
#define http_parser_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define HTTP_PARSER_VERSION_MAJOR 1
|
||||
#define HTTP_PARSER_VERSION_MINOR 0
|
||||
|
||||
#include <sys/types.h>
|
||||
#if defined(_WIN32) && !defined(__MINGW32__) && (!defined(_MSC_VER) || _MSC_VER<1600)
|
||||
typedef __int8 int8_t;
|
||||
typedef unsigned __int8 uint8_t;
|
||||
typedef __int16 int16_t;
|
||||
typedef unsigned __int16 uint16_t;
|
||||
typedef __int32 int32_t;
|
||||
typedef unsigned __int32 uint32_t;
|
||||
typedef __int64 int64_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
|
||||
typedef unsigned int size_t;
|
||||
typedef int ssize_t;
|
||||
#else
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
/* Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run
|
||||
* faster
|
||||
*/
|
||||
#ifndef HTTP_PARSER_STRICT
|
||||
# define HTTP_PARSER_STRICT 1
|
||||
#endif
|
||||
|
||||
/* Compile with -DHTTP_PARSER_DEBUG=1 to add extra debugging information to
|
||||
* the error reporting facility.
|
||||
*/
|
||||
#ifndef HTTP_PARSER_DEBUG
|
||||
# define HTTP_PARSER_DEBUG 0
|
||||
#endif
|
||||
|
||||
|
||||
/* Maximium header size allowed */
|
||||
#define HTTP_MAX_HEADER_SIZE (80*1024)
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
typedef struct http_parser http_parser;
|
||||
typedef struct http_parser_settings http_parser_settings;
|
||||
|
||||
/* Callbacks should return non-zero to indicate an error. The parse will
|
||||
* then halt execution.
|
||||
*
|
||||
|
||||
/* Callbacks should return non-zero to indicate an error. The parser will
|
||||
* then halt execution.
|
||||
*
|
||||
* The one exception is on_headers_complete. In a HTTP_RESPONSE parser
|
||||
* returning '1' from on_headers_complete will tell the parser that it
|
||||
* should not expect a body. This is used when receiving a response to a
|
||||
* HEAD request which may contain 'Content-Length' or 'Transfer-Encoding:
|
||||
* chunked' headers that indicate the presence of a body.
|
||||
*
|
||||
* http_data_cb does not return data chunks. It will be call arbitrarally
|
||||
* many times for each string. E.G. you might get 10 callbacks for "on_path"
|
||||
* each providing just a few characters more data.
|
||||
@@ -42,90 +83,164 @@ typedef struct http_parser http_parser;
|
||||
typedef int (*http_data_cb) (http_parser*, const char *at, size_t length);
|
||||
typedef int (*http_cb) (http_parser*);
|
||||
|
||||
|
||||
/* Request Methods */
|
||||
#define HTTP_COPY 0x0001
|
||||
#define HTTP_DELETE 0x0002
|
||||
#define HTTP_GET 0x0004
|
||||
#define HTTP_HEAD 0x0008
|
||||
#define HTTP_LOCK 0x0010
|
||||
#define HTTP_MKCOL 0x0020
|
||||
#define HTTP_MOVE 0x0040
|
||||
#define HTTP_OPTIONS 0x0080
|
||||
#define HTTP_POST 0x0100
|
||||
#define HTTP_PROPFIND 0x0200
|
||||
#define HTTP_PROPPATCH 0x0400
|
||||
#define HTTP_PUT 0x0800
|
||||
#define HTTP_TRACE 0x1000
|
||||
#define HTTP_UNLOCK 0x2000
|
||||
#define HTTP_METHOD_MAP(XX) \
|
||||
XX(0, DELETE, DELETE) \
|
||||
XX(1, GET, GET) \
|
||||
XX(2, HEAD, HEAD) \
|
||||
XX(3, POST, POST) \
|
||||
XX(4, PUT, PUT) \
|
||||
/* pathological */ \
|
||||
XX(5, CONNECT, CONNECT) \
|
||||
XX(6, OPTIONS, OPTIONS) \
|
||||
XX(7, TRACE, TRACE) \
|
||||
/* webdav */ \
|
||||
XX(8, COPY, COPY) \
|
||||
XX(9, LOCK, LOCK) \
|
||||
XX(10, MKCOL, MKCOL) \
|
||||
XX(11, MOVE, MOVE) \
|
||||
XX(12, PROPFIND, PROPFIND) \
|
||||
XX(13, PROPPATCH, PROPPATCH) \
|
||||
XX(14, SEARCH, SEARCH) \
|
||||
XX(15, UNLOCK, UNLOCK) \
|
||||
/* subversion */ \
|
||||
XX(16, REPORT, REPORT) \
|
||||
XX(17, MKACTIVITY, MKACTIVITY) \
|
||||
XX(18, CHECKOUT, CHECKOUT) \
|
||||
XX(19, MERGE, MERGE) \
|
||||
/* upnp */ \
|
||||
XX(20, MSEARCH, M-SEARCH) \
|
||||
XX(21, NOTIFY, NOTIFY) \
|
||||
XX(22, SUBSCRIBE, SUBSCRIBE) \
|
||||
XX(23, UNSUBSCRIBE, UNSUBSCRIBE) \
|
||||
/* RFC-5789 */ \
|
||||
XX(24, PATCH, PATCH) \
|
||||
XX(25, PURGE, PURGE) \
|
||||
|
||||
/* Transfer Encodings */
|
||||
#define HTTP_IDENTITY 0x01
|
||||
#define HTTP_CHUNKED 0x02
|
||||
enum http_method
|
||||
{
|
||||
#define XX(num, name, string) HTTP_##name = num,
|
||||
HTTP_METHOD_MAP(XX)
|
||||
#undef XX
|
||||
};
|
||||
|
||||
|
||||
enum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH };
|
||||
|
||||
|
||||
/* Flag values for http_parser.flags field */
|
||||
enum flags
|
||||
{ F_CHUNKED = 1 << 0
|
||||
, F_CONNECTION_KEEP_ALIVE = 1 << 1
|
||||
, F_CONNECTION_CLOSE = 1 << 2
|
||||
, F_TRAILING = 1 << 3
|
||||
, F_UPGRADE = 1 << 4
|
||||
, F_SKIPBODY = 1 << 5
|
||||
};
|
||||
|
||||
|
||||
/* Map for errno-related constants
|
||||
*
|
||||
* The provided argument should be a macro that takes 2 arguments.
|
||||
*/
|
||||
#define HTTP_ERRNO_MAP(XX) \
|
||||
/* No error */ \
|
||||
XX(OK, "success") \
|
||||
\
|
||||
/* Callback-related errors */ \
|
||||
XX(CB_message_begin, "the on_message_begin callback failed") \
|
||||
XX(CB_url, "the on_url callback failed") \
|
||||
XX(CB_header_field, "the on_header_field callback failed") \
|
||||
XX(CB_header_value, "the on_header_value callback failed") \
|
||||
XX(CB_headers_complete, "the on_headers_complete callback failed") \
|
||||
XX(CB_body, "the on_body callback failed") \
|
||||
XX(CB_message_complete, "the on_message_complete callback failed") \
|
||||
\
|
||||
/* Parsing-related errors */ \
|
||||
XX(INVALID_EOF_STATE, "stream ended at an unexpected time") \
|
||||
XX(HEADER_OVERFLOW, \
|
||||
"too many header bytes seen; overflow detected") \
|
||||
XX(CLOSED_CONNECTION, \
|
||||
"data received after completed connection: close message") \
|
||||
XX(INVALID_VERSION, "invalid HTTP version") \
|
||||
XX(INVALID_STATUS, "invalid HTTP status code") \
|
||||
XX(INVALID_METHOD, "invalid HTTP method") \
|
||||
XX(INVALID_URL, "invalid URL") \
|
||||
XX(INVALID_HOST, "invalid host") \
|
||||
XX(INVALID_PORT, "invalid port") \
|
||||
XX(INVALID_PATH, "invalid path") \
|
||||
XX(INVALID_QUERY_STRING, "invalid query string") \
|
||||
XX(INVALID_FRAGMENT, "invalid fragment") \
|
||||
XX(LF_EXPECTED, "LF character expected") \
|
||||
XX(INVALID_HEADER_TOKEN, "invalid character in header") \
|
||||
XX(INVALID_CONTENT_LENGTH, \
|
||||
"invalid character in content-length header") \
|
||||
XX(INVALID_CHUNK_SIZE, \
|
||||
"invalid character in chunk size header") \
|
||||
XX(INVALID_CONSTANT, "invalid constant string") \
|
||||
XX(INVALID_INTERNAL_STATE, "encountered unexpected internal state")\
|
||||
XX(STRICT, "strict mode assertion failed") \
|
||||
XX(PAUSED, "parser is paused") \
|
||||
XX(UNKNOWN, "an unknown error occurred")
|
||||
|
||||
|
||||
/* Define HPE_* values for each errno value above */
|
||||
#define HTTP_ERRNO_GEN(n, s) HPE_##n,
|
||||
enum http_errno {
|
||||
HTTP_ERRNO_MAP(HTTP_ERRNO_GEN)
|
||||
};
|
||||
#undef HTTP_ERRNO_GEN
|
||||
|
||||
|
||||
/* Get an http_errno value from an http_parser */
|
||||
#define HTTP_PARSER_ERRNO(p) ((enum http_errno) (p)->http_errno)
|
||||
|
||||
/* Get the line number that generated the current error */
|
||||
#if HTTP_PARSER_DEBUG
|
||||
#define HTTP_PARSER_ERRNO_LINE(p) ((p)->error_lineno)
|
||||
#else
|
||||
#define HTTP_PARSER_ERRNO_LINE(p) 0
|
||||
#endif
|
||||
|
||||
enum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE };
|
||||
|
||||
struct http_parser {
|
||||
/** PRIVATE **/
|
||||
int cs;
|
||||
enum http_parser_type type;
|
||||
unsigned char type : 2; /* enum http_parser_type */
|
||||
unsigned char flags : 6; /* F_* values from 'flags' enum; semi-public */
|
||||
unsigned char state; /* enum state from http_parser.c */
|
||||
unsigned char header_state; /* enum header_state from http_parser.c */
|
||||
unsigned char index; /* index into current matcher */
|
||||
|
||||
size_t chunk_size;
|
||||
|
||||
/**
|
||||
XXX
|
||||
do this so no other code has to change, but make the field only 1 byte wide
|
||||
instead of 2 (on x86/x86_64).
|
||||
|
||||
doing this not only shrinks the sizeof this struct by a byte but it ALSO
|
||||
makes wrapping this in FFI way easier.
|
||||
*/
|
||||
union {
|
||||
struct {
|
||||
unsigned eating:1;
|
||||
unsigned error:1;
|
||||
};
|
||||
struct {
|
||||
unsigned char _flags;
|
||||
};
|
||||
};
|
||||
|
||||
size_t body_read;
|
||||
|
||||
const char *header_field_mark;
|
||||
size_t header_field_size;
|
||||
const char *header_value_mark;
|
||||
size_t header_value_size;
|
||||
const char *query_string_mark;
|
||||
size_t query_string_size;
|
||||
const char *path_mark;
|
||||
size_t path_size;
|
||||
const char *uri_mark;
|
||||
size_t uri_size;
|
||||
const char *fragment_mark;
|
||||
size_t fragment_size;
|
||||
uint32_t nread; /* # bytes read in various scenarios */
|
||||
uint64_t content_length; /* # bytes in body (0 if no Content-Length header) */
|
||||
|
||||
/** READ-ONLY **/
|
||||
unsigned short http_major;
|
||||
unsigned short http_minor;
|
||||
unsigned short status_code; /* responses only */
|
||||
unsigned short method; /* requests only */
|
||||
short transfer_encoding;
|
||||
unsigned short version_major;
|
||||
unsigned short version_minor;
|
||||
short keep_alive;
|
||||
size_t content_length;
|
||||
unsigned char method; /* requests only */
|
||||
unsigned char http_errno : 7;
|
||||
|
||||
/* 1 = Upgrade header was present and the parser has exited because of that.
|
||||
* 0 = No upgrade header present.
|
||||
* Should be checked when http_parser_execute() returns in addition to
|
||||
* error checking.
|
||||
*/
|
||||
unsigned char upgrade : 1;
|
||||
|
||||
#if HTTP_PARSER_DEBUG
|
||||
uint32_t error_lineno;
|
||||
#endif
|
||||
|
||||
/** PUBLIC **/
|
||||
void *data; /* A pointer to get hook to the "connection" or "socket" object */
|
||||
};
|
||||
|
||||
/* an ordered list of callbacks */
|
||||
|
||||
struct http_parser_settings {
|
||||
http_cb on_message_begin;
|
||||
|
||||
/* requests only */
|
||||
http_data_cb on_path;
|
||||
http_data_cb on_query_string;
|
||||
http_data_cb on_uri;
|
||||
http_data_cb on_fragment;
|
||||
|
||||
http_data_cb on_url;
|
||||
http_data_cb on_header_field;
|
||||
http_data_cb on_header_value;
|
||||
http_cb on_headers_complete;
|
||||
@@ -133,18 +248,71 @@ struct http_parser {
|
||||
http_cb on_message_complete;
|
||||
};
|
||||
|
||||
/* Initializes an http_parser structure. The second argument specifies if
|
||||
* it will be parsing requests or responses.
|
||||
|
||||
enum http_parser_url_fields
|
||||
{ UF_SCHEMA = 0
|
||||
, UF_HOST = 1
|
||||
, UF_PORT = 2
|
||||
, UF_PATH = 3
|
||||
, UF_QUERY = 4
|
||||
, UF_FRAGMENT = 5
|
||||
, UF_MAX = 6
|
||||
};
|
||||
|
||||
|
||||
/* Result structure for http_parser_parse_url().
|
||||
*
|
||||
* Callers should index into field_data[] with UF_* values iff field_set
|
||||
* has the relevant (1 << UF_*) bit set. As a courtesy to clients (and
|
||||
* because we probably have padding left over), we convert any port to
|
||||
* a uint16_t.
|
||||
*/
|
||||
void http_parser_init (http_parser *parser, enum http_parser_type);
|
||||
struct http_parser_url {
|
||||
uint16_t field_set; /* Bitmask of (1 << UF_*) values */
|
||||
uint16_t port; /* Converted UF_PORT string */
|
||||
|
||||
size_t http_parser_execute (http_parser *parser, const char *data, size_t len);
|
||||
struct {
|
||||
uint16_t off; /* Offset into buffer in which field starts */
|
||||
uint16_t len; /* Length of run in buffer */
|
||||
} field_data[UF_MAX];
|
||||
};
|
||||
|
||||
int http_parser_has_error (http_parser *parser);
|
||||
|
||||
int http_parser_should_keep_alive (http_parser *parser);
|
||||
void http_parser_init(http_parser *parser, enum http_parser_type type);
|
||||
|
||||
|
||||
size_t http_parser_execute(http_parser *parser,
|
||||
const http_parser_settings *settings,
|
||||
const char *data,
|
||||
size_t len);
|
||||
|
||||
|
||||
/* If http_should_keep_alive() in the on_headers_complete or
|
||||
* on_message_complete callback returns true, then this will be should be
|
||||
* the last message on the connection.
|
||||
* If you are the server, respond with the "Connection: close" header.
|
||||
* If you are the client, close the connection.
|
||||
*/
|
||||
int http_should_keep_alive(http_parser *parser);
|
||||
|
||||
/* Returns a string version of the HTTP method. */
|
||||
const char *http_method_str(enum http_method m);
|
||||
|
||||
/* Return a string name of the given error */
|
||||
const char *http_errno_name(enum http_errno err);
|
||||
|
||||
/* Return a string description of the given error */
|
||||
const char *http_errno_description(enum http_errno err);
|
||||
|
||||
/* Parse a URL; return nonzero on failure */
|
||||
int http_parser_parse_url(const char *buf, size_t buflen,
|
||||
int is_connect,
|
||||
struct http_parser_url *u);
|
||||
|
||||
/* Pause or un-pause the parser; a nonzero value pauses */
|
||||
void http_parser_pause(http_parser *parser, int paused);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
502
deps/http_parser/http_parser.rl
vendored
502
deps/http_parser/http_parser.rl
vendored
@@ -1,502 +0,0 @@
|
||||
/* Copyright (c) 2008, 2009 Ryan Dahl (ry@tinyclouds.org)
|
||||
* Based on Zed Shaw's Mongrel, copyright (c) Zed A. Shaw
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include "http_parser.h"
|
||||
#include <limits.h>
|
||||
#include <assert.h>
|
||||
|
||||
static int unhex[] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
|
||||
,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
|
||||
,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
|
||||
, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1
|
||||
,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1
|
||||
,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
|
||||
,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1
|
||||
,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
|
||||
};
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
#define MIN(a,b) (a < b ? a : b)
|
||||
#define NULL (void*)(0)
|
||||
|
||||
#define MAX_FIELD_SIZE 80*1024
|
||||
|
||||
#define REMAINING (unsigned long)(pe - p)
|
||||
#define CALLBACK(FOR) \
|
||||
do { \
|
||||
if (parser->FOR##_mark) { \
|
||||
parser->FOR##_size += p - parser->FOR##_mark; \
|
||||
if (parser->FOR##_size > MAX_FIELD_SIZE) { \
|
||||
parser->error = TRUE; \
|
||||
return 0; \
|
||||
} \
|
||||
if (parser->on_##FOR) { \
|
||||
callback_return_value = parser->on_##FOR(parser, \
|
||||
parser->FOR##_mark, \
|
||||
p - parser->FOR##_mark); \
|
||||
} \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define RESET_PARSER(parser) \
|
||||
parser->chunk_size = 0; \
|
||||
parser->eating = 0; \
|
||||
parser->header_field_mark = NULL; \
|
||||
parser->header_value_mark = NULL; \
|
||||
parser->query_string_mark = NULL; \
|
||||
parser->path_mark = NULL; \
|
||||
parser->uri_mark = NULL; \
|
||||
parser->fragment_mark = NULL; \
|
||||
parser->status_code = 0; \
|
||||
parser->method = 0; \
|
||||
parser->transfer_encoding = HTTP_IDENTITY; \
|
||||
parser->version_major = 0; \
|
||||
parser->version_minor = 0; \
|
||||
parser->keep_alive = -1; \
|
||||
parser->content_length = 0; \
|
||||
parser->body_read = 0;
|
||||
|
||||
#define END_REQUEST \
|
||||
do { \
|
||||
if (parser->on_message_complete) { \
|
||||
callback_return_value = \
|
||||
parser->on_message_complete(parser); \
|
||||
} \
|
||||
RESET_PARSER(parser); \
|
||||
} while (0)
|
||||
|
||||
#define SKIP_BODY(nskip) \
|
||||
do { \
|
||||
tmp = (nskip); \
|
||||
if (parser->on_body && tmp > 0) { \
|
||||
callback_return_value = parser->on_body(parser, p, tmp); \
|
||||
} \
|
||||
if (callback_return_value == 0) { \
|
||||
p += tmp; \
|
||||
parser->body_read += tmp; \
|
||||
parser->chunk_size -= tmp; \
|
||||
if (0 == parser->chunk_size) { \
|
||||
parser->eating = FALSE; \
|
||||
if (parser->transfer_encoding == HTTP_IDENTITY) { \
|
||||
END_REQUEST; \
|
||||
} \
|
||||
} else { \
|
||||
parser->eating = TRUE; \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
%%{
|
||||
machine http_parser;
|
||||
|
||||
action mark_header_field {
|
||||
parser->header_field_mark = p;
|
||||
parser->header_field_size = 0;
|
||||
}
|
||||
|
||||
action mark_header_value {
|
||||
parser->header_value_mark = p;
|
||||
parser->header_value_size = 0;
|
||||
}
|
||||
|
||||
action mark_fragment {
|
||||
parser->fragment_mark = p;
|
||||
parser->fragment_size = 0;
|
||||
}
|
||||
|
||||
action mark_query_string {
|
||||
parser->query_string_mark = p;
|
||||
parser->query_string_size = 0;
|
||||
}
|
||||
|
||||
action mark_request_path {
|
||||
parser->path_mark = p;
|
||||
parser->path_size = 0;
|
||||
}
|
||||
|
||||
action mark_request_uri {
|
||||
parser->uri_mark = p;
|
||||
parser->uri_size = 0;
|
||||
}
|
||||
|
||||
action header_field {
|
||||
CALLBACK(header_field);
|
||||
if (callback_return_value != 0) {
|
||||
parser->error = TRUE;
|
||||
return 0;
|
||||
}
|
||||
parser->header_field_mark = NULL;
|
||||
parser->header_field_size = 0;
|
||||
}
|
||||
|
||||
action header_value {
|
||||
CALLBACK(header_value);
|
||||
if (callback_return_value != 0) {
|
||||
parser->error = TRUE;
|
||||
return 0;
|
||||
}
|
||||
parser->header_value_mark = NULL;
|
||||
parser->header_value_size = 0;
|
||||
}
|
||||
|
||||
action request_uri {
|
||||
CALLBACK(uri);
|
||||
if (callback_return_value != 0) {
|
||||
parser->error = TRUE;
|
||||
return 0;
|
||||
}
|
||||
parser->uri_mark = NULL;
|
||||
parser->uri_size = 0;
|
||||
}
|
||||
|
||||
action fragment {
|
||||
CALLBACK(fragment);
|
||||
if (callback_return_value != 0) {
|
||||
parser->error = TRUE;
|
||||
return 0;
|
||||
}
|
||||
parser->fragment_mark = NULL;
|
||||
parser->fragment_size = 0;
|
||||
}
|
||||
|
||||
action query_string {
|
||||
CALLBACK(query_string);
|
||||
if (callback_return_value != 0) {
|
||||
parser->error = TRUE;
|
||||
return 0;
|
||||
}
|
||||
parser->query_string_mark = NULL;
|
||||
parser->query_string_size = 0;
|
||||
}
|
||||
|
||||
action request_path {
|
||||
CALLBACK(path);
|
||||
if (callback_return_value != 0) {
|
||||
parser->error = TRUE;
|
||||
return 0;
|
||||
}
|
||||
parser->path_mark = NULL;
|
||||
parser->path_size = 0;
|
||||
}
|
||||
|
||||
action headers_complete {
|
||||
if(parser->on_headers_complete) {
|
||||
callback_return_value = parser->on_headers_complete(parser);
|
||||
if (callback_return_value != 0) {
|
||||
parser->error = TRUE;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
action begin_message {
|
||||
if(parser->on_message_begin) {
|
||||
callback_return_value = parser->on_message_begin(parser);
|
||||
if (callback_return_value != 0) {
|
||||
parser->error = TRUE;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
action content_length {
|
||||
if (parser->content_length > INT_MAX) {
|
||||
parser->error = TRUE;
|
||||
return 0;
|
||||
}
|
||||
parser->content_length *= 10;
|
||||
parser->content_length += *p - '0';
|
||||
}
|
||||
|
||||
action status_code {
|
||||
parser->status_code *= 10;
|
||||
parser->status_code += *p - '0';
|
||||
}
|
||||
|
||||
action use_identity_encoding { parser->transfer_encoding = HTTP_IDENTITY; }
|
||||
action use_chunked_encoding { parser->transfer_encoding = HTTP_CHUNKED; }
|
||||
|
||||
action set_keep_alive { parser->keep_alive = TRUE; }
|
||||
action set_not_keep_alive { parser->keep_alive = FALSE; }
|
||||
|
||||
action version_major {
|
||||
parser->version_major *= 10;
|
||||
parser->version_major += *p - '0';
|
||||
}
|
||||
|
||||
action version_minor {
|
||||
parser->version_minor *= 10;
|
||||
parser->version_minor += *p - '0';
|
||||
}
|
||||
|
||||
action add_to_chunk_size {
|
||||
parser->chunk_size *= 16;
|
||||
parser->chunk_size += unhex[(int)*p];
|
||||
}
|
||||
|
||||
action skip_chunk_data {
|
||||
SKIP_BODY(MIN(parser->chunk_size, REMAINING));
|
||||
if (callback_return_value != 0) {
|
||||
parser->error = TRUE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
fhold;
|
||||
if (parser->chunk_size > REMAINING) {
|
||||
fbreak;
|
||||
} else {
|
||||
fgoto chunk_end;
|
||||
}
|
||||
}
|
||||
|
||||
action end_chunked_body {
|
||||
END_REQUEST;
|
||||
if (parser->type == HTTP_REQUEST) {
|
||||
fnext Requests;
|
||||
} else {
|
||||
fnext Responses;
|
||||
}
|
||||
}
|
||||
|
||||
action body_logic {
|
||||
if (parser->transfer_encoding == HTTP_CHUNKED) {
|
||||
fnext ChunkedBody;
|
||||
} else {
|
||||
/* this is pretty stupid. i'd prefer to combine this with skip_chunk_data */
|
||||
parser->chunk_size = parser->content_length;
|
||||
p += 1;
|
||||
|
||||
SKIP_BODY(MIN(REMAINING, parser->content_length));
|
||||
|
||||
if (callback_return_value != 0) {
|
||||
parser->error = TRUE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
fhold;
|
||||
if(parser->chunk_size > REMAINING) {
|
||||
fbreak;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CRLF = "\r\n";
|
||||
|
||||
# character types
|
||||
CTL = (cntrl | 127);
|
||||
safe = ("$" | "-" | "_" | ".");
|
||||
extra = ("!" | "*" | "'" | "(" | ")" | ",");
|
||||
reserved = (";" | "/" | "?" | ":" | "@" | "&" | "=" | "+");
|
||||
unsafe = (CTL | " " | "\"" | "#" | "%" | "<" | ">");
|
||||
national = any -- (alpha | digit | reserved | extra | safe | unsafe);
|
||||
unreserved = (alpha | digit | safe | extra | national);
|
||||
escape = ("%" xdigit xdigit);
|
||||
uchar = (unreserved | escape);
|
||||
pchar = (uchar | ":" | "@" | "&" | "=" | "+");
|
||||
tspecials = ("(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\\" | "\""
|
||||
| "/" | "[" | "]" | "?" | "=" | "{" | "}" | " " | "\t");
|
||||
|
||||
# elements
|
||||
token = (ascii -- (CTL | tspecials));
|
||||
quote = "\"";
|
||||
# qdtext = token -- "\"";
|
||||
# quoted_pair = "\" ascii;
|
||||
# quoted_string = "\"" (qdtext | quoted_pair )* "\"";
|
||||
|
||||
# headers
|
||||
|
||||
Method = ( "COPY" %{ parser->method = HTTP_COPY; }
|
||||
| "DELETE" %{ parser->method = HTTP_DELETE; }
|
||||
| "GET" %{ parser->method = HTTP_GET; }
|
||||
| "HEAD" %{ parser->method = HTTP_HEAD; }
|
||||
| "LOCK" %{ parser->method = HTTP_LOCK; }
|
||||
| "MKCOL" %{ parser->method = HTTP_MKCOL; }
|
||||
| "MOVE" %{ parser->method = HTTP_MOVE; }
|
||||
| "OPTIONS" %{ parser->method = HTTP_OPTIONS; }
|
||||
| "POST" %{ parser->method = HTTP_POST; }
|
||||
| "PROPFIND" %{ parser->method = HTTP_PROPFIND; }
|
||||
| "PROPPATCH" %{ parser->method = HTTP_PROPPATCH; }
|
||||
| "PUT" %{ parser->method = HTTP_PUT; }
|
||||
| "TRACE" %{ parser->method = HTTP_TRACE; }
|
||||
| "UNLOCK" %{ parser->method = HTTP_UNLOCK; }
|
||||
); # Not allowing extension methods
|
||||
|
||||
HTTP_Version = "HTTP/" digit $version_major "." digit $version_minor;
|
||||
|
||||
scheme = ( alpha | digit | "+" | "-" | "." )* ;
|
||||
absolute_uri = (scheme ":" (uchar | reserved )*);
|
||||
path = ( pchar+ ( "/" pchar* )* ) ;
|
||||
query = ( uchar | reserved )* >mark_query_string %query_string ;
|
||||
param = ( pchar | "/" )* ;
|
||||
params = ( param ( ";" param )* ) ;
|
||||
rel_path = ( path? (";" params)? ) ;
|
||||
absolute_path = ( "/"+ rel_path ) >mark_request_path %request_path ("?" query)?;
|
||||
Request_URI = ( "*" | absolute_uri | absolute_path ) >mark_request_uri %request_uri;
|
||||
Fragment = ( uchar | reserved )* >mark_fragment %fragment;
|
||||
|
||||
field_name = ( token -- ":" )+;
|
||||
Field_Name = field_name >mark_header_field %header_field;
|
||||
|
||||
field_value = ((any - " ") any*)?;
|
||||
Field_Value = field_value >mark_header_value %header_value;
|
||||
|
||||
hsep = ":" " "*;
|
||||
header = (field_name hsep field_value) :> CRLF;
|
||||
Header = ( ("Content-Length"i hsep digit+ $content_length)
|
||||
| ("Connection"i hsep
|
||||
( "Keep-Alive"i %set_keep_alive
|
||||
| "close"i %set_not_keep_alive
|
||||
)
|
||||
)
|
||||
| ("Transfer-Encoding"i %use_chunked_encoding hsep "identity" %use_identity_encoding)
|
||||
| (Field_Name hsep Field_Value)
|
||||
) :> CRLF;
|
||||
|
||||
Headers = (Header)* :> CRLF @headers_complete;
|
||||
|
||||
Request_Line = ( Method " " Request_URI ("#" Fragment)? " " HTTP_Version CRLF ) ;
|
||||
|
||||
StatusCode = (digit digit digit) $status_code;
|
||||
ReasonPhrase = ascii* -- ("\r" | "\n");
|
||||
StatusLine = HTTP_Version " " StatusCode (" " ReasonPhrase)? CRLF;
|
||||
|
||||
# chunked message
|
||||
trailing_headers = header*;
|
||||
#chunk_ext_val = token | quoted_string;
|
||||
chunk_ext_val = token*;
|
||||
chunk_ext_name = token*;
|
||||
chunk_extension = ( ";" " "* chunk_ext_name ("=" chunk_ext_val)? )*;
|
||||
last_chunk = "0"+ chunk_extension CRLF;
|
||||
chunk_size = (xdigit* [1-9a-fA-F] xdigit*) $add_to_chunk_size;
|
||||
chunk_end = CRLF;
|
||||
chunk_body = any >skip_chunk_data;
|
||||
chunk_begin = chunk_size chunk_extension CRLF;
|
||||
chunk = chunk_begin chunk_body chunk_end;
|
||||
ChunkedBody := chunk* last_chunk trailing_headers CRLF @end_chunked_body;
|
||||
|
||||
Request = (Request_Line Headers) >begin_message @body_logic;
|
||||
Response = (StatusLine Headers) >begin_message @body_logic;
|
||||
|
||||
Requests := Request*;
|
||||
Responses := Response*;
|
||||
|
||||
main := any >{
|
||||
fhold;
|
||||
if (parser->type == HTTP_REQUEST) {
|
||||
fgoto Requests;
|
||||
} else {
|
||||
fgoto Responses;
|
||||
}
|
||||
};
|
||||
|
||||
}%%
|
||||
|
||||
%% write data;
|
||||
|
||||
void
|
||||
http_parser_init (http_parser *parser, enum http_parser_type type)
|
||||
{
|
||||
int cs = 0;
|
||||
%% write init;
|
||||
parser->cs = cs;
|
||||
parser->type = type;
|
||||
parser->error = 0;
|
||||
|
||||
parser->on_message_begin = NULL;
|
||||
parser->on_path = NULL;
|
||||
parser->on_query_string = NULL;
|
||||
parser->on_uri = NULL;
|
||||
parser->on_fragment = NULL;
|
||||
parser->on_header_field = NULL;
|
||||
parser->on_header_value = NULL;
|
||||
parser->on_headers_complete = NULL;
|
||||
parser->on_body = NULL;
|
||||
parser->on_message_complete = NULL;
|
||||
|
||||
RESET_PARSER(parser);
|
||||
}
|
||||
|
||||
/** exec **/
|
||||
size_t
|
||||
http_parser_execute (http_parser *parser, const char *buffer, size_t len)
|
||||
{
|
||||
size_t tmp; // REMOVE ME this is extremely hacky
|
||||
int callback_return_value = 0;
|
||||
const char *p, *pe;
|
||||
int cs = parser->cs;
|
||||
|
||||
p = buffer;
|
||||
pe = buffer+len;
|
||||
|
||||
if (0 < parser->chunk_size && parser->eating) {
|
||||
/* eat body */
|
||||
SKIP_BODY(MIN(len, parser->chunk_size));
|
||||
if (callback_return_value != 0) {
|
||||
parser->error = TRUE;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (parser->header_field_mark) parser->header_field_mark = buffer;
|
||||
if (parser->header_value_mark) parser->header_value_mark = buffer;
|
||||
if (parser->fragment_mark) parser->fragment_mark = buffer;
|
||||
if (parser->query_string_mark) parser->query_string_mark = buffer;
|
||||
if (parser->path_mark) parser->path_mark = buffer;
|
||||
if (parser->uri_mark) parser->uri_mark = buffer;
|
||||
|
||||
%% write exec;
|
||||
|
||||
parser->cs = cs;
|
||||
|
||||
CALLBACK(header_field);
|
||||
CALLBACK(header_value);
|
||||
CALLBACK(fragment);
|
||||
CALLBACK(query_string);
|
||||
CALLBACK(path);
|
||||
CALLBACK(uri);
|
||||
|
||||
assert(p <= pe && "buffer overflow after parsing execute");
|
||||
return(p - buffer);
|
||||
}
|
||||
|
||||
int
|
||||
http_parser_has_error (http_parser *parser)
|
||||
{
|
||||
if (parser->error) return TRUE;
|
||||
return parser->cs == http_parser_error;
|
||||
}
|
||||
|
||||
int
|
||||
http_parser_should_keep_alive (http_parser *parser)
|
||||
{
|
||||
if (parser->keep_alive == -1)
|
||||
if (parser->version_major == 1)
|
||||
return (parser->version_minor != 0);
|
||||
else if (parser->version_major == 0)
|
||||
return FALSE;
|
||||
else
|
||||
return TRUE;
|
||||
else
|
||||
return parser->keep_alive;
|
||||
}
|
||||
1814
deps/http_parser/test.c
vendored
1814
deps/http_parser/test.c
vendored
File diff suppressed because it is too large
Load Diff
19
deps/libeio/Changes
vendored
19
deps/libeio/Changes
vendored
@@ -1,19 +0,0 @@
|
||||
Revision history for libeio
|
||||
|
||||
TODO: maybe add mincore support? available on at leats darwin, solaris, linux, freebsd
|
||||
|
||||
1.0
|
||||
- readdir: correctly handle malloc failures.
|
||||
- readdir: new flags argument, can return inode
|
||||
and possibly filetype, can sort in various ways.
|
||||
- readdir: stop immediately when cancelled, do
|
||||
not continue reading the directory.
|
||||
- fix return value of eio_sendfile_sync.
|
||||
- include sys/mman.h for msync.
|
||||
- added EIO_STACKSIZE.
|
||||
- added msync, mtouch support (untested).
|
||||
- added sync_file_range (untested).
|
||||
- fixed custom support.
|
||||
- use a more robust feed-add detection method.
|
||||
- "outbundled" from IO::AIO.
|
||||
|
||||
15
deps/libeio/Makefile.am
vendored
15
deps/libeio/Makefile.am
vendored
@@ -1,15 +0,0 @@
|
||||
AUTOMAKE_OPTIONS = foreign no-dependencies
|
||||
|
||||
VERSION_INFO = 1:0
|
||||
|
||||
EXTRA_DIST = LICENSE Changes autogen.sh
|
||||
|
||||
#man_MANS = ev.3
|
||||
|
||||
include_HEADERS = eio.h
|
||||
|
||||
lib_LTLIBRARIES = libeio.la
|
||||
|
||||
libeio_la_SOURCES = eio.c xthread.h config.h
|
||||
libeio_la_LDFLAGS = -version-info $(VERSION_INFO)
|
||||
|
||||
7243
deps/libeio/aclocal.m4
vendored
7243
deps/libeio/aclocal.m4
vendored
File diff suppressed because it is too large
Load Diff
5
deps/libeio/autogen.sh
vendored
5
deps/libeio/autogen.sh
vendored
@@ -1,5 +0,0 @@
|
||||
libtoolize
|
||||
aclocal
|
||||
automake --add-missing
|
||||
autoconf
|
||||
autoheader
|
||||
73
deps/libeio/config.h.in
vendored
73
deps/libeio/config.h.in
vendored
@@ -1,73 +0,0 @@
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||
#undef HAVE_DLFCN_H
|
||||
|
||||
/* fdatasync(2) is available */
|
||||
#undef HAVE_FDATASYNC
|
||||
|
||||
/* futimes(2) is available */
|
||||
#undef HAVE_FUTIMES
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#undef HAVE_INTTYPES_H
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#undef HAVE_MEMORY_H
|
||||
|
||||
/* pread(2) and pwrite(2) are available */
|
||||
#undef HAVE_PREADWRITE
|
||||
|
||||
/* readahead(2) is available (linux) */
|
||||
#undef HAVE_READAHEAD
|
||||
|
||||
/* sendfile(2) is available and supported */
|
||||
#undef HAVE_SENDFILE
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#undef HAVE_STDINT_H
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#undef HAVE_STDLIB_H
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#undef HAVE_STRINGS_H
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#undef HAVE_STRING_H
|
||||
|
||||
/* sync_file_range(2) is available */
|
||||
#undef HAVE_SYNC_FILE_RANGE
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#undef HAVE_SYS_STAT_H
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#undef HAVE_SYS_TYPES_H
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#undef HAVE_UNISTD_H
|
||||
|
||||
/* Name of package */
|
||||
#undef PACKAGE
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#undef PACKAGE_BUGREPORT
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#undef PACKAGE_NAME
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#undef PACKAGE_STRING
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#undef PACKAGE_TARNAME
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#undef PACKAGE_VERSION
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* Version number of package */
|
||||
#undef VERSION
|
||||
22
deps/libeio/configure.ac
vendored
22
deps/libeio/configure.ac
vendored
@@ -1,22 +0,0 @@
|
||||
AC_PREREQ(2.59)
|
||||
AC_INIT
|
||||
AC_CONFIG_SRCDIR([eio.h])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
|
||||
AM_INIT_AUTOMAKE(libeio,1.0)
|
||||
AM_MAINTAINER_MODE
|
||||
AC_PROG_LIBTOOL
|
||||
|
||||
AC_PROG_CC
|
||||
|
||||
if test "x$GCC" = xyes ; then
|
||||
CFLAGS="$CFLAGS -O3"
|
||||
fi
|
||||
|
||||
dnl somebody will forgive me
|
||||
CFLAGS="-D_GNU_SOURCE"
|
||||
|
||||
m4_include([libeio.m4])
|
||||
|
||||
AC_CONFIG_FILES([Makefile])
|
||||
AC_OUTPUT
|
||||
1896
deps/libeio/eio.c
vendored
1896
deps/libeio/eio.c
vendored
File diff suppressed because it is too large
Load Diff
292
deps/libeio/eio.h
vendored
292
deps/libeio/eio.h
vendored
@@ -1,292 +0,0 @@
|
||||
/*
|
||||
* libeio API header
|
||||
*
|
||||
* Copyright (c) 2007,2008,2009 Marc Alexander Lehmann <libeio@schmorp.de>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modifica-
|
||||
* tion, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-
|
||||
* CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
|
||||
* CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-
|
||||
* ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* the GNU General Public License ("GPL") version 2 or any later version,
|
||||
* in which case the provisions of the GPL are applicable instead of
|
||||
* the above. If you wish to allow the use of your version of this file
|
||||
* only under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the BSD license, indicate your decision
|
||||
* by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file under
|
||||
* either the BSD or the GPL.
|
||||
*/
|
||||
|
||||
#ifndef EIO_H_
|
||||
#define EIO_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stddef.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
typedef struct eio_req eio_req;
|
||||
typedef struct eio_dirent eio_dirent;
|
||||
|
||||
typedef int (*eio_cb)(eio_req *req);
|
||||
|
||||
#ifndef EIO_REQ_MEMBERS
|
||||
# define EIO_REQ_MEMBERS
|
||||
#endif
|
||||
|
||||
#ifndef EIO_STRUCT_STAT
|
||||
# define EIO_STRUCT_STAT struct stat
|
||||
#endif
|
||||
|
||||
/* for readdir */
|
||||
|
||||
/* eio_readdir flags */
|
||||
enum {
|
||||
EIO_READDIR_DENTS = 0x01, /* ptr2 contains eio_dirents, not just the (unsorted) names */
|
||||
EIO_READDIR_DIRS_FIRST = 0x02, /* dirents gets sorted into a good stat() ing order to find directories first */
|
||||
EIO_READDIR_STAT_ORDER = 0x04, /* dirents gets sorted into a good stat() ing order to quickly stat all files */
|
||||
EIO_READDIR_FOUND_UNKNOWN = 0x80, /* set by eio_readdir when *_ARRAY was set and any TYPE=UNKNOWN's were found */
|
||||
|
||||
EIO_READDIR_CUSTOM1 = 0x100, /* for use by apps */
|
||||
EIO_READDIR_CUSTOM2 = 0x200 /* for use by apps */
|
||||
};
|
||||
|
||||
/* using "typical" values in the hope that the compiler will do something sensible */
|
||||
enum eio_dtype {
|
||||
EIO_DT_UNKNOWN = 0,
|
||||
EIO_DT_FIFO = 1,
|
||||
EIO_DT_CHR = 2,
|
||||
EIO_DT_MPC = 3, /* multiplexed char device (v7+coherent) */
|
||||
EIO_DT_DIR = 4,
|
||||
EIO_DT_NAM = 5, /* xenix special named file */
|
||||
EIO_DT_BLK = 6,
|
||||
EIO_DT_MPB = 7, /* multiplexed block device (v7+coherent) */
|
||||
EIO_DT_REG = 8,
|
||||
EIO_DT_NWK = 9, /* HP-UX network special */
|
||||
EIO_DT_CMP = 9, /* VxFS compressed */
|
||||
EIO_DT_LNK = 10,
|
||||
/* DT_SHAD = 11,*/
|
||||
EIO_DT_SOCK = 12,
|
||||
EIO_DT_DOOR = 13, /* solaris door */
|
||||
EIO_DT_WHT = 14,
|
||||
EIO_DT_MAX = 15 /* highest DT_VALUE ever, hopefully */
|
||||
};
|
||||
|
||||
struct eio_dirent {
|
||||
int nameofs; /* offset of null-terminated name string in (char *)req->ptr2 */
|
||||
unsigned short namelen; /* size of filename without trailing 0 */
|
||||
unsigned char type; /* one of EIO_DT_* */
|
||||
signed char score; /* internal use */
|
||||
ino_t inode; /* the inode number, if available, otherwise unspecified */
|
||||
};
|
||||
|
||||
/* eio_sync_file_range flags */
|
||||
|
||||
enum {
|
||||
EIO_SYNC_FILE_RANGE_WAIT_BEFORE = 1,
|
||||
EIO_SYNC_FILE_RANGE_WRITE = 2,
|
||||
EIO_SYNC_FILE_RANGE_WAIT_AFTER = 4
|
||||
};
|
||||
|
||||
typedef double eio_tstamp; /* feel free to use double in your code directly */
|
||||
|
||||
/* the eio request structure */
|
||||
|
||||
enum {
|
||||
EIO_CUSTOM,
|
||||
EIO_OPEN, EIO_CLOSE, EIO_DUP2,
|
||||
EIO_READ, EIO_WRITE,
|
||||
EIO_READAHEAD, EIO_SENDFILE,
|
||||
EIO_STAT, EIO_LSTAT, EIO_FSTAT,
|
||||
EIO_TRUNCATE, EIO_FTRUNCATE,
|
||||
EIO_UTIME, EIO_FUTIME,
|
||||
EIO_CHMOD, EIO_FCHMOD,
|
||||
EIO_CHOWN, EIO_FCHOWN,
|
||||
EIO_SYNC, EIO_FSYNC, EIO_FDATASYNC,
|
||||
EIO_MSYNC, EIO_MTOUCH, EIO_SYNC_FILE_RANGE,
|
||||
EIO_UNLINK, EIO_RMDIR, EIO_MKDIR, EIO_RENAME,
|
||||
EIO_MKNOD, EIO_READDIR,
|
||||
EIO_LINK, EIO_SYMLINK, EIO_READLINK,
|
||||
EIO_GROUP, EIO_NOP,
|
||||
EIO_BUSY
|
||||
};
|
||||
|
||||
/* eio request structure */
|
||||
/* this structure is mostly read-only */
|
||||
/* when initialising it, all members must be zero-initialised */
|
||||
struct eio_req
|
||||
{
|
||||
eio_req volatile *next; /* private ETP */
|
||||
|
||||
ssize_t result; /* result of syscall, e.g. result = read (... */
|
||||
off_t offs; /* read, write, truncate, readahead, sync_file_range: file offset */
|
||||
size_t size; /* read, write, readahead, sendfile, msync, sync_file_range: length */
|
||||
void *ptr1; /* all applicable requests: pathname, old name; readdir: optional eio_dirents */
|
||||
void *ptr2; /* all applicable requests: new name or memory buffer; readdir: name strings */
|
||||
eio_tstamp nv1; /* utime, futime: atime; busy: sleep time */
|
||||
eio_tstamp nv2; /* utime, futime: mtime */
|
||||
|
||||
int type; /* EIO_xxx constant ETP */
|
||||
int int1; /* all applicable requests: file descriptor; sendfile: output fd; open, msync, readdir: flags */
|
||||
long int2; /* chown, fchown: uid; sendfile: input fd; open, chmod, mkdir, mknod: file mode, sync_file_range: flags */
|
||||
long int3; /* chown, fchown: gid; mknod: dev_t */
|
||||
int errorno; /* errno value on syscall return */
|
||||
|
||||
unsigned char flags; /* private */
|
||||
signed char pri; /* the priority */
|
||||
|
||||
void *data;
|
||||
eio_cb finish;
|
||||
void (*destroy)(eio_req *req); /* called when requets no longer needed */
|
||||
void (*feed)(eio_req *req); /* only used for group requests */
|
||||
|
||||
EIO_REQ_MEMBERS
|
||||
|
||||
eio_req *grp, *grp_prev, *grp_next, *grp_first; /* private */
|
||||
};
|
||||
|
||||
/* _private_ flags */
|
||||
enum {
|
||||
EIO_FLAG_CANCELLED = 0x01, /* request was cancelled */
|
||||
EIO_FLAG_PTR1_FREE = 0x02, /* need to free(ptr1) */
|
||||
EIO_FLAG_PTR2_FREE = 0x04, /* need to free(ptr2) */
|
||||
EIO_FLAG_GROUPADD = 0x08 /* some request was added to the group */
|
||||
};
|
||||
|
||||
enum {
|
||||
EIO_PRI_MIN = -4,
|
||||
EIO_PRI_MAX = 4,
|
||||
EIO_PRI_DEFAULT = 0,
|
||||
};
|
||||
|
||||
/* returns < 0 on error, errno set
|
||||
* need_poll, if non-zero, will be called when results are available
|
||||
* and eio_poll_cb needs to be invoked (it MUST NOT call eio_poll_cb itself).
|
||||
* done_poll is called when the need to poll is gone.
|
||||
*/
|
||||
int eio_init (void (*want_poll)(void), void (*done_poll)(void));
|
||||
|
||||
/* must be called regularly to handle pending requests */
|
||||
/* returns 0 if all requests were handled, -1 if not, or the value of EIO_FINISH if != 0 */
|
||||
int eio_poll (void);
|
||||
|
||||
/* stop polling if poll took longer than duration seconds */
|
||||
void eio_set_max_poll_time (eio_tstamp nseconds);
|
||||
/* do not handle more then count requests in one call to eio_poll_cb */
|
||||
void eio_set_max_poll_reqs (unsigned int nreqs);
|
||||
|
||||
/* set minimum required number
|
||||
* maximum wanted number
|
||||
* or maximum idle number of threads */
|
||||
void eio_set_min_parallel (unsigned int nthreads);
|
||||
void eio_set_max_parallel (unsigned int nthreads);
|
||||
void eio_set_max_idle (unsigned int nthreads);
|
||||
|
||||
unsigned int eio_nreqs (void); /* number of requests in-flight */
|
||||
unsigned int eio_nready (void); /* number of not-yet handled requests */
|
||||
unsigned int eio_npending (void); /* numbe rof finished but unhandled requests */
|
||||
unsigned int eio_nthreads (void); /* number of worker threads in use currently */
|
||||
|
||||
/*****************************************************************************/
|
||||
/* convinience wrappers */
|
||||
|
||||
#ifndef EIO_NO_WRAPPERS
|
||||
eio_req *eio_nop (int pri, eio_cb cb, void *data); /* does nothing except go through the whole process */
|
||||
eio_req *eio_busy (eio_tstamp delay, int pri, eio_cb cb, void *data); /* ties a thread for this long, simulating busyness */
|
||||
eio_req *eio_sync (int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_fsync (int fd, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_fdatasync (int fd, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_msync (void *addr, size_t length, int flags, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_mtouch (void *addr, size_t length, int flags, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_sync_file_range (int fd, off_t offset, size_t nbytes, unsigned int flags, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_close (int fd, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_readahead (int fd, off_t offset, size_t length, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_read (int fd, void *buf, size_t length, off_t offset, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_write (int fd, void *buf, size_t length, off_t offset, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_fstat (int fd, int pri, eio_cb cb, void *data); /* stat buffer=ptr2 allocated dynamically */
|
||||
eio_req *eio_futime (int fd, eio_tstamp atime, eio_tstamp mtime, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_ftruncate (int fd, off_t offset, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_fchmod (int fd, mode_t mode, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_fchown (int fd, uid_t uid, gid_t gid, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_dup2 (int fd, int fd2, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_sendfile (int out_fd, int in_fd, off_t in_offset, size_t length, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_open (const char *path, int flags, mode_t mode, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_utime (const char *path, eio_tstamp atime, eio_tstamp mtime, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_truncate (const char *path, off_t offset, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_chown (const char *path, uid_t uid, gid_t gid, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_chmod (const char *path, mode_t mode, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_mkdir (const char *path, mode_t mode, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_readdir (const char *path, int flags, int pri, eio_cb cb, void *data); /* result=ptr2 allocated dynamically */
|
||||
eio_req *eio_rmdir (const char *path, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_unlink (const char *path, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_readlink (const char *path, int pri, eio_cb cb, void *data); /* result=ptr2 allocated dynamically */
|
||||
eio_req *eio_stat (const char *path, int pri, eio_cb cb, void *data); /* stat buffer=ptr2 allocated dynamically */
|
||||
eio_req *eio_lstat (const char *path, int pri, eio_cb cb, void *data); /* stat buffer=ptr2 allocated dynamically */
|
||||
eio_req *eio_mknod (const char *path, mode_t mode, dev_t dev, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_link (const char *path, const char *new_path, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_symlink (const char *path, const char *new_path, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_rename (const char *path, const char *new_path, int pri, eio_cb cb, void *data);
|
||||
eio_req *eio_custom (eio_cb execute, int pri, eio_cb cb, void *data);
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
/* groups */
|
||||
|
||||
eio_req *eio_grp (eio_cb cb, void *data);
|
||||
void eio_grp_feed (eio_req *grp, void (*feed)(eio_req *req), int limit);
|
||||
void eio_grp_limit (eio_req *grp, int limit);
|
||||
void eio_grp_add (eio_req *grp, eio_req *req);
|
||||
void eio_grp_cancel (eio_req *grp); /* cancels all sub requests but not the group */
|
||||
|
||||
/*****************************************************************************/
|
||||
/* request api */
|
||||
|
||||
/* true if the request was cancelled, useful in the invoke callback */
|
||||
#define EIO_CANCELLED(req) ((req)->flags & EIO_FLAG_CANCELLED)
|
||||
|
||||
#define EIO_RESULT(req) ((req)->result)
|
||||
/* returns a pointer to the result buffer allocated by eio */
|
||||
#define EIO_BUF(req) ((req)->ptr2)
|
||||
#define EIO_STAT_BUF(req) ((EIO_STRUCT_STAT *)EIO_BUF(req))
|
||||
#define EIO_PATH(req) ((char *)(req)->ptr1)
|
||||
|
||||
/* submit a request for execution */
|
||||
void eio_submit (eio_req *req);
|
||||
/* cancel a request as soon fast as possible, if possible */
|
||||
void eio_cancel (eio_req *req);
|
||||
/* destroy a request that has never been submitted */
|
||||
void eio_destroy (eio_req *req);
|
||||
|
||||
/*****************************************************************************/
|
||||
/* convinience functions */
|
||||
|
||||
ssize_t eio_sendfile_sync (int ofd, int ifd, off_t offset, size_t count);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
303
deps/libeio/eio.pod
vendored
303
deps/libeio/eio.pod
vendored
@@ -1,303 +0,0 @@
|
||||
=head1 NAME
|
||||
|
||||
libeio - truly asynchronous POSIX I/O
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <eio.h>
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
The newest version of this document is also available as an html-formatted
|
||||
web page you might find easier to navigate when reading it for the first
|
||||
time: L<http://pod.tst.eu/http://cvs.schmorp.de/libeio/eio.pod>.
|
||||
|
||||
Note that this library is a by-product of the C<IO::AIO> perl
|
||||
module, and many of the subtler points regarding requets lifetime
|
||||
and so on are only documented in its documentation at the
|
||||
moment: L<http://pod.tst.eu/http://cvs.schmorp.de/IO-AIO/AIO.pm>.
|
||||
|
||||
=head2 FEATURES
|
||||
|
||||
This library provides fully asynchronous versions of most POSIX functions
|
||||
dealign with I/O. Unlike most asynchronous libraries, this not only
|
||||
includes C<read> and C<write>, but also C<open>, C<stat>, C<unlink> and
|
||||
similar functions, as well as less rarely ones such as C<mknod>, C<futime>
|
||||
or C<readlink>.
|
||||
|
||||
It also offers wrappers around C<sendfile> (Solaris, Linux, HP-UX and
|
||||
FreeBSD, with emulation on other platforms) and C<readahead> (Linux, with
|
||||
emulation elsewhere>).
|
||||
|
||||
The goal is to enbale you to write fully non-blocking programs. For
|
||||
example, in a game server, you would not want to freeze for a few seconds
|
||||
just because the server is running a backup and you happen to call
|
||||
C<readdir>.
|
||||
|
||||
=head2 TIME REPRESENTATION
|
||||
|
||||
Libeio represents time as a single floating point number, representing the
|
||||
(fractional) number of seconds since the (POSIX) epoch (somewhere near
|
||||
the beginning of 1970, details are complicated, don't ask). This type is
|
||||
called C<eio_tstamp>, but it is guarenteed to be of type C<double> (or
|
||||
better), so you can freely use C<double> yourself.
|
||||
|
||||
Unlike the name component C<stamp> might indicate, it is also used for
|
||||
time differences throughout libeio.
|
||||
|
||||
=head2 FORK SUPPORT
|
||||
|
||||
Calling C<fork ()> is fully supported by this module. It is implemented in these steps:
|
||||
|
||||
1. wait till all requests in "execute" state have been handled
|
||||
(basically requests that are already handed over to the kernel).
|
||||
2. fork
|
||||
3. in the parent, continue business as usual, done
|
||||
4. in the child, destroy all ready and pending requests and free the
|
||||
memory used by the worker threads. This gives you a fully empty
|
||||
libeio queue.
|
||||
|
||||
=head1 INITIALISATION/INTEGRATION
|
||||
|
||||
Before you can call any eio functions you first have to initialise the
|
||||
library. The library integrates into any event loop, but can also be used
|
||||
without one, including in polling mode.
|
||||
|
||||
You have to provide the necessary glue yourself, however.
|
||||
|
||||
=over 4
|
||||
|
||||
=item int eio_init (void (*want_poll)(void), void (*done_poll)(void))
|
||||
|
||||
This function initialises the library. On success it returns C<0>, on
|
||||
failure it returns C<-1> and sets C<errno> appropriately.
|
||||
|
||||
It accepts two function pointers specifying callbacks as argument, both of
|
||||
which can be C<0>, in which case the callback isn't called.
|
||||
|
||||
=item want_poll callback
|
||||
|
||||
The C<want_poll> callback is invoked whenever libeio wants attention (i.e.
|
||||
it wants to be polled by calling C<eio_poll>). It is "edge-triggered",
|
||||
that is, it will only be called once when eio wants attention, until all
|
||||
pending requests have been handled.
|
||||
|
||||
This callback is called while locks are being held, so I<you must
|
||||
not call any libeio functions inside this callback>. That includes
|
||||
C<eio_poll>. What you should do is notify some other thread, or wake up
|
||||
your event loop, and then call C<eio_poll>.
|
||||
|
||||
=item done_poll callback
|
||||
|
||||
This callback is invoked when libeio detects that all pending requests
|
||||
have been handled. It is "edge-triggered", that is, it will only be
|
||||
called once after C<want_poll>. To put it differently, C<want_poll> and
|
||||
C<done_poll> are invoked in pairs: after C<want_poll> you have to call
|
||||
C<eio_poll ()> until either C<eio_poll> indicates that everything has been
|
||||
handled or C<done_poll> has been called, which signals the same.
|
||||
|
||||
Note that C<eio_poll> might return after C<done_poll> and C<want_poll>
|
||||
have been called again, so watch out for races in your code.
|
||||
|
||||
As with C<want_poll>, this callback is called while lcoks are being held,
|
||||
so you I<must not call any libeio functions form within this callback>.
|
||||
|
||||
=item int eio_poll ()
|
||||
|
||||
This function has to be called whenever there are pending requests that
|
||||
need finishing. You usually call this after C<want_poll> has indicated
|
||||
that you should do so, but you can also call this function regularly to
|
||||
poll for new results.
|
||||
|
||||
If any request invocation returns a non-zero value, then C<eio_poll ()>
|
||||
immediately returns with that value as return value.
|
||||
|
||||
Otherwise, if all requests could be handled, it returns C<0>. If for some
|
||||
reason not all requests have been handled, i.e. some are still pending, it
|
||||
returns C<-1>.
|
||||
|
||||
=back
|
||||
|
||||
For libev, you would typically use an C<ev_async> watcher: the
|
||||
C<want_poll> callback would invoke C<ev_async_send> to wake up the event
|
||||
loop. Inside the callback set for the watcher, one would call C<eio_poll
|
||||
()> (followed by C<ev_async_send> again if C<eio_poll> indicates that not
|
||||
all requests have been handled yet). The race is taken care of because
|
||||
libev resets/rearms the async watcher before calling your callback,
|
||||
and therefore, before calling C<eio_poll>. This might result in (some)
|
||||
spurious wake-ups, but is generally harmless.
|
||||
|
||||
For most other event loops, you would typically use a pipe - the event
|
||||
loop should be told to wait for read readyness on the read end. In
|
||||
C<want_poll> you would write a single byte, in C<done_poll> you would try
|
||||
to read that byte, and in the callback for the read end, you would call
|
||||
C<eio_poll>. The race is avoided here because the event loop should invoke
|
||||
your callback again and again until the byte has been read (as the pipe
|
||||
read callback does not read it, only C<done_poll>).
|
||||
|
||||
=head2 CONFIGURATION
|
||||
|
||||
The functions in this section can sometimes be useful, but the default
|
||||
configuration will do in most case, so you should skip this section on
|
||||
first reading.
|
||||
|
||||
=over 4
|
||||
|
||||
=item eio_set_max_poll_time (eio_tstamp nseconds)
|
||||
|
||||
This causes C<eio_poll ()> to return after it has detected that it was
|
||||
running for C<nsecond> seconds or longer (this number can be fractional).
|
||||
|
||||
This can be used to limit the amount of time spent handling eio requests,
|
||||
for example, in interactive programs, you might want to limit this time to
|
||||
C<0.01> seconds or so.
|
||||
|
||||
Note that:
|
||||
|
||||
a) libeio doesn't know how long your request callbacks take, so the time
|
||||
spent in C<eio_poll> is up to one callback invocation longer then this
|
||||
interval.
|
||||
|
||||
b) this is implemented by calling C<gettimeofday> after each request,
|
||||
which can be costly.
|
||||
|
||||
c) at least one request will be handled.
|
||||
|
||||
=item eio_set_max_poll_reqs (unsigned int nreqs)
|
||||
|
||||
When C<nreqs> is non-zero, then C<eio_poll> will not handle more than
|
||||
C<nreqs> requests per invocation. This is a less costly way to limit the
|
||||
amount of work done by C<eio_poll> then setting a time limit.
|
||||
|
||||
If you know your callbacks are generally fast, you could use this to
|
||||
encourage interactiveness in your programs by setting it to C<10>, C<100>
|
||||
or even C<1000>.
|
||||
|
||||
=item eio_set_min_parallel (unsigned int nthreads)
|
||||
|
||||
Make sure libeio can handle at least this many requests in parallel. It
|
||||
might be able handle more.
|
||||
|
||||
=item eio_set_max_parallel (unsigned int nthreads)
|
||||
|
||||
Set the maximum number of threads that libeio will spawn.
|
||||
|
||||
=item eio_set_max_idle (unsigned int nthreads)
|
||||
|
||||
Libeio uses threads internally to handle most requests, and will start and stop threads on demand.
|
||||
|
||||
This call can be used to limit the number of idle threads (threads without
|
||||
work to do): libeio will keep some threads idle in preperation for more
|
||||
requests, but never longer than C<nthreads> threads.
|
||||
|
||||
In addition to this, libeio will also stop threads when they are idle for
|
||||
a few seconds, regardless of this setting.
|
||||
|
||||
=item unsigned int eio_nthreads ()
|
||||
|
||||
Return the number of worker threads currently running.
|
||||
|
||||
=item unsigned int eio_nreqs ()
|
||||
|
||||
Return the number of requests currently handled by libeio. This is the
|
||||
total number of requests that have been submitted to libeio, but not yet
|
||||
destroyed.
|
||||
|
||||
=item unsigned int eio_nready ()
|
||||
|
||||
Returns the number of ready requests, i.e. requests that have been
|
||||
submitted but have not yet entered the execution phase.
|
||||
|
||||
=item unsigned int eio_npending ()
|
||||
|
||||
Returns the number of pending requests, i.e. requests that have been
|
||||
executed and have results, but have not been finished yet by a call to
|
||||
C<eio_poll>).
|
||||
|
||||
=back
|
||||
|
||||
|
||||
=head1 ANATOMY OF AN EIO REQUEST
|
||||
|
||||
#TODO
|
||||
|
||||
|
||||
=head1 HIGH LEVEL REQUEST API
|
||||
|
||||
#TODO
|
||||
|
||||
=back
|
||||
|
||||
|
||||
=head1 LOW LEVEL REQUEST API
|
||||
|
||||
#TODO
|
||||
|
||||
=head1 EMBEDDING
|
||||
|
||||
Libeio can be embedded directly into programs. This functionality is not
|
||||
documented and not (yet) officially supported.
|
||||
|
||||
Note that, when including C<libeio.m4>, you are responsible for defining
|
||||
the compilation environment (C<_LARGEFILE_SOURCE>, C<_GNU_SOURCE> etc.).
|
||||
|
||||
If you need to know how, check the C<IO::AIO> perl module, which does
|
||||
exactly that.
|
||||
|
||||
|
||||
=head1 COMPILETIME CONFIGURATION
|
||||
|
||||
These symbols, if used, must be defined when compiling F<eio.c>.
|
||||
|
||||
=over 4
|
||||
|
||||
=item EIO_STACKSIZE
|
||||
|
||||
This symbol governs the stack size for each eio thread. Libeio itself
|
||||
was written to use very little stackspace, but when using C<EIO_CUSTOM>
|
||||
requests, you might want to increase this.
|
||||
|
||||
If this symbol is undefined (the default) then libeio will use its default
|
||||
stack size (C<sizeof (long) * 4096> currently). If it is defined, but
|
||||
C<0>, then the default operating system stack size will be used. In all
|
||||
other cases, the value must be an expression that evaluates to the desired
|
||||
stack size.
|
||||
|
||||
=back
|
||||
|
||||
|
||||
=head1 PORTABILITY REQUIREMENTS
|
||||
|
||||
In addition to a working ISO-C implementation, libeio relies on a few
|
||||
additional extensions:
|
||||
|
||||
=over 4
|
||||
|
||||
=item POSIX threads
|
||||
|
||||
To be portable, this module uses threads, specifically, the POSIX threads
|
||||
library must be available (and working, which partially excludes many xBSD
|
||||
systems, where C<fork ()> is buggy).
|
||||
|
||||
=item POSIX-compatible filesystem API
|
||||
|
||||
This is actually a harder portability requirement: The libeio API is quite
|
||||
demanding regarding POSIX API calls (symlinks, user/group management
|
||||
etc.).
|
||||
|
||||
=item C<double> must hold a time value in seconds with enough accuracy
|
||||
|
||||
The type C<double> is used to represent timestamps. It is required to
|
||||
have at least 51 bits of mantissa (and 9 bits of exponent), which is good
|
||||
enough for at least into the year 4000. This requirement is fulfilled by
|
||||
implementations implementing IEEE 754 (basically all existing ones).
|
||||
|
||||
=back
|
||||
|
||||
If you know of other additional requirements drop me a note.
|
||||
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Marc Lehmann <libeio@schmorp.de>.
|
||||
|
||||
107
deps/libeio/libeio.m4
vendored
107
deps/libeio/libeio.m4
vendored
@@ -1,107 +0,0 @@
|
||||
AC_SEARCH_LIBS(
|
||||
pthread_create,
|
||||
[pthread pthreads pthreadVC2],
|
||||
,
|
||||
[AC_MSG_ERROR(pthread functions not found)]
|
||||
)
|
||||
|
||||
AC_CACHE_CHECK(for futimes, ac_cv_futimes, [AC_LINK_IFELSE([[
|
||||
#include <sys/types.h>
|
||||
#include <sys/time.h>
|
||||
#include <utime.h>
|
||||
struct timeval tv[2];
|
||||
int res;
|
||||
int fd;
|
||||
int main(void)
|
||||
{
|
||||
res = futimes (fd, tv);
|
||||
return 0;
|
||||
}
|
||||
]],ac_cv_futimes=yes,ac_cv_futimes=no)])
|
||||
test $ac_cv_futimes = yes && AC_DEFINE(HAVE_FUTIMES, 1, futimes(2) is available)
|
||||
|
||||
AC_CACHE_CHECK(for readahead, ac_cv_readahead, [AC_LINK_IFELSE([
|
||||
#include <fcntl.h>
|
||||
int main(void)
|
||||
{
|
||||
int fd = 0;
|
||||
size_t count = 2;
|
||||
ssize_t res;
|
||||
res = readahead (fd, 0, count);
|
||||
return 0;
|
||||
}
|
||||
],ac_cv_readahead=yes,ac_cv_readahead=no)])
|
||||
test $ac_cv_readahead = yes && AC_DEFINE(HAVE_READAHEAD, 1, readahead(2) is available (linux))
|
||||
|
||||
AC_CACHE_CHECK(for fdatasync, ac_cv_fdatasync, [AC_LINK_IFELSE([
|
||||
#include <unistd.h>
|
||||
int main(void)
|
||||
{
|
||||
int fd = 0;
|
||||
fdatasync (fd);
|
||||
return 0;
|
||||
}
|
||||
],ac_cv_fdatasync=yes,ac_cv_fdatasync=no)])
|
||||
test $ac_cv_fdatasync = yes && AC_DEFINE(HAVE_FDATASYNC, 1, fdatasync(2) is available)
|
||||
|
||||
AC_CACHE_CHECK(for pread and pwrite, ac_cv_preadwrite, [AC_LINK_IFELSE([
|
||||
#include <unistd.h>
|
||||
int main(void)
|
||||
{
|
||||
int fd = 0;
|
||||
size_t count = 1;
|
||||
char buf;
|
||||
off_t offset = 1;
|
||||
ssize_t res;
|
||||
res = pread (fd, &buf, count, offset);
|
||||
res = pwrite (fd, &buf, count, offset);
|
||||
return 0;
|
||||
}
|
||||
],ac_cv_preadwrite=yes,ac_cv_preadwrite=no)])
|
||||
test $ac_cv_preadwrite = yes && AC_DEFINE(HAVE_PREADWRITE, 1, pread(2) and pwrite(2) are available)
|
||||
|
||||
AC_CACHE_CHECK(for sendfile, ac_cv_sendfile, [AC_LINK_IFELSE([
|
||||
# include <sys/types.h>
|
||||
#if __linux
|
||||
# include <sys/sendfile.h>
|
||||
#elif __freebsd
|
||||
# include <sys/socket.h>
|
||||
# include <sys/uio.h>
|
||||
#elif __hpux
|
||||
# include <sys/socket.h>
|
||||
#else
|
||||
# error unsupported architecture
|
||||
#endif
|
||||
int main(void)
|
||||
{
|
||||
int fd = 0;
|
||||
off_t offset = 1;
|
||||
size_t count = 2;
|
||||
ssize_t res;
|
||||
#if __linux
|
||||
res = sendfile (fd, fd, offset, count);
|
||||
#elif __freebsd
|
||||
res = sendfile (fd, fd, offset, count, 0, &offset, 0);
|
||||
#elif __hpux
|
||||
res = sendfile (fd, fd, offset, count, 0, 0);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
],ac_cv_sendfile=yes,ac_cv_sendfile=no)])
|
||||
test $ac_cv_sendfile = yes && AC_DEFINE(HAVE_SENDFILE, 1, sendfile(2) is available and supported)
|
||||
|
||||
AC_CACHE_CHECK(for sync_file_range, ac_cv_sync_file_range, [AC_LINK_IFELSE([
|
||||
#include <fcntl.h>
|
||||
int main(void)
|
||||
{
|
||||
int fd = 0;
|
||||
off64_t offset = 1;
|
||||
off64_t nbytes = 1;
|
||||
unsigned int flags = SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE|SYNC_FILE_RANGE_WAIT_AFTER;
|
||||
ssize_t res;
|
||||
res = sync_file_range (fd, offset, nbytes, flags);
|
||||
return 0;
|
||||
}
|
||||
],ac_cv_sync_file_range=yes,ac_cv_sync_file_range=no)])
|
||||
test $ac_cv_sync_file_range = yes && AC_DEFINE(HAVE_SYNC_FILE_RANGE, 1, sync_file_range(2) is available)
|
||||
|
||||
121
deps/libeio/wscript
vendored
121
deps/libeio/wscript
vendored
@@ -1,121 +0,0 @@
|
||||
import Options
|
||||
|
||||
def set_options(opt):
|
||||
pass
|
||||
#opt.tool_options('compiler_cc')
|
||||
|
||||
def configure(conf):
|
||||
print "--- libeio ---"
|
||||
#conf.check_tool('compiler_cc')
|
||||
|
||||
conf.check(lib='pthread', uselib_store='PTHREAD')
|
||||
conf.check_cc(lib="pthread", header_name="pthread.h", function_name="pthread_create", mandatory=True)
|
||||
conf.check_cc(lib="pthread", header_name="pthread.h", function_name="pthread_atfork", mandatory=True)
|
||||
|
||||
conf.check_cc(msg="Checking for futimes(2)", define_name="HAVE_FUTIMES", fragment="""
|
||||
#include <sys/types.h>
|
||||
#include <sys/time.h>
|
||||
#include <utime.h>
|
||||
struct timeval tv[2];
|
||||
int res;
|
||||
int fd;
|
||||
int main(void)
|
||||
{
|
||||
res = futimes (fd, tv);
|
||||
return 0;
|
||||
}
|
||||
""")
|
||||
|
||||
conf.check_cc(msg="Checking for readahead(2)", define_name="HAVE_READAHEAD", fragment="""
|
||||
#include <fcntl.h>
|
||||
int main(void)
|
||||
{
|
||||
int fd = 0;
|
||||
size_t count = 2;
|
||||
ssize_t res;
|
||||
res = readahead (fd, 0, count);
|
||||
return 0;
|
||||
}
|
||||
""")
|
||||
|
||||
conf.check_cc(msg="Checking for fdatasync(2)", define_name="HAVE_FDATASYNC", fragment="""
|
||||
#include <unistd.h>
|
||||
int main(void)
|
||||
{
|
||||
int fd = 0;
|
||||
fdatasync (fd);
|
||||
return 0;
|
||||
}
|
||||
""")
|
||||
|
||||
conf.check_cc(msg="Checking for pread(2) and pwrite(2)", define_name="HAVE_PREADWRITE", fragment="""
|
||||
#include <unistd.h>
|
||||
int main(void)
|
||||
{
|
||||
int fd = 0;
|
||||
size_t count = 1;
|
||||
char buf;
|
||||
off_t offset = 1;
|
||||
ssize_t res;
|
||||
res = pread (fd, &buf, count, offset);
|
||||
res = pwrite (fd, &buf, count, offset);
|
||||
return 0;
|
||||
}
|
||||
""")
|
||||
|
||||
conf.check_cc(msg="Checking for sendfile(2)" , define_name="HAVE_SENDFILE" , fragment="""
|
||||
# include <sys/types.h>
|
||||
#if __linux
|
||||
# include <sys/sendfile.h>
|
||||
#elif __freebsd
|
||||
# include <sys/socket.h>
|
||||
# include <sys/uio.h>
|
||||
#elif __hpux
|
||||
# include <sys/socket.h>
|
||||
#else
|
||||
# error unsupported architecture
|
||||
#endif
|
||||
int main(void)
|
||||
{
|
||||
int fd = 0;
|
||||
off_t offset = 1;
|
||||
size_t count = 2;
|
||||
ssize_t res;
|
||||
#if __linux
|
||||
res = sendfile (fd, fd, offset, count);
|
||||
#elif __freebsd
|
||||
res = sendfile (fd, fd, offset, count, 0, &offset, 0);
|
||||
#elif __hpux
|
||||
res = sendfile (fd, fd, offset, count, 0, 0);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
""")
|
||||
|
||||
conf.env.append_value("CCFLAGS", "-D_GNU_SOURCE")
|
||||
conf.check_cc(msg="Checking for sync_file_range(2) ", fragment="""
|
||||
#include <fcntl.h>
|
||||
int main(void)
|
||||
{
|
||||
int fd = 0;
|
||||
off64_t offset = 1;
|
||||
off64_t nbytes = 1;
|
||||
unsigned int flags = SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE|SYNC_FILE_RANGE_WAIT_AFTER;
|
||||
ssize_t res;
|
||||
res = sync_file_range (fd, offset, nbytes, flags);
|
||||
return 0;
|
||||
}
|
||||
""", define_name="HAVE_SYNC_FILE_RANGE")
|
||||
|
||||
def build(bld):
|
||||
libeio = bld.new_task_gen("cc", "staticlib")
|
||||
libeio.source = "eio.c"
|
||||
libeio.target = 'eio'
|
||||
libeio.name = 'eio'
|
||||
libeio.includes = '. ../..'
|
||||
libeio.uselib = "PTHREAD"
|
||||
libeio.install_path = None
|
||||
if bld.env["USE_DEBUG"]:
|
||||
libeio.clone("debug");
|
||||
bld.install_files('${PREFIX}/include/node/', 'eio.h');
|
||||
|
||||
157
deps/libeio/xthread.h
vendored
157
deps/libeio/xthread.h
vendored
@@ -1,157 +0,0 @@
|
||||
#ifndef XTHREAD_H_
|
||||
#define XTHREAD_H_
|
||||
|
||||
/* whether word reads are potentially non-atomic.
|
||||
* this is conservatice, likely most arches this runs
|
||||
* on have atomic word read/writes.
|
||||
*/
|
||||
#ifndef WORDACCESS_UNSAFE
|
||||
# if __i386 || __x86_64
|
||||
# define WORDACCESS_UNSAFE 0
|
||||
# else
|
||||
# define WORDACCESS_UNSAFE 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef _WIN32
|
||||
typedef int ssize_t;
|
||||
|
||||
#define NTDDI_VERSION NTDDI_WIN2K // needed to get win2000 api calls
|
||||
#define _WIN32_WINNT 0x400
|
||||
#include <stdio.h>//D
|
||||
#include <fcntl.h>
|
||||
#include <io.h>
|
||||
#include <time.h>
|
||||
#include <winsock2.h>
|
||||
#include <process.h>
|
||||
#include <windows.h>
|
||||
#include <pthread.h>
|
||||
#define sigset_t int
|
||||
#define sigfillset(a)
|
||||
#define pthread_sigmask(a,b,c)
|
||||
#define sigaddset(a,b)
|
||||
#define sigemptyset(s)
|
||||
#define sigfillset(s)
|
||||
|
||||
typedef pthread_mutex_t mutex_t;
|
||||
#define X_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER
|
||||
#define X_LOCK(mutex) pthread_mutex_lock (&(mutex))
|
||||
#define X_UNLOCK(mutex) pthread_mutex_unlock (&(mutex))
|
||||
|
||||
typedef pthread_cond_t cond_t;
|
||||
#define X_COND_INIT PTHREAD_COND_INITIALIZER
|
||||
#define X_COND_SIGNAL(cond) pthread_cond_signal (&(cond))
|
||||
#define X_COND_WAIT(cond,mutex) pthread_cond_wait (&(cond), &(mutex))
|
||||
#define X_COND_TIMEDWAIT(cond,mutex,to) pthread_cond_timedwait (&(cond), &(mutex), &(to))
|
||||
|
||||
typedef pthread_t thread_t;
|
||||
#define X_THREAD_PROC(name) void *name (void *thr_arg)
|
||||
#define X_THREAD_ATFORK(a,b,c)
|
||||
|
||||
static int
|
||||
thread_create (thread_t *tid, void *(*proc)(void *), void *arg)
|
||||
{
|
||||
int retval;
|
||||
pthread_attr_t attr;
|
||||
|
||||
pthread_attr_init (&attr);
|
||||
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
|
||||
|
||||
retval = pthread_create (tid, &attr, proc, arg) == 0;
|
||||
|
||||
pthread_attr_destroy (&attr);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
#define respipe_read(a,b,c) PerlSock_recv ((a), (b), (c), 0)
|
||||
#define respipe_write(a,b,c) send ((a), (b), (c), 0)
|
||||
#define respipe_close(a) PerlSock_closesocket ((a))
|
||||
|
||||
#else
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#if __linux && !defined(_GNU_SOURCE)
|
||||
# define _GNU_SOURCE
|
||||
#endif
|
||||
|
||||
/* just in case */
|
||||
#define _REENTRANT 1
|
||||
|
||||
#if __solaris
|
||||
# define _POSIX_PTHREAD_SEMANTICS 1
|
||||
/* try to bribe solaris headers into providing a current pthread API
|
||||
* despite environment being configured for an older version.
|
||||
*/
|
||||
# define __EXTENSIONS__ 1
|
||||
#endif
|
||||
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <limits.h>
|
||||
#include <pthread.h>
|
||||
|
||||
typedef pthread_mutex_t mutex_t;
|
||||
#if __linux && defined (PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP)
|
||||
# define X_MUTEX_INIT PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
|
||||
#else
|
||||
# define X_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER
|
||||
#endif
|
||||
#define X_LOCK(mutex) pthread_mutex_lock (&(mutex))
|
||||
#define X_UNLOCK(mutex) pthread_mutex_unlock (&(mutex))
|
||||
|
||||
typedef pthread_cond_t cond_t;
|
||||
#define X_COND_INIT PTHREAD_COND_INITIALIZER
|
||||
#define X_COND_SIGNAL(cond) pthread_cond_signal (&(cond))
|
||||
#define X_COND_WAIT(cond,mutex) pthread_cond_wait (&(cond), &(mutex))
|
||||
#define X_COND_TIMEDWAIT(cond,mutex,to) pthread_cond_timedwait (&(cond), &(mutex), &(to))
|
||||
|
||||
typedef pthread_t thread_t;
|
||||
#define X_THREAD_PROC(name) static void *name (void *thr_arg)
|
||||
#define X_THREAD_ATFORK(prepare,parent,child) pthread_atfork (prepare, parent, child)
|
||||
|
||||
// the broken bsd's once more
|
||||
#ifndef PTHREAD_STACK_MIN
|
||||
# define PTHREAD_STACK_MIN 0
|
||||
#endif
|
||||
|
||||
#ifndef X_STACKSIZE
|
||||
# define X_STACKSIZE sizeof (long) * 4096
|
||||
#endif
|
||||
|
||||
static int
|
||||
thread_create (thread_t *tid, void *(*proc)(void *), void *arg)
|
||||
{
|
||||
int retval;
|
||||
sigset_t fullsigset, oldsigset;
|
||||
pthread_attr_t attr;
|
||||
|
||||
pthread_attr_init (&attr);
|
||||
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
|
||||
pthread_attr_setstacksize (&attr, PTHREAD_STACK_MIN < X_STACKSIZE ? X_STACKSIZE : PTHREAD_STACK_MIN);
|
||||
#ifdef PTHREAD_SCOPE_PROCESS
|
||||
pthread_attr_setscope (&attr, PTHREAD_SCOPE_PROCESS);
|
||||
#endif
|
||||
|
||||
sigfillset (&fullsigset);
|
||||
|
||||
pthread_sigmask (SIG_SETMASK, &fullsigset, &oldsigset);
|
||||
retval = pthread_create (tid, &attr, proc, arg) == 0;
|
||||
pthread_sigmask (SIG_SETMASK, &oldsigset, 0);
|
||||
|
||||
pthread_attr_destroy (&attr);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
#define respipe_read(a,b,c) read ((a), (b), (c))
|
||||
#define respipe_write(a,b,c) write ((a), (b), (c))
|
||||
#define respipe_close(a) close ((a))
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
275
deps/libev/Changes
vendored
275
deps/libev/Changes
vendored
@@ -1,275 +0,0 @@
|
||||
Revision history for libev, a high-performance and full-featured event loop.
|
||||
|
||||
3.8 Sun Aug 9 14:30:45 CEST 2009
|
||||
- incompatible change: do not necessarily reset signal handler
|
||||
to SIG_DFL when a sighandler is stopped.
|
||||
- ev_default_destroy did not properly free or zero some members,
|
||||
potentially causing crashes and memory corruption on repated
|
||||
ev_default_destroy/ev_default_loop calls.
|
||||
- take advantage of signalfd on GNU/Linux systems.
|
||||
- document that the signal mask might be in an unspecified
|
||||
state when using libev's signal handling.
|
||||
- take advantage of some GNU/Linux calls to set cloexec/nonblock
|
||||
on fd creation, to avoid race conditions.
|
||||
|
||||
3.7 Fri Jul 17 16:36:32 CEST 2009
|
||||
- ev_unloop and ev_loop wrongly used a global variable to exit loops,
|
||||
instead of using a per-loop variable (bug caught by accident...).
|
||||
- the ev_set_io_collect_interval interpretation has changed.
|
||||
- add new functionality: ev_set_userdata, ev_userdata,
|
||||
ev_set_invoke_pending_cb, ev_set_loop_release_cb,
|
||||
ev_invoke_pending, ev_pending_count, together with a long example
|
||||
about thread locking.
|
||||
- add ev_timer_remaining (as requested by Denis F. Latypoff).
|
||||
- add ev_loop_depth.
|
||||
- calling ev_unloop in fork/prepare watchers will no longer poll
|
||||
for new events.
|
||||
- Denis F. Latypoff corrected many typos in example code snippets.
|
||||
- honor autoconf detection of EV_USE_CLOCK_SYSCALL, also double-
|
||||
check that the syscall number is available before trying to
|
||||
use it (reported by ry@tinyclouds).
|
||||
- use GetSystemTimeAsFileTime instead of _timeb on windows, for
|
||||
slightly higher accuracy.
|
||||
- properly declare ev_loop_verify and ev_now_update even when
|
||||
!EV_MULTIPLICITY.
|
||||
- do not compile in any priority code when EV_MAXPRI == EV_MINPRI.
|
||||
- support EV_MINIMAL==2 for a reduced API.
|
||||
- actually 0-initialise struct sigaction when installing signals.
|
||||
- add section on hibernate and stopped processes to ev_timer docs.
|
||||
|
||||
3.6 Tue Apr 28 02:49:30 CEST 2009
|
||||
- multiple timers becoming ready within an event loop iteration
|
||||
will be invoked in the "correct" order now.
|
||||
- do not leave the event loop early just because we have no active
|
||||
watchers, fixing a problem when embedding a kqueue loop
|
||||
that has active kernel events but no registered watchers
|
||||
(reported by blacksand blacksand).
|
||||
- correctly zero the idx values for arrays, so destroying and
|
||||
reinitialising the default loop actually works (patch by
|
||||
Malek Hadj-Ali).
|
||||
- implement ev_suspend and ev_resume.
|
||||
- new EV_CUSTOM revents flag for use by applications.
|
||||
- add documentation section about priorites.
|
||||
- add a glossary to the dcoumentation.
|
||||
- extend the ev_fork description slightly.
|
||||
- optimize a jump out of call_pending.
|
||||
|
||||
3.53 Sun Feb 15 02:38:20 CET 2009
|
||||
- fix a bug in event pipe creation on win32 that would cause a
|
||||
failed assertion on event loop creation (patch by Malek Hadj-Ali).
|
||||
- probe for CLOCK_REALTIME support at runtime as well and fall
|
||||
back to gettimeofday if there is an error, to support older
|
||||
operating systems with newer header files/libraries.
|
||||
- prefer gettimeofday over clock_gettime with USE_CLOCK_SYSCALL
|
||||
(default most everywhere), otherwise not.
|
||||
|
||||
3.52 Wed Jan 7 21:43:02 CET 2009
|
||||
- fix compilation of select backend in fd_set mode when NFDBITS is
|
||||
missing (to get it to compile on QNX, reported by Rodrigo Campos).
|
||||
- better select-nfds handling when select backend is in fd_set mode.
|
||||
- diagnose fd_set overruns when select backend is in fd_set mode.
|
||||
- due to a thinko, instead of disabling everything but
|
||||
select on the borked OS X platform, everything but select was
|
||||
allowed (reported by Emanuele Giaquinta).
|
||||
- actually verify that local and remote port are matching in
|
||||
libev's socketpair emulation, which makes denial-of-service
|
||||
attacks harder (but not impossible - it's windows). Make sure
|
||||
it even works under vista, which thinks that getpeer/sockname
|
||||
should return fantasy port numbers.
|
||||
- include "libev" in all assertion messages for potentially
|
||||
clearer diagnostics.
|
||||
- event_get_version (libevent compatibility) returned
|
||||
a useless string instead of the expected version string
|
||||
(patch by W.C.A. Wijngaards).
|
||||
|
||||
3.51 Wed Dec 24 23:00:11 CET 2008
|
||||
- fix a bug where an inotify watcher was added twice, causing
|
||||
freezes on hash collisions (reported and analysed by Graham Leggett).
|
||||
- new config symbol, EV_USE_CLOCK_SYSCALL, to make libev use
|
||||
a direct syscall - slower, but no dependency on librt et al.
|
||||
- assume negative return values != -1 signals success of port_getn
|
||||
(http://cvs.epicsol.org/cgi/viewcvs.cgi/epic5/source/newio.c?rev=1.52)
|
||||
(no known failure reports, but it doesn't hurt).
|
||||
- fork detection in ev_embed now stops and restarts the watcher
|
||||
automatically.
|
||||
- EXPERIMENTAL: default the method to operator () in ev++.h,
|
||||
to make it nicer to use functors (requested by Benedek László).
|
||||
- fixed const object callbacks in ev++.h.
|
||||
- replaced loop_ref argument of watcher.set (loop) by a direct
|
||||
ev_loop * in ev++.h, to avoid clashes with functor patch.
|
||||
- do not try to watch the empty string via inotify.
|
||||
- inotify watchers could be leaked under certain circumstances.
|
||||
- OS X 10.5 is actually even more broken than earlier versions,
|
||||
so fall back to select on that piece of garbage.
|
||||
- fixed some weirdness in the ev_embed documentation.
|
||||
|
||||
3.49 Wed Nov 19 11:26:53 CET 2008
|
||||
- ev_stat watchers will now use inotify as a mere hint on
|
||||
kernels <2.6.25, or if the filesystem is not in the
|
||||
"known to be good" list.
|
||||
- better mingw32 compatibility (it's not as borked as native win32)
|
||||
(analysed by Roger Pack).
|
||||
- include stdio.h in the example program, as too many people are
|
||||
confused by the weird C language otherwise. I guess the next thing
|
||||
I get told is that the "..." ellipses in the examples don't compile
|
||||
with their C compiler.
|
||||
|
||||
3.48 Thu Oct 30 09:02:37 CET 2008
|
||||
- further optimise away the EPOLL_CTL_ADD/MOD combo in the epoll
|
||||
backend by assuming the kernel event mask hasn't changed if
|
||||
ADD fails with EEXIST.
|
||||
- work around spurious event notification bugs in epoll by using
|
||||
a 32-bit generation counter. recreate kernel state if we receive
|
||||
spurious notifications or unwanted events. this is very costly,
|
||||
but I didn't come up with this horrible design.
|
||||
- use memset to initialise most arrays now and do away with the
|
||||
init functions.
|
||||
- expand time-out strategies into a "Be smart about timeouts" section.
|
||||
- drop the "struct" from all ev_watcher declarations in the
|
||||
documentation and did other clarifications (yeah, it was a mistake
|
||||
to have a struct AND a function called ev_loop).
|
||||
- fix a bug where ev_default would not initialise the default
|
||||
loop again after it was destroyed with ev_default_destroy.
|
||||
- rename syserr to ev_syserr to avoid name clashes when embedding,
|
||||
do similar changes for event.c.
|
||||
|
||||
3.45 Tue Oct 21 21:59:26 CEST 2008
|
||||
- disable inotify usage on linux <2.6.25, as it is broken
|
||||
(reported by Yoann Vandoorselaere).
|
||||
- ev_stat errornously would try to add inotify watchers
|
||||
even when inotify wasn't available (this should only
|
||||
have a performance impact).
|
||||
- ev_once now passes both timeout and io to the callback if both
|
||||
occur concurrently, instead of giving timeouts precedence.
|
||||
- disable EV_USE_INOTIFY when sys/inotify.h is too old.
|
||||
|
||||
3.44 Mon Sep 29 05:18:39 CEST 2008
|
||||
- embed watchers now automatically invoke ev_loop_fork on the
|
||||
embedded loop when the parent loop forks.
|
||||
- new function: ev_now_update (loop).
|
||||
- verify_watcher was not marked static.
|
||||
- improve the "associating..." manpage section.
|
||||
- documentation tweaks here and there.
|
||||
|
||||
3.43 Sun Jul 6 05:34:41 CEST 2008
|
||||
- include more include files on windows to get struct _stati64
|
||||
(reported by Chris Hulbert, but doesn't quite fix his issue).
|
||||
- add missing #include <io.h> in ev.c on windows (reported by
|
||||
Matt Tolton).
|
||||
|
||||
3.42 Tue Jun 17 12:12:07 CEST 2008
|
||||
- work around yet another windows bug: FD_SET actually adds fd's
|
||||
multiple times to the fd_*SET*, despite official MSN docs claiming
|
||||
otherwise. Reported and well-analysed by Matt Tolton.
|
||||
- define NFDBITS to 0 when EV_SELECT_IS_WINSOCKET to make it compile
|
||||
(reported any analysed by Chris Hulbert).
|
||||
- fix a bug in ev_ebadf (this function is only used to catch
|
||||
programming errors in the libev user). reported by Matt Tolton.
|
||||
- fix a bug in fd_intern on win32 (could lead to compile errors
|
||||
under some circumstances, but would work correctly if it compiles).
|
||||
reported by Matt Tolton.
|
||||
- (try to) work around missing lstat on windows.
|
||||
- pass in the write fd set as except fd set under windows. windows
|
||||
is so uncontrollably lame that it requires this. this means that
|
||||
switching off oobinline is not supported (but tcp/ip doesn't
|
||||
have oob, so that would be stupid anyways.
|
||||
- use posix module symbol to auto-detect monotonic clock presence
|
||||
and some other default values.
|
||||
|
||||
3.41 Fri May 23 18:42:54 CEST 2008
|
||||
- work around an obscure bug in winsocket select: if you
|
||||
provide only empty fd sets then select returns WSAEINVAL. how sucky.
|
||||
- improve timer scheduling stability and reduce use of time_epsilon.
|
||||
- use 1-based 2-heap for EV_MINIMAL, simplifies code, reduces
|
||||
codesize and makes for better cache-efficiency.
|
||||
- use 3-based 4-heap for !EV_MINIMAL. this makes better use
|
||||
of cpu cache lines and gives better growth behaviour than
|
||||
2-based heaps.
|
||||
- cache timestamp within heap for !EV_MINIMAL, to avoid random
|
||||
memory accesses.
|
||||
- document/add EV_USE_4HEAP and EV_HEAP_CACHE_AT.
|
||||
- fix a potential aliasing issue in ev_timer_again.
|
||||
- add/document ev_periodic_at, retract direct access to ->at.
|
||||
- improve ev_stat docs.
|
||||
- add portability requirements section.
|
||||
- fix manpage headers etc.
|
||||
- normalise WSA error codes to lower range on windows.
|
||||
- add consistency check code that can be called automatically
|
||||
or on demand to check for internal structures (ev_loop_verify).
|
||||
|
||||
3.31 Wed Apr 16 20:45:04 CEST 2008
|
||||
- added last minute fix for ev_poll.c by Brandon Black.
|
||||
|
||||
3.3 Wed Apr 16 19:04:10 CEST 2008
|
||||
- event_base_loopexit should return 0 on success
|
||||
(W.C.A. Wijngaards).
|
||||
- added linux eventfd support.
|
||||
- try to autodetect epoll and inotify support
|
||||
by libc header version if not using autoconf.
|
||||
- new symbols: EV_DEFAULT_UC and EV_DEFAULT_UC_.
|
||||
- declare functions defined in ev.h as inline if
|
||||
C99 or gcc are available.
|
||||
- enable inlining with gcc versions 2 and 3.
|
||||
- work around broken poll implementations potentially
|
||||
not clearing revents field in ev_poll (Brandon Black)
|
||||
(no such systems are known at this time).
|
||||
- work around a bug in realloc on openbsd and darwin,
|
||||
also makes the errornous valgrind complaints
|
||||
go away (noted by various people).
|
||||
- fix ev_async_pending, add c++ wrapper for ev_async
|
||||
(based on patch sent by Johannes Deisenhofer.
|
||||
- add sensible set method to ev::embed.
|
||||
- made integer constants type int in ev.h.
|
||||
|
||||
3.2 Wed Apr 2 17:11:19 CEST 2008
|
||||
- fix a 64 bit overflow issue in the select backend,
|
||||
by using fd_mask instead of int for the mask.
|
||||
- rename internal sighandler to avoid clash with very old perls.
|
||||
- entering ev_loop will not clear the ONESHOT or NONBLOCKING
|
||||
flags of any outer loops anymore.
|
||||
- add ev_async_pending.
|
||||
|
||||
3.1 Thu Mar 13 13:45:22 CET 2008
|
||||
- implement ev_async watchers.
|
||||
- only initialise signal pipe on demand.
|
||||
- make use of sig_atomic_t configurable.
|
||||
- improved documentation.
|
||||
|
||||
3.0 Mon Jan 28 13:14:47 CET 2008
|
||||
- API/ABI bump to version 3.0.
|
||||
- ev++.h includes "ev.h" by default now, not <ev.h>.
|
||||
- slightly improved documentation.
|
||||
- speed up signal detection after a fork.
|
||||
- only optionally return trace status changed in ev_child
|
||||
watchers.
|
||||
- experimental (and undocumented) loop wrappers for ev++.h.
|
||||
|
||||
2.01 Tue Dec 25 08:04:41 CET 2007
|
||||
- separate Changes file.
|
||||
- fix ev_path_set => ev_stat_set typo.
|
||||
- remove event_compat.h from the libev tarball.
|
||||
- change how include files are found.
|
||||
- doc updates.
|
||||
- update licenses, explicitly allow for GPL relicensing.
|
||||
|
||||
2.0 Sat Dec 22 17:47:03 CET 2007
|
||||
- new ev_sleep, ev_set_(io|timeout)_collect_interval.
|
||||
- removed epoll from embeddable fd set.
|
||||
- fix embed watchers.
|
||||
- renamed ev_embed.loop to other.
|
||||
- added exported Symbol tables.
|
||||
- undefine member wrapper macros at the end of ev.c.
|
||||
- respect EV_H in ev++.h.
|
||||
|
||||
1.86 Tue Dec 18 02:36:57 CET 2007
|
||||
- fix memleak on loop destroy (not relevant for perl).
|
||||
|
||||
1.85 Fri Dec 14 20:32:40 CET 2007
|
||||
- fix some aliasing issues w.r.t. timers and periodics
|
||||
(not relevant for perl).
|
||||
|
||||
(for historic versions refer to EV/Changes, found in the Perl interface)
|
||||
|
||||
0.1 Wed Oct 31 21:31:48 CET 2007
|
||||
- original version; hacked together in <24h.
|
||||
|
||||
18
deps/libev/Makefile.am
vendored
18
deps/libev/Makefile.am
vendored
@@ -1,18 +0,0 @@
|
||||
AUTOMAKE_OPTIONS = foreign no-dependencies
|
||||
|
||||
VERSION_INFO = 3:0
|
||||
|
||||
EXTRA_DIST = LICENSE Changes libev.m4 autogen.sh \
|
||||
ev_vars.h ev_wrap.h \
|
||||
ev_epoll.c ev_select.c ev_poll.c ev_kqueue.c ev_port.c ev_win32.c \
|
||||
ev.3 ev.pod
|
||||
|
||||
man_MANS = ev.3
|
||||
|
||||
include_HEADERS = ev.h ev++.h event.h
|
||||
|
||||
lib_LTLIBRARIES = libev.la
|
||||
|
||||
libev_la_SOURCES = ev.c event.c
|
||||
libev_la_LDFLAGS = -version-info $(VERSION_INFO)
|
||||
|
||||
685
deps/libev/Makefile.in
vendored
685
deps/libev/Makefile.in
vendored
@@ -1,685 +0,0 @@
|
||||
# Makefile.in generated by automake 1.10.1 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||
# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
@SET_MAKE@
|
||||
|
||||
|
||||
VPATH = @srcdir@
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
install_sh_DATA = $(install_sh) -c -m 644
|
||||
install_sh_PROGRAM = $(install_sh) -c
|
||||
install_sh_SCRIPT = $(install_sh) -c
|
||||
INSTALL_HEADER = $(INSTALL_DATA)
|
||||
transform = $(program_transform_name)
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
subdir = .
|
||||
DIST_COMMON = README $(am__configure_deps) $(include_HEADERS) \
|
||||
$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
|
||||
$(srcdir)/config.h.in $(top_srcdir)/configure config.guess \
|
||||
config.sub install-sh ltmain.sh missing mkinstalldirs
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/libev.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
||||
configure.lineno config.status.lineno
|
||||
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||
CONFIG_HEADER = config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||
am__vpath_adj = case $$p in \
|
||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||
*) f=$$p;; \
|
||||
esac;
|
||||
am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
|
||||
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man3dir)" \
|
||||
"$(DESTDIR)$(includedir)"
|
||||
libLTLIBRARIES_INSTALL = $(INSTALL)
|
||||
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||
libev_la_LIBADD =
|
||||
am_libev_la_OBJECTS = ev.lo event.lo
|
||||
libev_la_OBJECTS = $(am_libev_la_OBJECTS)
|
||||
libev_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(libev_la_LDFLAGS) \
|
||||
$(LDFLAGS) -o $@
|
||||
DEFAULT_INCLUDES = -I.@am__isrc@
|
||||
depcomp =
|
||||
am__depfiles_maybe =
|
||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||
--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
||||
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
CCLD = $(CC)
|
||||
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
|
||||
$(LDFLAGS) -o $@
|
||||
SOURCES = $(libev_la_SOURCES)
|
||||
DIST_SOURCES = $(libev_la_SOURCES)
|
||||
man3dir = $(mandir)/man3
|
||||
NROFF = nroff
|
||||
MANS = $(man_MANS)
|
||||
includeHEADERS_INSTALL = $(INSTALL_HEADER)
|
||||
HEADERS = $(include_HEADERS)
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
distdir = $(PACKAGE)-$(VERSION)
|
||||
top_distdir = $(distdir)
|
||||
am__remove_distdir = \
|
||||
{ test ! -d $(distdir) \
|
||||
|| { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
|
||||
&& rm -fr $(distdir); }; }
|
||||
DIST_ARCHIVES = $(distdir).tar.gz
|
||||
GZIP_ENV = --best
|
||||
distuninstallcheck_listfiles = find . -type f -print
|
||||
distcleancheck_listfiles = find . -type f -print
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AR = @AR@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CXX = @CXX@
|
||||
CXXCPP = @CXXCPP@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
CXXFLAGS = @CXXFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
DSYMUTIL = @DSYMUTIL@
|
||||
ECHO = @ECHO@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
F77 = @F77@
|
||||
FFLAGS = @FFLAGS@
|
||||
GREP = @GREP@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NMEDIT = @NMEDIT@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
PACKAGE_NAME = @PACKAGE_NAME@
|
||||
PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
abs_top_srcdir = @abs_top_srcdir@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_F77 = @ac_ct_F77@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
build_cpu = @build_cpu@
|
||||
build_os = @build_os@
|
||||
build_vendor = @build_vendor@
|
||||
builddir = @builddir@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dvidir = @dvidir@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
host_alias = @host_alias@
|
||||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
htmldir = @htmldir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localedir = @localedir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
target_alias = @target_alias@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
AUTOMAKE_OPTIONS = foreign no-dependencies
|
||||
VERSION_INFO = 3:0
|
||||
EXTRA_DIST = LICENSE Changes libev.m4 autogen.sh \
|
||||
ev_vars.h ev_wrap.h \
|
||||
ev_epoll.c ev_select.c ev_poll.c ev_kqueue.c ev_port.c ev_win32.c \
|
||||
ev.3 ev.pod
|
||||
|
||||
man_MANS = ev.3
|
||||
include_HEADERS = ev.h ev++.h event.h
|
||||
lib_LTLIBRARIES = libev.la
|
||||
libev_la_SOURCES = ev.c event.c
|
||||
libev_la_LDFLAGS = -version-info $(VERSION_INFO)
|
||||
all: config.h
|
||||
$(MAKE) $(AM_MAKEFLAGS) all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .lo .o .obj
|
||||
am--refresh:
|
||||
@:
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
|
||||
cd $(srcdir) && $(AUTOMAKE) --foreign \
|
||||
&& exit 0; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
|
||||
cd $(top_srcdir) && \
|
||||
$(AUTOMAKE) --foreign Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
echo ' $(SHELL) ./config.status'; \
|
||||
$(SHELL) ./config.status;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
$(SHELL) ./config.status --recheck
|
||||
|
||||
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
cd $(srcdir) && $(AUTOCONF)
|
||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
||||
|
||||
config.h: stamp-h1
|
||||
@if test ! -f $@; then \
|
||||
rm -f stamp-h1; \
|
||||
$(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
|
||||
else :; fi
|
||||
|
||||
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
|
||||
@rm -f stamp-h1
|
||||
cd $(top_builddir) && $(SHELL) ./config.status config.h
|
||||
$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
cd $(top_srcdir) && $(AUTOHEADER)
|
||||
rm -f stamp-h1
|
||||
touch $@
|
||||
|
||||
distclean-hdr:
|
||||
-rm -f config.h stamp-h1
|
||||
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
|
||||
@$(NORMAL_INSTALL)
|
||||
test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
|
||||
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
|
||||
if test -f $$p; then \
|
||||
f=$(am__strip_dir) \
|
||||
echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
|
||||
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
|
||||
else :; fi; \
|
||||
done
|
||||
|
||||
uninstall-libLTLIBRARIES:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
|
||||
p=$(am__strip_dir) \
|
||||
echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
|
||||
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
|
||||
done
|
||||
|
||||
clean-libLTLIBRARIES:
|
||||
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
|
||||
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
|
||||
dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
|
||||
test "$$dir" != "$$p" || dir=.; \
|
||||
echo "rm -f \"$${dir}/so_locations\""; \
|
||||
rm -f "$${dir}/so_locations"; \
|
||||
done
|
||||
libev.la: $(libev_la_OBJECTS) $(libev_la_DEPENDENCIES)
|
||||
$(libev_la_LINK) -rpath $(libdir) $(libev_la_OBJECTS) $(libev_la_LIBADD) $(LIBS)
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
.c.o:
|
||||
$(COMPILE) -c $<
|
||||
|
||||
.c.obj:
|
||||
$(COMPILE) -c `$(CYGPATH_W) '$<'`
|
||||
|
||||
.c.lo:
|
||||
$(LTCOMPILE) -c -o $@ $<
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
||||
clean-libtool:
|
||||
-rm -rf .libs _libs
|
||||
|
||||
distclean-libtool:
|
||||
-rm -f libtool
|
||||
install-man3: $(man3_MANS) $(man_MANS)
|
||||
@$(NORMAL_INSTALL)
|
||||
test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)"
|
||||
@list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \
|
||||
l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
|
||||
for i in $$l2; do \
|
||||
case "$$i" in \
|
||||
*.3*) list="$$list $$i" ;; \
|
||||
esac; \
|
||||
done; \
|
||||
for i in $$list; do \
|
||||
if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
|
||||
else file=$$i; fi; \
|
||||
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
|
||||
case "$$ext" in \
|
||||
3*) ;; \
|
||||
*) ext='3' ;; \
|
||||
esac; \
|
||||
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
|
||||
inst=`echo $$inst | sed -e 's/^.*\///'`; \
|
||||
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
|
||||
echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \
|
||||
$(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst"; \
|
||||
done
|
||||
uninstall-man3:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \
|
||||
l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
|
||||
for i in $$l2; do \
|
||||
case "$$i" in \
|
||||
*.3*) list="$$list $$i" ;; \
|
||||
esac; \
|
||||
done; \
|
||||
for i in $$list; do \
|
||||
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
|
||||
case "$$ext" in \
|
||||
3*) ;; \
|
||||
*) ext='3' ;; \
|
||||
esac; \
|
||||
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
|
||||
inst=`echo $$inst | sed -e 's/^.*\///'`; \
|
||||
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
|
||||
echo " rm -f '$(DESTDIR)$(man3dir)/$$inst'"; \
|
||||
rm -f "$(DESTDIR)$(man3dir)/$$inst"; \
|
||||
done
|
||||
install-includeHEADERS: $(include_HEADERS)
|
||||
@$(NORMAL_INSTALL)
|
||||
test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
|
||||
@list='$(include_HEADERS)'; for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
f=$(am__strip_dir) \
|
||||
echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \
|
||||
$(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \
|
||||
done
|
||||
|
||||
uninstall-includeHEADERS:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(include_HEADERS)'; for p in $$list; do \
|
||||
f=$(am__strip_dir) \
|
||||
echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \
|
||||
rm -f "$(DESTDIR)$(includedir)/$$f"; \
|
||||
done
|
||||
|
||||
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
|
||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||
mkid -fID $$unique
|
||||
tags: TAGS
|
||||
|
||||
TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
|
||||
$(TAGS_FILES) $(LISP)
|
||||
tags=; \
|
||||
here=`pwd`; \
|
||||
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||
if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
|
||||
test -n "$$unique" || unique=$$empty_fix; \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
$$tags $$unique; \
|
||||
fi
|
||||
ctags: CTAGS
|
||||
CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
|
||||
$(TAGS_FILES) $(LISP)
|
||||
tags=; \
|
||||
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|
||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||
$$tags $$unique
|
||||
|
||||
GTAGS:
|
||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||
&& cd $(top_srcdir) \
|
||||
&& gtags -i $(GTAGS_ARGS) $$here
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
$(am__remove_distdir)
|
||||
test -d $(distdir) || mkdir $(distdir)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
dist_files=`for file in $$list; do echo $$file; done | \
|
||||
sed -e "s|^$$srcdirstrip/||;t" \
|
||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||
case $$dist_files in \
|
||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||
sort -u` ;; \
|
||||
esac; \
|
||||
for file in $$dist_files; do \
|
||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||
if test -d $$d/$$file; then \
|
||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
|
||||
fi; \
|
||||
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
|
||||
else \
|
||||
test -f $(distdir)/$$file \
|
||||
|| cp -p $$d/$$file $(distdir)/$$file \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
|
||||
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
|
||||
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
|
||||
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|
||||
|| chmod -R a+r $(distdir)
|
||||
dist-gzip: distdir
|
||||
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
||||
$(am__remove_distdir)
|
||||
|
||||
dist-bzip2: distdir
|
||||
tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
|
||||
$(am__remove_distdir)
|
||||
|
||||
dist-lzma: distdir
|
||||
tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
|
||||
$(am__remove_distdir)
|
||||
|
||||
dist-tarZ: distdir
|
||||
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
||||
$(am__remove_distdir)
|
||||
|
||||
dist-shar: distdir
|
||||
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
|
||||
$(am__remove_distdir)
|
||||
|
||||
dist-zip: distdir
|
||||
-rm -f $(distdir).zip
|
||||
zip -rq $(distdir).zip $(distdir)
|
||||
$(am__remove_distdir)
|
||||
|
||||
dist dist-all: distdir
|
||||
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
||||
$(am__remove_distdir)
|
||||
|
||||
# This target untars the dist file and tries a VPATH configuration. Then
|
||||
# it guarantees that the distribution is self-contained by making another
|
||||
# tarfile.
|
||||
distcheck: dist
|
||||
case '$(DIST_ARCHIVES)' in \
|
||||
*.tar.gz*) \
|
||||
GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
|
||||
*.tar.bz2*) \
|
||||
bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
|
||||
*.tar.lzma*) \
|
||||
unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
|
||||
*.tar.Z*) \
|
||||
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
||||
*.shar.gz*) \
|
||||
GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
|
||||
*.zip*) \
|
||||
unzip $(distdir).zip ;;\
|
||||
esac
|
||||
chmod -R a-w $(distdir); chmod a+w $(distdir)
|
||||
mkdir $(distdir)/_build
|
||||
mkdir $(distdir)/_inst
|
||||
chmod a-w $(distdir)
|
||||
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
||||
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
||||
&& cd $(distdir)/_build \
|
||||
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
|
||||
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
|
||||
distuninstallcheck \
|
||||
&& chmod -R a-w "$$dc_install_base" \
|
||||
&& ({ \
|
||||
(cd ../.. && umask 077 && mkdir "$$dc_destdir") \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
|
||||
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
|
||||
} || { rm -rf "$$dc_destdir"; exit 1; }) \
|
||||
&& rm -rf "$$dc_destdir" \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) dist \
|
||||
&& rm -rf $(DIST_ARCHIVES) \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck
|
||||
$(am__remove_distdir)
|
||||
@(echo "$(distdir) archives ready for distribution: "; \
|
||||
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
|
||||
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
|
||||
distuninstallcheck:
|
||||
@cd $(distuninstallcheck_dir) \
|
||||
&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
|
||||
|| { echo "ERROR: files left after uninstall:" ; \
|
||||
if test -n "$(DESTDIR)"; then \
|
||||
echo " (check DESTDIR support)"; \
|
||||
fi ; \
|
||||
$(distuninstallcheck_listfiles) ; \
|
||||
exit 1; } >&2
|
||||
distcleancheck: distclean
|
||||
@if test '$(srcdir)' = . ; then \
|
||||
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
|
||||
exit 1 ; \
|
||||
fi
|
||||
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|
||||
|| { echo "ERROR: files left in build directory after distclean:" ; \
|
||||
$(distcleancheck_listfiles) ; \
|
||||
exit 1; } >&2
|
||||
check-am: all-am
|
||||
check: check-am
|
||||
all-am: Makefile $(LTLIBRARIES) $(MANS) $(HEADERS) config.h
|
||||
installdirs:
|
||||
for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(includedir)"; do \
|
||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||
done
|
||||
install: install-am
|
||||
install-exec: install-exec-am
|
||||
install-data: install-data-am
|
||||
uninstall: uninstall-am
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-am
|
||||
install-strip:
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
`test -z '$(STRIP)' || \
|
||||
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
clean: clean-am
|
||||
|
||||
clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
|
||||
mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-compile distclean-generic \
|
||||
distclean-hdr distclean-libtool distclean-tags
|
||||
|
||||
dvi: dvi-am
|
||||
|
||||
dvi-am:
|
||||
|
||||
html: html-am
|
||||
|
||||
info: info-am
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am: install-includeHEADERS install-man
|
||||
|
||||
install-dvi: install-dvi-am
|
||||
|
||||
install-exec-am: install-libLTLIBRARIES
|
||||
|
||||
install-html: install-html-am
|
||||
|
||||
install-info: install-info-am
|
||||
|
||||
install-man: install-man3
|
||||
|
||||
install-pdf: install-pdf-am
|
||||
|
||||
install-ps: install-ps-am
|
||||
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||
-rm -rf $(top_srcdir)/autom4te.cache
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
mostlyclean: mostlyclean-am
|
||||
|
||||
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
|
||||
mostlyclean-libtool
|
||||
|
||||
pdf: pdf-am
|
||||
|
||||
pdf-am:
|
||||
|
||||
ps: ps-am
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES \
|
||||
uninstall-man
|
||||
|
||||
uninstall-man: uninstall-man3
|
||||
|
||||
.MAKE: install-am install-strip
|
||||
|
||||
.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \
|
||||
clean-generic clean-libLTLIBRARIES clean-libtool ctags dist \
|
||||
dist-all dist-bzip2 dist-gzip dist-lzma dist-shar dist-tarZ \
|
||||
dist-zip distcheck distclean distclean-compile \
|
||||
distclean-generic distclean-hdr distclean-libtool \
|
||||
distclean-tags distcleancheck distdir distuninstallcheck dvi \
|
||||
dvi-am html html-am info info-am install install-am \
|
||||
install-data install-data-am install-dvi install-dvi-am \
|
||||
install-exec install-exec-am install-html install-html-am \
|
||||
install-includeHEADERS install-info install-info-am \
|
||||
install-libLTLIBRARIES install-man install-man3 install-pdf \
|
||||
install-pdf-am install-ps install-ps-am install-strip \
|
||||
installcheck installcheck-am installdirs maintainer-clean \
|
||||
maintainer-clean-generic mostlyclean mostlyclean-compile \
|
||||
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
||||
tags uninstall uninstall-am uninstall-includeHEADERS \
|
||||
uninstall-libLTLIBRARIES uninstall-man uninstall-man3
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
7549
deps/libev/aclocal.m4
vendored
7549
deps/libev/aclocal.m4
vendored
File diff suppressed because it is too large
Load Diff
6
deps/libev/autogen.sh
vendored
6
deps/libev/autogen.sh
vendored
@@ -1,6 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
libtoolize --force
|
||||
automake --add-missing
|
||||
autoreconf
|
||||
|
||||
121
deps/libev/config.h.in
vendored
121
deps/libev/config.h.in
vendored
@@ -1,121 +0,0 @@
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* Define to 1 if you have the `clock_gettime' function. */
|
||||
#undef HAVE_CLOCK_GETTIME
|
||||
|
||||
/* "use syscall interface for clock_gettime" */
|
||||
#undef HAVE_CLOCK_SYSCALL
|
||||
|
||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||
#undef HAVE_DLFCN_H
|
||||
|
||||
/* Define to 1 if you have the `epoll_ctl' function. */
|
||||
#undef HAVE_EPOLL_CTL
|
||||
|
||||
/* Define to 1 if you have the `eventfd' function. */
|
||||
#undef HAVE_EVENTFD
|
||||
|
||||
/* Define to 1 if you have the `inotify_init' function. */
|
||||
#undef HAVE_INOTIFY_INIT
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#undef HAVE_INTTYPES_H
|
||||
|
||||
/* Define to 1 if you have the `kqueue' function. */
|
||||
#undef HAVE_KQUEUE
|
||||
|
||||
/* Define to 1 if you have the `m' library (-lm). */
|
||||
#undef HAVE_LIBM
|
||||
|
||||
/* Define to 1 if you have the `rt' library (-lrt). */
|
||||
#undef HAVE_LIBRT
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#undef HAVE_MEMORY_H
|
||||
|
||||
/* Define to 1 if you have the `nanosleep' function. */
|
||||
#undef HAVE_NANOSLEEP
|
||||
|
||||
/* Define to 1 if you have the `poll' function. */
|
||||
#undef HAVE_POLL
|
||||
|
||||
/* Define to 1 if you have the <poll.h> header file. */
|
||||
#undef HAVE_POLL_H
|
||||
|
||||
/* Define to 1 if you have the `port_create' function. */
|
||||
#undef HAVE_PORT_CREATE
|
||||
|
||||
/* Define to 1 if you have the <port.h> header file. */
|
||||
#undef HAVE_PORT_H
|
||||
|
||||
/* Define to 1 if you have the `select' function. */
|
||||
#undef HAVE_SELECT
|
||||
|
||||
/* Define to 1 if you have the `signalfd' function. */
|
||||
#undef HAVE_SIGNALFD
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#undef HAVE_STDINT_H
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#undef HAVE_STDLIB_H
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#undef HAVE_STRINGS_H
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#undef HAVE_STRING_H
|
||||
|
||||
/* Define to 1 if you have the <sys/epoll.h> header file. */
|
||||
#undef HAVE_SYS_EPOLL_H
|
||||
|
||||
/* Define to 1 if you have the <sys/eventfd.h> header file. */
|
||||
#undef HAVE_SYS_EVENTFD_H
|
||||
|
||||
/* Define to 1 if you have the <sys/event.h> header file. */
|
||||
#undef HAVE_SYS_EVENT_H
|
||||
|
||||
/* Define to 1 if you have the <sys/inotify.h> header file. */
|
||||
#undef HAVE_SYS_INOTIFY_H
|
||||
|
||||
/* Define to 1 if you have the <sys/queue.h> header file. */
|
||||
#undef HAVE_SYS_QUEUE_H
|
||||
|
||||
/* Define to 1 if you have the <sys/select.h> header file. */
|
||||
#undef HAVE_SYS_SELECT_H
|
||||
|
||||
/* Define to 1 if you have the <sys/signalfd.h> header file. */
|
||||
#undef HAVE_SYS_SIGNALFD_H
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#undef HAVE_SYS_STAT_H
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#undef HAVE_SYS_TYPES_H
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#undef HAVE_UNISTD_H
|
||||
|
||||
/* Name of package */
|
||||
#undef PACKAGE
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#undef PACKAGE_BUGREPORT
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#undef PACKAGE_NAME
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#undef PACKAGE_STRING
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#undef PACKAGE_TARNAME
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#undef PACKAGE_VERSION
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* Version number of package */
|
||||
#undef VERSION
|
||||
22156
deps/libev/configure
vendored
22156
deps/libev/configure
vendored
File diff suppressed because it is too large
Load Diff
18
deps/libev/configure.ac
vendored
18
deps/libev/configure.ac
vendored
@@ -1,18 +0,0 @@
|
||||
AC_INIT
|
||||
AC_CONFIG_SRCDIR([ev_epoll.c])
|
||||
|
||||
AM_INIT_AUTOMAKE(libev,3.8) dnl also update ev.h!
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_LIBTOOL
|
||||
|
||||
if test "x$GCC" = xyes ; then
|
||||
CFLAGS="$CFLAGS -O3"
|
||||
fi
|
||||
|
||||
m4_include([libev.m4])
|
||||
|
||||
AC_CONFIG_FILES([Makefile])
|
||||
AC_OUTPUT
|
||||
703
deps/libev/ev.h
vendored
703
deps/libev/ev.h
vendored
@@ -1,703 +0,0 @@
|
||||
/*
|
||||
* libev native API header
|
||||
*
|
||||
* Copyright (c) 2007,2008,2009 Marc Alexander Lehmann <libev@schmorp.de>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modifica-
|
||||
* tion, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-
|
||||
* CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
|
||||
* CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-
|
||||
* ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* the GNU General Public License ("GPL") version 2 or any later version,
|
||||
* in which case the provisions of the GPL are applicable instead of
|
||||
* the above. If you wish to allow the use of your version of this file
|
||||
* only under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the BSD license, indicate your decision
|
||||
* by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file under
|
||||
* either the BSD or the GPL.
|
||||
*/
|
||||
|
||||
#ifndef EV_H_
|
||||
#define EV_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef double ev_tstamp;
|
||||
|
||||
/* these priorities are inclusive, higher priorities will be called earlier */
|
||||
#ifndef EV_MINPRI
|
||||
# define EV_MINPRI -2
|
||||
#endif
|
||||
#ifndef EV_MAXPRI
|
||||
# define EV_MAXPRI +2
|
||||
#endif
|
||||
|
||||
#ifndef EV_MULTIPLICITY
|
||||
# define EV_MULTIPLICITY 1
|
||||
#endif
|
||||
|
||||
#ifndef EV_PERIODIC_ENABLE
|
||||
# define EV_PERIODIC_ENABLE 1
|
||||
#endif
|
||||
|
||||
#ifndef EV_STAT_ENABLE
|
||||
# define EV_STAT_ENABLE 1
|
||||
#endif
|
||||
|
||||
#ifndef EV_IDLE_ENABLE
|
||||
# define EV_IDLE_ENABLE 1
|
||||
#endif
|
||||
|
||||
#ifndef EV_FORK_ENABLE
|
||||
# define EV_FORK_ENABLE 1
|
||||
#endif
|
||||
|
||||
#ifndef EV_EMBED_ENABLE
|
||||
# define EV_EMBED_ENABLE 1
|
||||
#endif
|
||||
|
||||
#ifndef EV_ASYNC_ENABLE
|
||||
# define EV_ASYNC_ENABLE 1
|
||||
#endif
|
||||
|
||||
#ifndef EV_WALK_ENABLE
|
||||
# define EV_WALK_ENABLE 0 /* not yet */
|
||||
#endif
|
||||
|
||||
#ifndef EV_ATOMIC_T
|
||||
# include <signal.h>
|
||||
# define EV_ATOMIC_T sig_atomic_t volatile
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#if EV_STAT_ENABLE
|
||||
# ifdef _WIN32
|
||||
# include <time.h>
|
||||
# include <sys/types.h>
|
||||
# endif
|
||||
# include <sys/stat.h>
|
||||
#endif
|
||||
|
||||
/* support multiple event loops? */
|
||||
#if EV_MULTIPLICITY
|
||||
struct ev_loop;
|
||||
# define EV_P struct ev_loop *loop
|
||||
# define EV_P_ EV_P,
|
||||
# define EV_A loop
|
||||
# define EV_A_ EV_A,
|
||||
# define EV_DEFAULT_UC ev_default_loop_uc ()
|
||||
# define EV_DEFAULT_UC_ EV_DEFAULT_UC,
|
||||
# define EV_DEFAULT ev_default_loop (0)
|
||||
# define EV_DEFAULT_ EV_DEFAULT,
|
||||
#else
|
||||
# define EV_P void
|
||||
# define EV_P_
|
||||
# define EV_A
|
||||
# define EV_A_
|
||||
# define EV_DEFAULT
|
||||
# define EV_DEFAULT_
|
||||
# define EV_DEFAULT_UC
|
||||
# define EV_DEFAULT_UC_
|
||||
# undef EV_EMBED_ENABLE
|
||||
#endif
|
||||
|
||||
#if __STDC_VERSION__ >= 199901L || __GNUC__ >= 3
|
||||
# define EV_INLINE static inline
|
||||
#else
|
||||
# define EV_INLINE static
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/* eventmask, revents, events... */
|
||||
#define EV_UNDEF -1 /* guaranteed to be invalid */
|
||||
#define EV_NONE 0x00 /* no events */
|
||||
#define EV_READ 0x01 /* ev_io detected read will not block */
|
||||
#define EV_WRITE 0x02 /* ev_io detected write will not block */
|
||||
#define EV__IOFDSET 0x80 /* internal use only */
|
||||
#define EV_IO EV_READ /* alias for type-detection */
|
||||
#define EV_TIMEOUT 0x00000100 /* timer timed out */
|
||||
#define EV_TIMER EV_TIMEOUT /* alias for type-detection */
|
||||
#define EV_PERIODIC 0x00000200 /* periodic timer timed out */
|
||||
#define EV_SIGNAL 0x00000400 /* signal was received */
|
||||
#define EV_CHILD 0x00000800 /* child/pid had status change */
|
||||
#define EV_STAT 0x00001000 /* stat data changed */
|
||||
#define EV_IDLE 0x00002000 /* event loop is idling */
|
||||
#define EV_PREPARE 0x00004000 /* event loop about to poll */
|
||||
#define EV_CHECK 0x00008000 /* event loop finished poll */
|
||||
#define EV_EMBED 0x00010000 /* embedded event loop needs sweep */
|
||||
#define EV_FORK 0x00020000 /* event loop resumed in child */
|
||||
#define EV_ASYNC 0x00040000 /* async intra-loop signal */
|
||||
#define EV_CUSTOM 0x01000000 /* for use by user code */
|
||||
#define EV_ERROR 0x80000000 /* sent when an error occurs */
|
||||
|
||||
/* can be used to add custom fields to all watchers, while losing binary compatibility */
|
||||
#ifndef EV_COMMON
|
||||
# define EV_COMMON void *data;
|
||||
#endif
|
||||
#ifndef EV_PROTOTYPES
|
||||
# define EV_PROTOTYPES 1
|
||||
#endif
|
||||
|
||||
#define EV_VERSION_MAJOR 3
|
||||
#define EV_VERSION_MINOR 8
|
||||
|
||||
#ifndef EV_CB_DECLARE
|
||||
# define EV_CB_DECLARE(type) void (*cb)(EV_P_ struct type *w, int revents);
|
||||
#endif
|
||||
#ifndef EV_CB_INVOKE
|
||||
# define EV_CB_INVOKE(watcher,revents) (watcher)->cb (EV_A_ (watcher), (revents))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* struct member types:
|
||||
* private: you may look at them, but not change them,
|
||||
* and they might not mean anything to you.
|
||||
* ro: can be read anytime, but only changed when the watcher isn't active.
|
||||
* rw: can be read and modified anytime, even when the watcher is active.
|
||||
*
|
||||
* some internal details that might be helpful for debugging:
|
||||
*
|
||||
* active is either 0, which means the watcher is not active,
|
||||
* or the array index of the watcher (periodics, timers)
|
||||
* or the array index + 1 (most other watchers)
|
||||
* or simply 1 for watchers that aren't in some array.
|
||||
* pending is either 0, in which case the watcher isn't,
|
||||
* or the array index + 1 in the pendings array.
|
||||
*/
|
||||
|
||||
#if EV_MINPRI == EV_MAXPRI
|
||||
# define EV_DECL_PRIORITY
|
||||
#else
|
||||
# define EV_DECL_PRIORITY int priority;
|
||||
#endif
|
||||
|
||||
/* shared by all watchers */
|
||||
#define EV_WATCHER(type) \
|
||||
int active; /* private */ \
|
||||
int pending; /* private */ \
|
||||
EV_DECL_PRIORITY /* private */ \
|
||||
EV_COMMON /* rw */ \
|
||||
EV_CB_DECLARE (type) /* private */
|
||||
|
||||
#define EV_WATCHER_LIST(type) \
|
||||
EV_WATCHER (type) \
|
||||
struct ev_watcher_list *next; /* private */
|
||||
|
||||
#define EV_WATCHER_TIME(type) \
|
||||
EV_WATCHER (type) \
|
||||
ev_tstamp at; /* private */
|
||||
|
||||
/* base class, nothing to see here unless you subclass */
|
||||
typedef struct ev_watcher
|
||||
{
|
||||
EV_WATCHER (ev_watcher)
|
||||
} ev_watcher;
|
||||
|
||||
/* base class, nothing to see here unless you subclass */
|
||||
typedef struct ev_watcher_list
|
||||
{
|
||||
EV_WATCHER_LIST (ev_watcher_list)
|
||||
} ev_watcher_list;
|
||||
|
||||
/* base class, nothing to see here unless you subclass */
|
||||
typedef struct ev_watcher_time
|
||||
{
|
||||
EV_WATCHER_TIME (ev_watcher_time)
|
||||
} ev_watcher_time;
|
||||
|
||||
/* invoked when fd is either EV_READable or EV_WRITEable */
|
||||
/* revent EV_READ, EV_WRITE */
|
||||
typedef struct ev_io
|
||||
{
|
||||
EV_WATCHER_LIST (ev_io)
|
||||
|
||||
int fd; /* ro */
|
||||
int events; /* ro */
|
||||
} ev_io;
|
||||
|
||||
/* invoked after a specific time, repeatable (based on monotonic clock) */
|
||||
/* revent EV_TIMEOUT */
|
||||
typedef struct ev_timer
|
||||
{
|
||||
EV_WATCHER_TIME (ev_timer)
|
||||
|
||||
ev_tstamp repeat; /* rw */
|
||||
} ev_timer;
|
||||
|
||||
/* invoked at some specific time, possibly repeating at regular intervals (based on UTC) */
|
||||
/* revent EV_PERIODIC */
|
||||
typedef struct ev_periodic
|
||||
{
|
||||
EV_WATCHER_TIME (ev_periodic)
|
||||
|
||||
ev_tstamp offset; /* rw */
|
||||
ev_tstamp interval; /* rw */
|
||||
ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now); /* rw */
|
||||
} ev_periodic;
|
||||
|
||||
/* invoked when the given signal has been received */
|
||||
/* revent EV_SIGNAL */
|
||||
typedef struct ev_signal
|
||||
{
|
||||
EV_WATCHER_LIST (ev_signal)
|
||||
|
||||
int signum; /* ro */
|
||||
} ev_signal;
|
||||
|
||||
/* invoked when sigchld is received and waitpid indicates the given pid */
|
||||
/* revent EV_CHILD */
|
||||
/* does not support priorities */
|
||||
typedef struct ev_child
|
||||
{
|
||||
EV_WATCHER_LIST (ev_child)
|
||||
|
||||
int flags; /* private */
|
||||
int pid; /* ro */
|
||||
int rpid; /* rw, holds the received pid */
|
||||
int rstatus; /* rw, holds the exit status, use the macros from sys/wait.h */
|
||||
} ev_child;
|
||||
|
||||
#if EV_STAT_ENABLE
|
||||
/* st_nlink = 0 means missing file or other error */
|
||||
# ifdef _WIN32
|
||||
typedef struct _stati64 ev_statdata;
|
||||
# else
|
||||
typedef struct stat ev_statdata;
|
||||
# endif
|
||||
|
||||
/* invoked each time the stat data changes for a given path */
|
||||
/* revent EV_STAT */
|
||||
typedef struct ev_stat
|
||||
{
|
||||
EV_WATCHER_LIST (ev_stat)
|
||||
|
||||
ev_timer timer; /* private */
|
||||
ev_tstamp interval; /* ro */
|
||||
const char *path; /* ro */
|
||||
ev_statdata prev; /* ro */
|
||||
ev_statdata attr; /* ro */
|
||||
|
||||
int wd; /* wd for inotify, fd for kqueue */
|
||||
} ev_stat;
|
||||
#endif
|
||||
|
||||
#if EV_IDLE_ENABLE
|
||||
/* invoked when the nothing else needs to be done, keeps the process from blocking */
|
||||
/* revent EV_IDLE */
|
||||
typedef struct ev_idle
|
||||
{
|
||||
EV_WATCHER (ev_idle)
|
||||
} ev_idle;
|
||||
#endif
|
||||
|
||||
/* invoked for each run of the mainloop, just before the blocking call */
|
||||
/* you can still change events in any way you like */
|
||||
/* revent EV_PREPARE */
|
||||
typedef struct ev_prepare
|
||||
{
|
||||
EV_WATCHER (ev_prepare)
|
||||
} ev_prepare;
|
||||
|
||||
/* invoked for each run of the mainloop, just after the blocking call */
|
||||
/* revent EV_CHECK */
|
||||
typedef struct ev_check
|
||||
{
|
||||
EV_WATCHER (ev_check)
|
||||
} ev_check;
|
||||
|
||||
#if EV_FORK_ENABLE
|
||||
/* the callback gets invoked before check in the child process when a fork was detected */
|
||||
typedef struct ev_fork
|
||||
{
|
||||
EV_WATCHER (ev_fork)
|
||||
} ev_fork;
|
||||
#endif
|
||||
|
||||
#if EV_EMBED_ENABLE
|
||||
/* used to embed an event loop inside another */
|
||||
/* the callback gets invoked when the event loop has handled events, and can be 0 */
|
||||
typedef struct ev_embed
|
||||
{
|
||||
EV_WATCHER (ev_embed)
|
||||
|
||||
struct ev_loop *other; /* ro */
|
||||
ev_io io; /* private */
|
||||
ev_prepare prepare; /* private */
|
||||
ev_check check; /* unused */
|
||||
ev_timer timer; /* unused */
|
||||
ev_periodic periodic; /* unused */
|
||||
ev_idle idle; /* unused */
|
||||
ev_fork fork; /* private */
|
||||
} ev_embed;
|
||||
#endif
|
||||
|
||||
#if EV_ASYNC_ENABLE
|
||||
/* invoked when somebody calls ev_async_send on the watcher */
|
||||
/* revent EV_ASYNC */
|
||||
typedef struct ev_async
|
||||
{
|
||||
EV_WATCHER (ev_async)
|
||||
|
||||
EV_ATOMIC_T sent; /* private */
|
||||
} ev_async;
|
||||
|
||||
# define ev_async_pending(w) ((w)->sent + 0)
|
||||
#endif
|
||||
|
||||
/* the presence of this union forces similar struct layout */
|
||||
union ev_any_watcher
|
||||
{
|
||||
struct ev_watcher w;
|
||||
struct ev_watcher_list wl;
|
||||
|
||||
struct ev_io io;
|
||||
struct ev_timer timer;
|
||||
struct ev_periodic periodic;
|
||||
struct ev_signal signal;
|
||||
struct ev_child child;
|
||||
#if EV_STAT_ENABLE
|
||||
struct ev_stat stat;
|
||||
#endif
|
||||
#if EV_IDLE_ENABLE
|
||||
struct ev_idle idle;
|
||||
#endif
|
||||
struct ev_prepare prepare;
|
||||
struct ev_check check;
|
||||
#if EV_FORK_ENABLE
|
||||
struct ev_fork fork;
|
||||
#endif
|
||||
#if EV_EMBED_ENABLE
|
||||
struct ev_embed embed;
|
||||
#endif
|
||||
#if EV_ASYNC_ENABLE
|
||||
struct ev_async async;
|
||||
#endif
|
||||
};
|
||||
|
||||
/* bits for ev_default_loop and ev_loop_new */
|
||||
/* the default */
|
||||
#define EVFLAG_AUTO 0x00000000U /* not quite a mask */
|
||||
/* flag bits */
|
||||
#define EVFLAG_NOENV 0x01000000U /* do NOT consult environment */
|
||||
#define EVFLAG_FORKCHECK 0x02000000U /* check for a fork in each iteration */
|
||||
/* debugging/feature disable */
|
||||
#define EVFLAG_NOINOTIFY 0x00100000U /* do not attempt to use inotify */
|
||||
#define EVFLAG_NOSIGFD 0x00200000U /* do not attempt to use signalfd */
|
||||
/* method bits to be ored together */
|
||||
#define EVBACKEND_SELECT 0x00000001U /* about anywhere */
|
||||
#define EVBACKEND_POLL 0x00000002U /* !win */
|
||||
#define EVBACKEND_EPOLL 0x00000004U /* linux */
|
||||
#define EVBACKEND_KQUEUE 0x00000008U /* bsd */
|
||||
#define EVBACKEND_DEVPOLL 0x00000010U /* solaris 8 */ /* NYI */
|
||||
#define EVBACKEND_PORT 0x00000020U /* solaris 10 */
|
||||
|
||||
#if EV_PROTOTYPES
|
||||
int ev_version_major (void);
|
||||
int ev_version_minor (void);
|
||||
|
||||
unsigned int ev_supported_backends (void);
|
||||
unsigned int ev_recommended_backends (void);
|
||||
unsigned int ev_embeddable_backends (void);
|
||||
|
||||
ev_tstamp ev_time (void);
|
||||
void ev_sleep (ev_tstamp delay); /* sleep for a while */
|
||||
|
||||
/* Sets the allocation function to use, works like realloc.
|
||||
* It is used to allocate and free memory.
|
||||
* If it returns zero when memory needs to be allocated, the library might abort
|
||||
* or take some potentially destructive action.
|
||||
* The default is your system realloc function.
|
||||
*/
|
||||
void ev_set_allocator (void *(*cb)(void *ptr, long size));
|
||||
|
||||
/* set the callback function to call on a
|
||||
* retryable syscall error
|
||||
* (such as failed select, poll, epoll_wait)
|
||||
*/
|
||||
void ev_set_syserr_cb (void (*cb)(const char *msg));
|
||||
|
||||
#if EV_MULTIPLICITY
|
||||
EV_INLINE struct ev_loop *
|
||||
ev_default_loop_uc (void)
|
||||
{
|
||||
extern struct ev_loop *ev_default_loop_ptr;
|
||||
|
||||
return ev_default_loop_ptr;
|
||||
}
|
||||
|
||||
/* the default loop is the only one that handles signals and child watchers */
|
||||
/* you can call this as often as you like */
|
||||
EV_INLINE struct ev_loop *
|
||||
ev_default_loop (unsigned int flags)
|
||||
{
|
||||
struct ev_loop *loop = ev_default_loop_uc ();
|
||||
|
||||
if (!loop)
|
||||
{
|
||||
extern struct ev_loop *ev_default_loop_init (unsigned int flags);
|
||||
|
||||
loop = ev_default_loop_init (flags);
|
||||
}
|
||||
|
||||
return loop;
|
||||
}
|
||||
|
||||
/* create and destroy alternative loops that don't handle signals */
|
||||
struct ev_loop *ev_loop_new (unsigned int flags);
|
||||
void ev_loop_destroy (EV_P);
|
||||
void ev_loop_fork (EV_P);
|
||||
|
||||
ev_tstamp ev_now (EV_P); /* time w.r.t. timers and the eventloop, updated after each poll */
|
||||
|
||||
#else
|
||||
|
||||
int ev_default_loop (unsigned int flags); /* returns true when successful */
|
||||
|
||||
EV_INLINE ev_tstamp
|
||||
ev_now (void)
|
||||
{
|
||||
extern ev_tstamp ev_rt_now;
|
||||
|
||||
return ev_rt_now;
|
||||
}
|
||||
#endif /* multiplicity */
|
||||
|
||||
EV_INLINE int
|
||||
ev_is_default_loop (EV_P)
|
||||
{
|
||||
#if EV_MULTIPLICITY
|
||||
extern struct ev_loop *ev_default_loop_ptr;
|
||||
|
||||
return !!(EV_A == ev_default_loop_ptr);
|
||||
#else
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
void ev_default_destroy (void); /* destroy the default loop */
|
||||
/* this needs to be called after fork, to duplicate the default loop */
|
||||
/* if you create alternative loops you have to call ev_loop_fork on them */
|
||||
/* you can call it in either the parent or the child */
|
||||
/* you can actually call it at any time, anywhere :) */
|
||||
void ev_default_fork (void);
|
||||
|
||||
unsigned int ev_backend (EV_P); /* backend in use by loop */
|
||||
|
||||
void ev_now_update (EV_P); /* update event loop time */
|
||||
|
||||
#if EV_WALK_ENABLE
|
||||
/* walk (almost) all watchers in the loop of a given type, invoking the */
|
||||
/* callback on every such watcher. The callback might stop the watcher, */
|
||||
/* but do nothing else with the loop */
|
||||
void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w));
|
||||
#endif
|
||||
|
||||
#endif /* prototypes */
|
||||
|
||||
#define EVLOOP_NONBLOCK 1 /* do not block/wait */
|
||||
#define EVLOOP_ONESHOT 2 /* block *once* only */
|
||||
#define EVUNLOOP_CANCEL 0 /* undo unloop */
|
||||
#define EVUNLOOP_ONE 1 /* unloop once */
|
||||
#define EVUNLOOP_ALL 2 /* unloop all loops */
|
||||
|
||||
#if EV_PROTOTYPES
|
||||
void ev_loop (EV_P_ int flags);
|
||||
void ev_unloop (EV_P_ int how); /* set to 1 to break out of event loop, set to 2 to break out of all event loops */
|
||||
|
||||
/*
|
||||
* ref/unref can be used to add or remove a refcount on the mainloop. every watcher
|
||||
* keeps one reference. if you have a long-running watcher you never unregister that
|
||||
* should not keep ev_loop from running, unref() after starting, and ref() before stopping.
|
||||
*/
|
||||
void ev_ref (EV_P);
|
||||
void ev_unref (EV_P);
|
||||
|
||||
/*
|
||||
* convenience function, wait for a single event, without registering an event watcher
|
||||
* if timeout is < 0, do wait indefinitely
|
||||
*/
|
||||
void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg);
|
||||
|
||||
# if EV_MINIMAL < 2
|
||||
unsigned int ev_loop_count (EV_P); /* number of loop iterations */
|
||||
unsigned int ev_loop_depth (EV_P); /* #ev_loop enters - #ev_loop leaves */
|
||||
void ev_loop_verify (EV_P); /* abort if loop data corrupted */
|
||||
|
||||
void ev_set_io_collect_interval (EV_P_ ev_tstamp interval); /* sleep at least this time, default 0 */
|
||||
void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval); /* sleep at least this time, default 0 */
|
||||
|
||||
/* advanced stuff for threading etc. support, see docs */
|
||||
void ev_set_userdata (EV_P_ void *data);
|
||||
void *ev_userdata (EV_P);
|
||||
void ev_set_invoke_pending_cb (EV_P_ void (*invoke_pending_cb)(EV_P));
|
||||
void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P), void (*acquire)(EV_P));
|
||||
|
||||
unsigned int ev_pending_count (EV_P); /* number of pending events, if any */
|
||||
void ev_invoke_pending (EV_P); /* invoke all pending watchers */
|
||||
|
||||
/*
|
||||
* stop/start the timer handling.
|
||||
*/
|
||||
void ev_suspend (EV_P);
|
||||
void ev_resume (EV_P);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/* these may evaluate ev multiple times, and the other arguments at most once */
|
||||
/* either use ev_init + ev_TYPE_set, or the ev_TYPE_init macro, below, to first initialise a watcher */
|
||||
#define ev_init(ev,cb_) do { \
|
||||
((ev_watcher *)(void *)(ev))->active = \
|
||||
((ev_watcher *)(void *)(ev))->pending = 0; \
|
||||
ev_set_priority ((ev), 0); \
|
||||
ev_set_cb ((ev), cb_); \
|
||||
} while (0)
|
||||
|
||||
#define ev_io_set(ev,fd_,events_) do { (ev)->fd = (fd_); (ev)->events = (events_) | EV__IOFDSET; } while (0)
|
||||
#define ev_timer_set(ev,after_,repeat_) do { ((ev_watcher_time *)(ev))->at = (after_); (ev)->repeat = (repeat_); } while (0)
|
||||
#define ev_periodic_set(ev,ofs_,ival_,rcb_) do { (ev)->offset = (ofs_); (ev)->interval = (ival_); (ev)->reschedule_cb = (rcb_); } while (0)
|
||||
#define ev_signal_set(ev,signum_) do { (ev)->signum = (signum_); } while (0)
|
||||
#define ev_child_set(ev,pid_,trace_) do { (ev)->pid = (pid_); (ev)->flags = !!(trace_); } while (0)
|
||||
#define ev_stat_set(ev,path_,interval_) do { (ev)->path = (path_); (ev)->interval = (interval_); (ev)->wd = -2; } while (0)
|
||||
#define ev_idle_set(ev) /* nop, yes, this is a serious in-joke */
|
||||
#define ev_prepare_set(ev) /* nop, yes, this is a serious in-joke */
|
||||
#define ev_check_set(ev) /* nop, yes, this is a serious in-joke */
|
||||
#define ev_embed_set(ev,other_) do { (ev)->other = (other_); } while (0)
|
||||
#define ev_fork_set(ev) /* nop, yes, this is a serious in-joke */
|
||||
#define ev_async_set(ev) do { (ev)->sent = 0; } while (0)
|
||||
|
||||
#define ev_io_init(ev,cb,fd,events) do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0)
|
||||
#define ev_timer_init(ev,cb,after,repeat) do { ev_init ((ev), (cb)); ev_timer_set ((ev),(after),(repeat)); } while (0)
|
||||
#define ev_periodic_init(ev,cb,ofs,ival,rcb) do { ev_init ((ev), (cb)); ev_periodic_set ((ev),(ofs),(ival),(rcb)); } while (0)
|
||||
#define ev_signal_init(ev,cb,signum) do { ev_init ((ev), (cb)); ev_signal_set ((ev), (signum)); } while (0)
|
||||
#define ev_child_init(ev,cb,pid,trace) do { ev_init ((ev), (cb)); ev_child_set ((ev),(pid),(trace)); } while (0)
|
||||
#define ev_stat_init(ev,cb,path,interval) do { ev_init ((ev), (cb)); ev_stat_set ((ev),(path),(interval)); } while (0)
|
||||
#define ev_idle_init(ev,cb) do { ev_init ((ev), (cb)); ev_idle_set ((ev)); } while (0)
|
||||
#define ev_prepare_init(ev,cb) do { ev_init ((ev), (cb)); ev_prepare_set ((ev)); } while (0)
|
||||
#define ev_check_init(ev,cb) do { ev_init ((ev), (cb)); ev_check_set ((ev)); } while (0)
|
||||
#define ev_embed_init(ev,cb,other) do { ev_init ((ev), (cb)); ev_embed_set ((ev),(other)); } while (0)
|
||||
#define ev_fork_init(ev,cb) do { ev_init ((ev), (cb)); ev_fork_set ((ev)); } while (0)
|
||||
#define ev_async_init(ev,cb) do { ev_init ((ev), (cb)); ev_async_set ((ev)); } while (0)
|
||||
|
||||
#define ev_is_pending(ev) (0 + ((ev_watcher *)(void *)(ev))->pending) /* ro, true when watcher is waiting for callback invocation */
|
||||
#define ev_is_active(ev) (0 + ((ev_watcher *)(void *)(ev))->active) /* ro, true when the watcher has been started */
|
||||
|
||||
#define ev_cb(ev) (ev)->cb /* rw */
|
||||
|
||||
#if EV_MINPRI == EV_MAXPRI
|
||||
# define ev_priority(ev) ((ev), EV_MINPRI)
|
||||
# define ev_set_priority(ev,pri) ((ev), (pri))
|
||||
#else
|
||||
# define ev_priority(ev) ((((ev_watcher *)(void *)(ev))->priority) + 0)
|
||||
# define ev_set_priority(ev,pri) ( (ev_watcher *)(void *)(ev))->priority = (pri)
|
||||
#endif
|
||||
|
||||
#define ev_periodic_at(ev) (((ev_watcher_time *)(ev))->at + 0.)
|
||||
|
||||
#ifndef ev_set_cb
|
||||
# define ev_set_cb(ev,cb_) ev_cb (ev) = (cb_)
|
||||
#endif
|
||||
|
||||
/* stopping (enabling, adding) a watcher does nothing if it is already running */
|
||||
/* stopping (disabling, deleting) a watcher does nothing unless its already running */
|
||||
#if EV_PROTOTYPES
|
||||
|
||||
/* feeds an event into a watcher as if the event actually occured */
|
||||
/* accepts any ev_watcher type */
|
||||
void ev_feed_event (EV_P_ void *w, int revents);
|
||||
void ev_feed_fd_event (EV_P_ int fd, int revents);
|
||||
void ev_feed_signal_event (EV_P_ int signum);
|
||||
void ev_invoke (EV_P_ void *w, int revents);
|
||||
int ev_clear_pending (EV_P_ void *w);
|
||||
|
||||
void ev_io_start (EV_P_ ev_io *w);
|
||||
void ev_io_stop (EV_P_ ev_io *w);
|
||||
|
||||
void ev_timer_start (EV_P_ ev_timer *w);
|
||||
void ev_timer_stop (EV_P_ ev_timer *w);
|
||||
/* stops if active and no repeat, restarts if active and repeating, starts if inactive and repeating */
|
||||
void ev_timer_again (EV_P_ ev_timer *w);
|
||||
/* return remaining time */
|
||||
ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w);
|
||||
|
||||
#if EV_PERIODIC_ENABLE
|
||||
void ev_periodic_start (EV_P_ ev_periodic *w);
|
||||
void ev_periodic_stop (EV_P_ ev_periodic *w);
|
||||
void ev_periodic_again (EV_P_ ev_periodic *w);
|
||||
#endif
|
||||
|
||||
/* only supported in the default loop */
|
||||
void ev_signal_start (EV_P_ ev_signal *w);
|
||||
void ev_signal_stop (EV_P_ ev_signal *w);
|
||||
|
||||
/* only supported in the default loop */
|
||||
void ev_child_start (EV_P_ ev_child *w);
|
||||
void ev_child_stop (EV_P_ ev_child *w);
|
||||
|
||||
# if EV_STAT_ENABLE
|
||||
void ev_stat_start (EV_P_ ev_stat *w);
|
||||
void ev_stat_stop (EV_P_ ev_stat *w);
|
||||
void ev_stat_stat (EV_P_ ev_stat *w);
|
||||
# endif
|
||||
|
||||
# if EV_IDLE_ENABLE
|
||||
void ev_idle_start (EV_P_ ev_idle *w);
|
||||
void ev_idle_stop (EV_P_ ev_idle *w);
|
||||
# endif
|
||||
|
||||
void ev_prepare_start (EV_P_ ev_prepare *w);
|
||||
void ev_prepare_stop (EV_P_ ev_prepare *w);
|
||||
|
||||
void ev_check_start (EV_P_ ev_check *w);
|
||||
void ev_check_stop (EV_P_ ev_check *w);
|
||||
|
||||
# if EV_FORK_ENABLE
|
||||
void ev_fork_start (EV_P_ ev_fork *w);
|
||||
void ev_fork_stop (EV_P_ ev_fork *w);
|
||||
# endif
|
||||
|
||||
# if EV_EMBED_ENABLE
|
||||
/* only supported when loop to be embedded is in fact embeddable */
|
||||
void ev_embed_start (EV_P_ ev_embed *w);
|
||||
void ev_embed_stop (EV_P_ ev_embed *w);
|
||||
void ev_embed_sweep (EV_P_ ev_embed *w);
|
||||
# endif
|
||||
|
||||
# if EV_ASYNC_ENABLE
|
||||
void ev_async_start (EV_P_ ev_async *w);
|
||||
void ev_async_stop (EV_P_ ev_async *w);
|
||||
void ev_async_send (EV_P_ ev_async *w);
|
||||
# endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user