mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-02 16:17:50 +00:00
Compare commits
5322 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
772c461a33 | ||
|
|
110ca4d1b5 | ||
|
|
aafb05b675 | ||
|
|
ff6fc56a15 | ||
|
|
2dfbe9fe77 | ||
|
|
4a0fe2c17b | ||
|
|
9f7e626b9a | ||
|
|
f2985bda5f | ||
|
|
1517745a6a | ||
|
|
887cb55919 | ||
|
|
5c42d0ef31 | ||
|
|
837d47a309 | ||
|
|
f3766cf889 | ||
|
|
2b8b63e59f | ||
|
|
d64583b743 | ||
|
|
9ec65d5ed5 | ||
|
|
9fe6afcdcc | ||
|
|
6a4e0fb41b | ||
|
|
b570884bb3 | ||
|
|
8f8f8e288c | ||
|
|
8698a5e0e8 | ||
|
|
ad5e30e189 | ||
|
|
19ee0c74f8 | ||
|
|
007e5aa27a | ||
|
|
2509f562b5 | ||
|
|
a58a276ffd | ||
|
|
1a5b9dcce1 | ||
|
|
1240a0dfdd | ||
|
|
0194169e79 | ||
|
|
a71c19e1b5 | ||
|
|
bfbfa719ff | ||
|
|
49389d0a2f | ||
|
|
e380062403 | ||
|
|
b83abfa9c1 | ||
|
|
48dbf203a5 | ||
|
|
23768398c5 | ||
|
|
ab73503859 | ||
|
|
a4f7d4cc2a | ||
|
|
cca5ac60d6 | ||
|
|
9f7f9fc3c5 | ||
|
|
6e2fb92e9a | ||
|
|
4f702e2381 | ||
|
|
b188f903ce | ||
|
|
7b93dc9c32 | ||
|
|
664d66a89e | ||
|
|
d9dc0e6fd1 | ||
|
|
53168e4cfd | ||
|
|
7998632685 | ||
|
|
86f2a1061c | ||
|
|
9ca02a448e | ||
|
|
17091d3a0e | ||
|
|
c94b1488e9 | ||
|
|
7b2274cb44 | ||
|
|
7c27a6f51e | ||
|
|
e91371d406 | ||
|
|
e878559fb9 | ||
|
|
36af8de116 | ||
|
|
09dd3a8fea | ||
|
|
5dd6b90692 | ||
|
|
97fd94744e | ||
|
|
0da3674d5e | ||
|
|
01d530d65e | ||
|
|
10dd42b6e4 | ||
|
|
ba2d3f7704 | ||
|
|
607fe2a5f6 | ||
|
|
4643679d79 | ||
|
|
04180c7c96 | ||
|
|
3846348f8a | ||
|
|
dc2fc9428d | ||
|
|
6e399ce311 | ||
|
|
641b544801 | ||
|
|
761a100397 | ||
|
|
cf1a4f893f | ||
|
|
19613be861 | ||
|
|
c163659713 | ||
|
|
aae02af265 | ||
|
|
cb96bf15b7 | ||
|
|
c006c28f55 | ||
|
|
d358d00531 | ||
|
|
abcebb4f48 | ||
|
|
6e74724c0f | ||
|
|
c5f6c43326 | ||
|
|
a9e8c0ba76 | ||
|
|
5388d8a7b0 | ||
|
|
ee499b36ea | ||
|
|
13e4b959a4 | ||
|
|
5a336403f9 | ||
|
|
26265c011a | ||
|
|
4a390bca1c | ||
|
|
af46ead30d | ||
|
|
de0f936e92 | ||
|
|
bf9dcfe89c | ||
|
|
df0ecd2a93 | ||
|
|
b3ebb3c3d3 | ||
|
|
0bead0c69a | ||
|
|
a055b0a04f | ||
|
|
d6f6007692 | ||
|
|
8ee7ffb2ab | ||
|
|
40ff04911e | ||
|
|
a3676618af | ||
|
|
b1ed66c6f5 | ||
|
|
53b3f81abe | ||
|
|
bd2428dde5 | ||
|
|
b7ae5f0885 | ||
|
|
8c5b64c7d7 | ||
|
|
641112dd4d | ||
|
|
1c47acd040 | ||
|
|
d58d6f45cc | ||
|
|
7efa921bab | ||
|
|
feafdb3c6a | ||
|
|
784ee6a086 | ||
|
|
3014f20b6c | ||
|
|
40bb035b09 | ||
|
|
ba32bf3b8d | ||
|
|
e9edc06aaf | ||
|
|
c91196d240 | ||
|
|
08c7bf3c85 | ||
|
|
046470a8db | ||
|
|
2b1eedb036 | ||
|
|
02bea6534c | ||
|
|
6f4099c20b | ||
|
|
39735df82f | ||
|
|
5062f22839 | ||
|
|
e397707dc9 | ||
|
|
66d6e226a9 | ||
|
|
fbfa578c11 | ||
|
|
5cd7208ef3 | ||
|
|
e5bc6a0315 | ||
|
|
495c890aac | ||
|
|
5fe4a1b05d | ||
|
|
d8bf62995b | ||
|
|
e36f7e7161 | ||
|
|
285b667c3e | ||
|
|
aefbdbb6d5 | ||
|
|
8debfc6e6c | ||
|
|
c9ca772a32 | ||
|
|
dc65792776 | ||
|
|
18ae1d7c18 | ||
|
|
d790a1b3c6 | ||
|
|
349c627110 | ||
|
|
db23fcfe9f | ||
|
|
d5a6a75639 | ||
|
|
404a7181a8 | ||
|
|
e392b8e240 | ||
|
|
6752d75ad0 | ||
|
|
e00d9821a8 | ||
|
|
1cf7093f46 | ||
|
|
88708ec00f | ||
|
|
984b0af883 | ||
|
|
8810754ada | ||
|
|
0d340b378b | ||
|
|
e30dc968ef | ||
|
|
ea942b0642 | ||
|
|
7e9d49b300 | ||
|
|
ce60ac4274 | ||
|
|
a04fc310b4 | ||
|
|
4a805ea666 | ||
|
|
1595651780 | ||
|
|
fc85cac91d | ||
|
|
73134f9dcc | ||
|
|
eb72bbe6f7 | ||
|
|
a5ae078f8f | ||
|
|
1cd9dc49a9 | ||
|
|
d64a97195b | ||
|
|
c6a3ace553 | ||
|
|
497d57ca95 | ||
|
|
3a07b411fb | ||
|
|
b0c2a8d5fd | ||
|
|
e404d214aa | ||
|
|
7f295dc6e8 | ||
|
|
d2a8203efb | ||
|
|
33bfa8f961 | ||
|
|
f944254cb8 | ||
|
|
30339cfd86 | ||
|
|
7dd5549b05 | ||
|
|
b6b59d93d7 | ||
|
|
5af68bbf94 | ||
|
|
db7debd3da | ||
|
|
29bc8d965b | ||
|
|
daeb55e99d | ||
|
|
fa4d85897c | ||
|
|
983363e0cd | ||
|
|
d95dad76b8 | ||
|
|
18f74aa5b2 | ||
|
|
e96a8f7bc6 | ||
|
|
29f39be6ad | ||
|
|
7a17967d79 | ||
|
|
de5bd32aba | ||
|
|
199b2e1a3a | ||
|
|
a43e4f10ef | ||
|
|
5522e4641d | ||
|
|
6c82ea8fc3 | ||
|
|
b4b45b7139 | ||
|
|
7ebb033016 | ||
|
|
163fdb46f0 | ||
|
|
b38cf204f7 | ||
|
|
fe5381b0f4 | ||
|
|
c99e7f1337 | ||
|
|
b61b674fec | ||
|
|
3bdaf99cfa | ||
|
|
6c85e7015a | ||
|
|
9788f7101b | ||
|
|
d0d5a3802d | ||
|
|
1f160b31ff | ||
|
|
13659e87cb | ||
|
|
ac9b0bfc1b | ||
|
|
07f7a3f3c5 | ||
|
|
22984f4eb2 | ||
|
|
2286283f98 | ||
|
|
5ca26e6ae0 | ||
|
|
e7c3afc1e5 | ||
|
|
82e9b4197b | ||
|
|
820939f014 | ||
|
|
e4c9916e17 | ||
|
|
ce88b120eb | ||
|
|
23c5101227 | ||
|
|
de3eeb2d47 | ||
|
|
03f7205e6d | ||
|
|
7bf7ab954b | ||
|
|
97612f3b31 | ||
|
|
71702d058c | ||
|
|
6a4164d9f3 | ||
|
|
d3b0eae84c | ||
|
|
0105b93f38 | ||
|
|
cae0d2c707 | ||
|
|
dcb1572240 | ||
|
|
e20f43018b | ||
|
|
01e176694f | ||
|
|
a239ccaa9a | ||
|
|
b97a05b7f2 | ||
|
|
c86754afde | ||
|
|
95da9c0dd4 | ||
|
|
567171993b | ||
|
|
60a0d554a0 | ||
|
|
f87af6c642 | ||
|
|
df849e8698 | ||
|
|
7a8ef7aeb7 | ||
|
|
25c7c8b153 | ||
|
|
8048f015e5 | ||
|
|
8a7fce41bb | ||
|
|
094a272443 | ||
|
|
552be2f5fb | ||
|
|
d99954133c | ||
|
|
c49ace5587 | ||
|
|
258ad020ed | ||
|
|
59de939c1d | ||
|
|
9d2d4f39bc | ||
|
|
f555cd2303 | ||
|
|
fcb80e926d | ||
|
|
3f1fd98bef | ||
|
|
e2280db917 | ||
|
|
627e92e7e0 | ||
|
|
5a9ca34a92 | ||
|
|
880ffcb1f6 | ||
|
|
4e35d970af | ||
|
|
42a4e09f91 | ||
|
|
b13b17e801 | ||
|
|
68d0238044 | ||
|
|
82b4f4147e | ||
|
|
6cbd2c4188 | ||
|
|
78982f3074 | ||
|
|
345746f7ab | ||
|
|
741a7b9caa | ||
|
|
7544c8fac8 | ||
|
|
a46169329d | ||
|
|
9aa56630ab | ||
|
|
01819e7a5a | ||
|
|
bae497ec5a | ||
|
|
68e0c78602 | ||
|
|
6296afd279 | ||
|
|
6d58fe912d | ||
|
|
0c45957096 | ||
|
|
aa311bd792 | ||
|
|
8858cdbe8c | ||
|
|
9d033247e9 | ||
|
|
cacae31af3 | ||
|
|
759a44e2b8 | ||
|
|
2fb778413b | ||
|
|
473d059efd | ||
|
|
67cd43d97a | ||
|
|
b77248c975 | ||
|
|
6bc58a16f6 | ||
|
|
0edbd96bb5 | ||
|
|
6ecc675670 | ||
|
|
c0a6f051fc | ||
|
|
6bc0aba800 | ||
|
|
6949f71516 | ||
|
|
f6c6de40f1 | ||
|
|
fdea9a447f | ||
|
|
2e02636fc1 | ||
|
|
17b9646c0b | ||
|
|
0a3d7e7cbc | ||
|
|
a62d70e80c | ||
|
|
96bbf74207 | ||
|
|
6cfe7fa5ea | ||
|
|
efc61ea70d | ||
|
|
e752b26f9e | ||
|
|
6b19ca1c11 | ||
|
|
42e01fd37b | ||
|
|
1df18a3e10 | ||
|
|
f31fb8bd34 | ||
|
|
1d54d868e3 | ||
|
|
4b801f423b | ||
|
|
96ef2110ce | ||
|
|
84763cab26 | ||
|
|
fc2ce9a021 | ||
|
|
a5c1421c6b | ||
|
|
1a54e43a24 | ||
|
|
1ab5a20784 | ||
|
|
1634388534 | ||
|
|
455afb0019 | ||
|
|
349dfbf182 | ||
|
|
b081b3ae2d | ||
|
|
110f86f803 | ||
|
|
ace771d4e9 | ||
|
|
7544166d11 | ||
|
|
ff5f06b9f0 | ||
|
|
06395f8436 | ||
|
|
fe3d86bf13 | ||
|
|
f92dc95c58 | ||
|
|
9058c00cfe | ||
|
|
8b6bd8442e | ||
|
|
1ef22e976d | ||
|
|
d0d86aecf8 | ||
|
|
1ef4807a8e | ||
|
|
846e813c99 | ||
|
|
73405cf042 | ||
|
|
79c873f3f8 | ||
|
|
0fc6929dd4 | ||
|
|
753a32bed7 | ||
|
|
027c572758 | ||
|
|
afb7d3e351 | ||
|
|
a5c3ae0a7e | ||
|
|
9477e46fb3 | ||
|
|
bf06df4475 | ||
|
|
e775a58496 | ||
|
|
ad15e47d4d | ||
|
|
45f7a91780 | ||
|
|
b1401d03a1 | ||
|
|
8b264e5c11 | ||
|
|
2fb4ec0d5f | ||
|
|
ddd5318bb0 | ||
|
|
3d44135df5 | ||
|
|
a98fc802fc | ||
|
|
ed364ecfee | ||
|
|
434d217bfa | ||
|
|
2386557b5e | ||
|
|
f619a6666a | ||
|
|
359ef9715e | ||
|
|
9211bc6329 | ||
|
|
a26ef1a997 | ||
|
|
c9f53b9a1c | ||
|
|
f9a3e66716 | ||
|
|
e5464fa199 | ||
|
|
9dc2f1ee29 | ||
|
|
b27143aa15 | ||
|
|
07c38311ca | ||
|
|
4a0415a6bd | ||
|
|
5d97cdbcfe | ||
|
|
7cce658fc4 | ||
|
|
84879453b1 | ||
|
|
9cc79db819 | ||
|
|
17a1663513 | ||
|
|
11538ccf90 | ||
|
|
5c51b1c4d1 | ||
|
|
5a13fe28c9 | ||
|
|
946560c998 | ||
|
|
7c5e032853 | ||
|
|
54ae91b2d9 | ||
|
|
8bd8aa3037 | ||
|
|
6fa9490a13 | ||
|
|
5dc48d1a83 | ||
|
|
9e56a92c8a | ||
|
|
ac98d81b85 | ||
|
|
05e80e32f7 | ||
|
|
7435058859 | ||
|
|
81b1d6e451 | ||
|
|
52754415e0 | ||
|
|
d51d67a5c2 | ||
|
|
c62fbd811b | ||
|
|
1df780abba | ||
|
|
150511b263 | ||
|
|
7fefa954c8 | ||
|
|
030472cee4 | ||
|
|
00c0dc233e | ||
|
|
1013bccb9c | ||
|
|
0911e77c32 | ||
|
|
4cdd33b2aa | ||
|
|
638f081390 | ||
|
|
21f28bfd0d | ||
|
|
941745cd06 | ||
|
|
8bf6bcb8a7 | ||
|
|
e7b8fd8281 | ||
|
|
b1ba01e85a | ||
|
|
a74c71e423 | ||
|
|
dba1bcf973 | ||
|
|
ed3f8cc39d | ||
|
|
f39fdc42f6 | ||
|
|
9ef191db33 | ||
|
|
9582f25835 | ||
|
|
4463975ace | ||
|
|
33cf509822 | ||
|
|
34f44e8f25 | ||
|
|
7fb738ab91 | ||
|
|
973e0812ad | ||
|
|
cd8218541a | ||
|
|
2316dff1e0 | ||
|
|
15ce24db25 | ||
|
|
b0e0a20e96 | ||
|
|
849f8e77ec | ||
|
|
f7c7dee8b0 | ||
|
|
167fad9649 | ||
|
|
9d3a298895 | ||
|
|
19b5ef7c6f | ||
|
|
9b09caa463 | ||
|
|
f08b6e2690 | ||
|
|
fa13cb5544 | ||
|
|
1427c99169 | ||
|
|
3e155bdbb9 | ||
|
|
f830612f17 | ||
|
|
3b86574b4d | ||
|
|
30d9cb9a4a | ||
|
|
cfe05b7d34 | ||
|
|
60a016ae39 | ||
|
|
6229e02806 | ||
|
|
5202294ae2 | ||
|
|
5bc50c2ef0 | ||
|
|
22b0b942ae | ||
|
|
41f86399f0 | ||
|
|
bc7f2af2ce | ||
|
|
db04398e49 | ||
|
|
56929e9725 | ||
|
|
6798259b84 | ||
|
|
20906c7bf7 | ||
|
|
560ddac75a | ||
|
|
daecf5cf01 | ||
|
|
505f8d5cda | ||
|
|
1d7fd0638d | ||
|
|
67ca691334 | ||
|
|
85da55d917 | ||
|
|
ee8567ab38 | ||
|
|
4ca2740628 | ||
|
|
23e6302329 | ||
|
|
95c6dd8992 | ||
|
|
a5b733998d | ||
|
|
68b7749a0f | ||
|
|
fb37e0767a | ||
|
|
43469b9877 | ||
|
|
5a53215506 | ||
|
|
51ce9edcf3 | ||
|
|
18481a40b2 | ||
|
|
24c0221ec5 | ||
|
|
0f928233ce | ||
|
|
e5730af949 | ||
|
|
ed23b6b89d | ||
|
|
28420ac1fc | ||
|
|
6da255f786 | ||
|
|
2396932846 | ||
|
|
89b9f46ad8 | ||
|
|
7dd0bb5005 | ||
|
|
44ecbc944b | ||
|
|
223460bbd2 | ||
|
|
1a0a9709f2 | ||
|
|
a16c282f99 | ||
|
|
aeac5b0203 | ||
|
|
afdc4b746a | ||
|
|
6c84ccd5c5 | ||
|
|
916bfed84b | ||
|
|
35bb3ac128 | ||
|
|
4f1c3887f7 | ||
|
|
ce19067cfd | ||
|
|
00f4ebe6aa | ||
|
|
5add1cfd25 | ||
|
|
c67092d72b | ||
|
|
4bb5402cca | ||
|
|
837acf1394 | ||
|
|
0d8779734d | ||
|
|
d8213454c2 | ||
|
|
e05c8677bf | ||
|
|
a5b9063088 | ||
|
|
83ea7ac136 | ||
|
|
f3075d685e | ||
|
|
a811476c1b | ||
|
|
64fe626fa6 | ||
|
|
f8236c711f | ||
|
|
b1f6bc72f4 | ||
|
|
300dee34bd | ||
|
|
1eaa112f7d | ||
|
|
8228376160 | ||
|
|
a58cd65db8 | ||
|
|
2df689524e | ||
|
|
a20ad60f13 | ||
|
|
1c781389d2 | ||
|
|
5e639d1704 | ||
|
|
8e64432e2c | ||
|
|
a8de2ca410 | ||
|
|
6343518bca | ||
|
|
351e259174 | ||
|
|
1d77e29c3c | ||
|
|
eba9b3d22a | ||
|
|
844fe1d979 | ||
|
|
0971a7820f | ||
|
|
06c6f180dc | ||
|
|
33da30266c | ||
|
|
ad8628f8e7 | ||
|
|
f42446d22f | ||
|
|
4b77b7a8b3 | ||
|
|
9e99a57615 | ||
|
|
7e648741ad | ||
|
|
b1d396bbbb | ||
|
|
380435d020 | ||
|
|
71fb66dc37 | ||
|
|
a53280f047 | ||
|
|
ccfb968b8a | ||
|
|
db731e0c91 | ||
|
|
a4b86f8368 | ||
|
|
44c697908b | ||
|
|
e3c79bd24a | ||
|
|
fb1ed531e4 | ||
|
|
a6cb6d26a4 | ||
|
|
003a5981d6 | ||
|
|
0bf38b826e | ||
|
|
4038d12f1b | ||
|
|
9d60e28aad | ||
|
|
ae92aa200f | ||
|
|
4584b857ca | ||
|
|
46bdf5d79d | ||
|
|
83720f457e | ||
|
|
0706af1543 | ||
|
|
41985d8c1a | ||
|
|
440eb0876c | ||
|
|
ac0a0ea07e | ||
|
|
4a534da00a | ||
|
|
ff4143b482 | ||
|
|
f132c0024f | ||
|
|
82a1010f64 | ||
|
|
d885a9afd0 | ||
|
|
08568fcc8f | ||
|
|
2192b7748e | ||
|
|
c96a579291 | ||
|
|
095cf94c45 | ||
|
|
f7a49778ea | ||
|
|
58b235b435 | ||
|
|
a7f1c3c883 | ||
|
|
268d411bb4 | ||
|
|
7cdf708e3c | ||
|
|
42c077de02 | ||
|
|
769f78a2b7 | ||
|
|
b69ba06db9 | ||
|
|
42d5cc584e | ||
|
|
f3d54d0975 | ||
|
|
39192ad388 | ||
|
|
19500d36c7 | ||
|
|
229f0b48cd | ||
|
|
58736f743e | ||
|
|
dc136cbf31 | ||
|
|
81e39f7c4b | ||
|
|
1cbb6f1405 | ||
|
|
1ae6e67cdc | ||
|
|
3d43cc1029 | ||
|
|
230e8d0787 | ||
|
|
8154e5e521 | ||
|
|
f4467f6033 | ||
|
|
562b04a763 | ||
|
|
9bcbcc5293 | ||
|
|
fdc15df3b3 | ||
|
|
e778458f78 | ||
|
|
0a55eff5d5 | ||
|
|
3874b5bf84 | ||
|
|
d07343a1aa | ||
|
|
a37c6db377 | ||
|
|
1f991a7cdc | ||
|
|
e99a31c2fa | ||
|
|
876fe52efc | ||
|
|
8f190b1fb1 | ||
|
|
411f3ecb3e | ||
|
|
3d31423eef | ||
|
|
68c0eb5216 | ||
|
|
39dae19974 | ||
|
|
2dd6f0124e | ||
|
|
826af968c8 | ||
|
|
70c3d325a0 | ||
|
|
6289211910 | ||
|
|
86346291a7 | ||
|
|
05d57b90a9 | ||
|
|
dd64f5eac4 | ||
|
|
e6de183651 | ||
|
|
7bd986337a | ||
|
|
6dc92df880 | ||
|
|
44abe46da4 | ||
|
|
9e334b5ece | ||
|
|
ee8a248086 | ||
|
|
8f1f98b003 | ||
|
|
a6bc1fa316 | ||
|
|
ce6c0f3082 | ||
|
|
393849384b | ||
|
|
618280340f | ||
|
|
6b77af4e5a | ||
|
|
aa8524b8ad | ||
|
|
87a813566a | ||
|
|
73a97d5762 | ||
|
|
ce4c6ec755 | ||
|
|
21b5139d98 | ||
|
|
7745c91c69 | ||
|
|
bce8f498b4 | ||
|
|
7eaacc3997 | ||
|
|
c699ff7574 | ||
|
|
11d8867d7a | ||
|
|
d4eeb8d186 | ||
|
|
a562a20b4e | ||
|
|
3ecf626ad0 | ||
|
|
766c4315e6 | ||
|
|
b9f2855034 | ||
|
|
44397f79a6 | ||
|
|
dcca9b82b1 | ||
|
|
ecef32a101 | ||
|
|
41d425319c | ||
|
|
6a49f227b4 | ||
|
|
a3ced39b12 | ||
|
|
b89045b20f | ||
|
|
4e3f3899c4 | ||
|
|
a8d865a246 | ||
|
|
cad0fbfc4d | ||
|
|
45f07d5014 | ||
|
|
64a7503196 | ||
|
|
783c23cbfb | ||
|
|
1c04dfe083 | ||
|
|
59ec97f59f | ||
|
|
c71d26c7e8 | ||
|
|
88e58aa8f9 | ||
|
|
40850f9cda | ||
|
|
be3afcf668 | ||
|
|
c1b7679cac | ||
|
|
a370c48d9c | ||
|
|
6c0e456a5e | ||
|
|
ebb993b862 | ||
|
|
3408db91b6 | ||
|
|
f0e8371997 | ||
|
|
55383b9de4 | ||
|
|
5551a8365a | ||
|
|
87fc16af19 | ||
|
|
80d91b693a | ||
|
|
977438309b | ||
|
|
28b426f19d | ||
|
|
d40c5d3de8 | ||
|
|
53702774d0 | ||
|
|
b36e659c56 | ||
|
|
0dcf028592 | ||
|
|
549918d7f9 | ||
|
|
dcb23f46a4 | ||
|
|
c152ae71e2 | ||
|
|
32cd726bd0 | ||
|
|
4f104d74ca | ||
|
|
9c44430975 | ||
|
|
1309f37a7e | ||
|
|
3ed0cc14ea | ||
|
|
73a698151f | ||
|
|
8a3842b788 | ||
|
|
73d68c9609 | ||
|
|
f6d81e1bd8 | ||
|
|
98e607e610 | ||
|
|
a7ec0c2e93 | ||
|
|
0b3e19f56e | ||
|
|
60ac7cfe74 | ||
|
|
491102f221 | ||
|
|
9db252e55d | ||
|
|
b9b94609f5 | ||
|
|
fe910d01f6 | ||
|
|
ea71539b7a | ||
|
|
3d9fd1d374 | ||
|
|
3eda8e64f3 | ||
|
|
ec8ccbcc55 | ||
|
|
1d58823405 | ||
|
|
19e0650c4f | ||
|
|
f45fc10cb1 | ||
|
|
42dff0e5fb | ||
|
|
ee9339e73b | ||
|
|
611aaa5385 | ||
|
|
e25369a306 | ||
|
|
67701944f1 | ||
|
|
ecaee16d23 | ||
|
|
b84c336855 | ||
|
|
447bafaa5b | ||
|
|
2f93e0a499 | ||
|
|
6c2ada9ffc | ||
|
|
982b9d2b0a | ||
|
|
1fe87d0348 | ||
|
|
8d8d4fa3b1 | ||
|
|
94fb8c6f92 | ||
|
|
04c7b33f90 | ||
|
|
ae76c3ee71 | ||
|
|
7d1e24d07f | ||
|
|
37955345ef | ||
|
|
4bc35e9ed4 | ||
|
|
c142cfc81d | ||
|
|
39a22bf15b | ||
|
|
eb636f9538 | ||
|
|
8a838633d1 | ||
|
|
963e297c74 | ||
|
|
d95dbf6ba8 | ||
|
|
ae032c8523 | ||
|
|
2b4a10c159 | ||
|
|
c7ef030ef5 | ||
|
|
7e726735ba | ||
|
|
3d25b2fd9b | ||
|
|
96a22aaec0 | ||
|
|
ccef887f88 | ||
|
|
7d9c6527a4 | ||
|
|
ef7191dbc1 | ||
|
|
bc2adb208c | ||
|
|
cd371ac66f | ||
|
|
9c342eb432 | ||
|
|
95f5b39aed | ||
|
|
9ce38cb43c | ||
|
|
8b57b3086e | ||
|
|
3fdec6d25e | ||
|
|
557af10067 | ||
|
|
6b2645b310 | ||
|
|
c360ee0fa4 | ||
|
|
3ac5870530 | ||
|
|
5218fd2c24 | ||
|
|
accb8e9b07 | ||
|
|
e331ea5d82 | ||
|
|
ae804b8cc7 | ||
|
|
66d72345f2 | ||
|
|
436d64f881 | ||
|
|
c3ec32cc16 | ||
|
|
4b86df4966 | ||
|
|
9fbf1955f2 | ||
|
|
2008a82017 | ||
|
|
8c04a00177 | ||
|
|
8370277352 | ||
|
|
89279009d8 | ||
|
|
182b29662d | ||
|
|
8119bcdc61 | ||
|
|
b6d40f75c9 | ||
|
|
d9570e8223 | ||
|
|
3a0fc24a6a | ||
|
|
04879d0fe5 | ||
|
|
0d9b03ced2 | ||
|
|
7be7acfe30 | ||
|
|
655f7918ea | ||
|
|
67e799ccb2 | ||
|
|
4c12319d19 | ||
|
|
3769719816 | ||
|
|
cc8e4956f5 | ||
|
|
3ad67c754f | ||
|
|
cabd4198b0 | ||
|
|
2bf80673ae | ||
|
|
2182e0696d | ||
|
|
9c44b5c384 | ||
|
|
d5f51f2881 | ||
|
|
176e17c45d | ||
|
|
7912b08c41 | ||
|
|
643ffce289 | ||
|
|
0d4d740961 | ||
|
|
68473f08d6 | ||
|
|
6c09a69991 | ||
|
|
ac16bc0e15 | ||
|
|
99287a89eb | ||
|
|
e0aaf876c2 | ||
|
|
022f79beed | ||
|
|
a6aac88561 | ||
|
|
87057095bc | ||
|
|
5afa75ce51 | ||
|
|
c525598fd9 | ||
|
|
f54cfb0ea2 | ||
|
|
91fcf837f7 | ||
|
|
64e98d897f | ||
|
|
99a5fcc665 | ||
|
|
f0c38a6419 | ||
|
|
14c2747e80 | ||
|
|
3ee2a15cde | ||
|
|
8982578edd | ||
|
|
5ec6f1085a | ||
|
|
1513e46605 | ||
|
|
b95ed73e1d | ||
|
|
ff22efb3e2 | ||
|
|
35c6db1289 | ||
|
|
602e5d2766 | ||
|
|
247c4f1068 | ||
|
|
bdb5e4642f | ||
|
|
661e9b08b6 | ||
|
|
fdf6478bc9 | ||
|
|
10229cd332 | ||
|
|
33e2499006 | ||
|
|
6ae58e74c7 | ||
|
|
689b292c24 | ||
|
|
f6a4ab62b8 | ||
|
|
e197884e07 | ||
|
|
ba095d11cc | ||
|
|
e22cb5f3b3 | ||
|
|
da993ee48d | ||
|
|
9458759810 | ||
|
|
dd27a0adc7 | ||
|
|
3fd276f8a6 | ||
|
|
33f454bb75 | ||
|
|
1fd5d501b0 | ||
|
|
e4220282c8 | ||
|
|
6dec9cb831 | ||
|
|
1ad55ec263 | ||
|
|
96f5dbfccf | ||
|
|
fd2aa1f51c | ||
|
|
74137d4eab | ||
|
|
02398e319d | ||
|
|
32d6a04107 | ||
|
|
6bff374e91 | ||
|
|
18b5cb24c2 | ||
|
|
04e8ca771b | ||
|
|
174f771612 | ||
|
|
4f0a5e937b | ||
|
|
505f02fd72 | ||
|
|
a6c7ffd664 | ||
|
|
a08d52eb48 | ||
|
|
414ad602f2 | ||
|
|
e961505e0a | ||
|
|
59278a7a85 | ||
|
|
adaf6d7955 | ||
|
|
f6624bf270 | ||
|
|
cdf03228c2 | ||
|
|
1fd710e88d | ||
|
|
dc2e760b5a | ||
|
|
150bd32f97 | ||
|
|
d9fc0f1e37 | ||
|
|
e2c7e3a107 | ||
|
|
4995aa0298 | ||
|
|
54b774e481 | ||
|
|
c85095d53f | ||
|
|
8132ed52fd | ||
|
|
eb723422c1 | ||
|
|
051e5a6308 | ||
|
|
2d3e64b51a | ||
|
|
a21b25f751 | ||
|
|
1d425b1731 | ||
|
|
141630f557 | ||
|
|
9fd48bab69 | ||
|
|
f880e39838 | ||
|
|
afb66f4b8a | ||
|
|
7e09802565 | ||
|
|
a8b3833580 | ||
|
|
bf1bcaf394 | ||
|
|
7b61569d32 | ||
|
|
9c27ed8bda | ||
|
|
c9cb64ac10 | ||
|
|
4bd5122462 | ||
|
|
4dac4328e6 | ||
|
|
f7a857744f | ||
|
|
6725e7dc49 | ||
|
|
7da4ea5ecb | ||
|
|
6d5c6b2de7 | ||
|
|
ed462747bf | ||
|
|
53b37ca98f | ||
|
|
423320f235 | ||
|
|
020a8c864f | ||
|
|
69e6389369 | ||
|
|
0eaa10f578 | ||
|
|
2740dc5efa | ||
|
|
592824781c | ||
|
|
4bef0e21e7 | ||
|
|
7d7ce728ff | ||
|
|
27159cfa00 | ||
|
|
d236e37652 | ||
|
|
940559fc76 | ||
|
|
5746169aec | ||
|
|
4aa6fdeb2a | ||
|
|
77ab121c30 | ||
|
|
9558048906 | ||
|
|
b3f6426d36 | ||
|
|
d407d8aa08 | ||
|
|
8842fa209d | ||
|
|
bc252228e1 | ||
|
|
1b3cb0f184 | ||
|
|
f607c671f8 | ||
|
|
8f431cff52 | ||
|
|
6a81a7ba8e | ||
|
|
1f713ed9d1 | ||
|
|
2cb4829536 | ||
|
|
48d5110b5d | ||
|
|
68a5e2017e | ||
|
|
63c46a9aca | ||
|
|
528bec0bb1 | ||
|
|
9c79cb7766 | ||
|
|
38ac518095 | ||
|
|
7488068d50 | ||
|
|
8e207196d3 | ||
|
|
9c35db38a0 | ||
|
|
2087736649 | ||
|
|
dd75deb27f | ||
|
|
5f42a3d4db | ||
|
|
a569b723c5 | ||
|
|
ee2078f3ea | ||
|
|
12af298e33 | ||
|
|
0429f27c54 | ||
|
|
5026f51dfd | ||
|
|
80abaafcae | ||
|
|
bc651e886d | ||
|
|
ba9cfc3b26 | ||
|
|
b5bbc18c89 | ||
|
|
e35088f9e3 | ||
|
|
1c3b325633 | ||
|
|
0415701e50 | ||
|
|
cfe813fa08 | ||
|
|
f4ff336636 | ||
|
|
a4b333ceb8 | ||
|
|
f029d7c943 | ||
|
|
53bf94ce78 | ||
|
|
406e36977e | ||
|
|
98ee746ada | ||
|
|
9e0a22f771 | ||
|
|
14e62ae8d2 | ||
|
|
1162d2edd5 | ||
|
|
a84e44b2a3 | ||
|
|
cd4f278a16 | ||
|
|
c7f34e74ac | ||
|
|
00d26a6419 | ||
|
|
eb57e522aa | ||
|
|
e9230463e8 | ||
|
|
d652f144b2 | ||
|
|
e04a512c4c | ||
|
|
c276278767 | ||
|
|
2e248d1ca8 | ||
|
|
a5df55a6e7 | ||
|
|
f7e05e438e | ||
|
|
49266dce89 | ||
|
|
3a81738455 | ||
|
|
a4ff501bb1 | ||
|
|
351c131764 | ||
|
|
799fcb354b | ||
|
|
16a29659b3 | ||
|
|
55ef0f12cc | ||
|
|
925c489cf9 | ||
|
|
3f57236c19 | ||
|
|
b4dd21fc64 | ||
|
|
8278b1e79f | ||
|
|
c313f0c135 | ||
|
|
e9bfaa7d51 | ||
|
|
0ae254d6b4 | ||
|
|
bbc7b0b59b | ||
|
|
7f284d6ed5 | ||
|
|
4744f93a47 | ||
|
|
a2fe87a63a | ||
|
|
fa61e30dd5 | ||
|
|
0fb94ad3c6 | ||
|
|
33a73fb0c4 | ||
|
|
a61eeeaa03 | ||
|
|
80f6990a43 | ||
|
|
0d5f8437f5 | ||
|
|
5e968deb4e | ||
|
|
ac1ffa2efe | ||
|
|
ed2e6d16c8 | ||
|
|
dafe807888 | ||
|
|
1320706172 | ||
|
|
fb4cf9e78f | ||
|
|
8cbb8befd4 | ||
|
|
aa303df387 | ||
|
|
e42d29611c | ||
|
|
a5213f1291 | ||
|
|
875dfec570 | ||
|
|
6edde288ee | ||
|
|
a6ead18121 | ||
|
|
7245570405 | ||
|
|
38a37f1b18 | ||
|
|
5c98ab4b8f | ||
|
|
5ddb1ef76d | ||
|
|
8b320f913d | ||
|
|
8e0011d07a | ||
|
|
e50734a6fb | ||
|
|
307dae4fac | ||
|
|
d8c5f85cd2 | ||
|
|
94c95469e1 | ||
|
|
e8244f7f07 | ||
|
|
a48f48ca95 | ||
|
|
4a4e54479a | ||
|
|
86d06e0a4c | ||
|
|
9b41ae847b | ||
|
|
012cc521f5 | ||
|
|
20695548f1 | ||
|
|
d77c5123c1 | ||
|
|
c32a6837e6 | ||
|
|
c604be31e0 | ||
|
|
0a08edb6d7 | ||
|
|
4d7aeb8b96 | ||
|
|
6b09f1f233 | ||
|
|
7364c84b6b | ||
|
|
02a28d565b | ||
|
|
2ac6e31cc3 | ||
|
|
8bad4ae636 | ||
|
|
f0010ea3a8 | ||
|
|
f86bff3bf7 | ||
|
|
99b0094dcd | ||
|
|
db86a6ff1c | ||
|
|
cbc188916d | ||
|
|
2f411230c5 | ||
|
|
b9c8c877b7 | ||
|
|
13e4ba622e | ||
|
|
7863256de5 | ||
|
|
d81e029ec0 | ||
|
|
f6500eafb6 | ||
|
|
9da03f529f | ||
|
|
1e1e4fd557 | ||
|
|
08f8e659fd | ||
|
|
fc69fe1f21 | ||
|
|
38a16805ed | ||
|
|
dfd4ae9ea4 | ||
|
|
5c9585b2b0 | ||
|
|
dc2e769d9a | ||
|
|
15a4fb7adf | ||
|
|
7bb10d56f8 | ||
|
|
650282b186 | ||
|
|
ded3cfc251 | ||
|
|
a4fee3a3ad | ||
|
|
58d7404ee4 | ||
|
|
556eee8563 | ||
|
|
1422f50ee9 | ||
|
|
1be4adf365 | ||
|
|
4510ada21e | ||
|
|
e516d99b2d | ||
|
|
b534b83756 | ||
|
|
41b537249b | ||
|
|
4a87acf1ac | ||
|
|
41d3b66867 | ||
|
|
3ef7ae24e5 | ||
|
|
824d3b75f9 | ||
|
|
38a802fed3 | ||
|
|
ee776fd0de | ||
|
|
a1f29d8f4a | ||
|
|
3e42a817a1 | ||
|
|
617dd703e1 | ||
|
|
e63d7ff9d5 | ||
|
|
7e73b27edf | ||
|
|
6898b896d1 | ||
|
|
085e2c24d3 | ||
|
|
cc77eb7855 | ||
|
|
8e9f9f6f2f | ||
|
|
51006e8304 | ||
|
|
fce2bd89c7 | ||
|
|
830be3d918 | ||
|
|
0926e5a986 | ||
|
|
b61411956c | ||
|
|
5648fe940c | ||
|
|
57ad32448f | ||
|
|
b4db3c050d | ||
|
|
3f954ca790 | ||
|
|
6e0174e879 | ||
|
|
e4873f1982 | ||
|
|
3d35817a2f | ||
|
|
8c6aef3edb | ||
|
|
5fd8939b7d | ||
|
|
4c1b578b80 | ||
|
|
f6bf81d16f | ||
|
|
2d8cc57642 | ||
|
|
3b131f0231 | ||
|
|
202ce472bb | ||
|
|
7206edec2e | ||
|
|
9e86efadbc | ||
|
|
433331adac | ||
|
|
a0cd024b39 | ||
|
|
4fbb31b4dc | ||
|
|
09bcc5aaec | ||
|
|
c921c9bd12 | ||
|
|
8f621b38bf | ||
|
|
257d957dfb | ||
|
|
a0a6f0ae87 | ||
|
|
c396b60612 | ||
|
|
98a97b1eaf | ||
|
|
7d6fcc75da | ||
|
|
ecd8b7f614 | ||
|
|
cc1bcc25b9 | ||
|
|
b792276a00 | ||
|
|
b1d52ccd82 | ||
|
|
cc0e91ac2f | ||
|
|
dfac7b4261 | ||
|
|
1258eef213 | ||
|
|
f79148fa62 | ||
|
|
4d2aa29926 | ||
|
|
f016840c53 | ||
|
|
cffeec4713 | ||
|
|
fcbe4620cd | ||
|
|
5a5e0363c2 | ||
|
|
64512ee2ae | ||
|
|
ce4f2f1326 | ||
|
|
dfebb83c35 | ||
|
|
0ba226e3c2 | ||
|
|
e0f59eccf0 | ||
|
|
820e720b0a | ||
|
|
936c5f5d3d | ||
|
|
d0b3b8de44 | ||
|
|
89d53306f3 | ||
|
|
e30a20120c | ||
|
|
790d6331f8 | ||
|
|
9121ab95ea | ||
|
|
b09e5cf5a7 | ||
|
|
b53a8e873d | ||
|
|
4c38963c6f | ||
|
|
b0d6c34565 | ||
|
|
0a9c9411f0 | ||
|
|
e253f58aac | ||
|
|
0aa8ad202a | ||
|
|
7bc5a501c4 | ||
|
|
4691a38d21 | ||
|
|
00bae752d0 | ||
|
|
e253fe0547 | ||
|
|
e35d73be8f | ||
|
|
f9f7af2430 | ||
|
|
7aef780b14 | ||
|
|
5644a20eec | ||
|
|
b135431542 | ||
|
|
efdb254b12 | ||
|
|
8fd2f0ae11 | ||
|
|
3f7ee9bd2e | ||
|
|
a049c1189e | ||
|
|
9859b1555f | ||
|
|
356e47a6a3 | ||
|
|
2c1c8fc8df | ||
|
|
e7bdd4a624 | ||
|
|
1a9069e80a | ||
|
|
484861e3ee | ||
|
|
99ba0a4927 | ||
|
|
ba3ede584e | ||
|
|
dd472f489b | ||
|
|
9f0dd40b3b | ||
|
|
edc03287aa | ||
|
|
d6dc7627b9 | ||
|
|
59773ca284 | ||
|
|
6aa01ffe05 | ||
|
|
5b3de94fee | ||
|
|
b4edf122f6 | ||
|
|
1647c4deab | ||
|
|
3efb91e86d | ||
|
|
d6f73054a5 | ||
|
|
bd9b38665d | ||
|
|
de5c2b906e | ||
|
|
4a4badcdc1 | ||
|
|
fa7ebb36dc | ||
|
|
447440776b | ||
|
|
f5714f2eb0 | ||
|
|
a3b76f9259 | ||
|
|
ba71421a23 | ||
|
|
61251b305d | ||
|
|
73464d6bb6 | ||
|
|
7f7ebed4ea | ||
|
|
5c53809269 | ||
|
|
3935d5f2f7 | ||
|
|
693704a832 | ||
|
|
b17f6eee6a | ||
|
|
ccb90f46e6 | ||
|
|
dfa4cd921e | ||
|
|
32e0afd19c | ||
|
|
5fb732c0e6 | ||
|
|
48a6c4f2bf | ||
|
|
f1597386ef | ||
|
|
731d5b6872 | ||
|
|
ce569e4bc4 | ||
|
|
f48b8d6d91 | ||
|
|
4fc94a4383 | ||
|
|
c5057905b6 | ||
|
|
3c388c76c6 | ||
|
|
a730fe13c7 | ||
|
|
4520e0710d | ||
|
|
7e42892e6a | ||
|
|
a0c580298e | ||
|
|
e7ad50d243 | ||
|
|
1394d42f58 | ||
|
|
a8e95e25ad | ||
|
|
87cb4db263 | ||
|
|
2ccda44c44 | ||
|
|
0253c7bcf1 | ||
|
|
9c7b39b7a7 | ||
|
|
5f4611fce2 | ||
|
|
c4fa2e70bf | ||
|
|
15b1a22501 | ||
|
|
51425788d8 | ||
|
|
a17d5eea47 | ||
|
|
ef909e8a54 | ||
|
|
0a24e9854b | ||
|
|
4eb2eea809 | ||
|
|
8a6705617f | ||
|
|
bbe122aba5 | ||
|
|
40409df885 | ||
|
|
7fdbdae6b9 | ||
|
|
b87a18bd80 | ||
|
|
6d650a48db | ||
|
|
54ea0eac8e | ||
|
|
4054898170 | ||
|
|
8a205e1e32 | ||
|
|
39068730e2 | ||
|
|
1e344455b8 | ||
|
|
9a01f3a337 | ||
|
|
f6ea758b85 | ||
|
|
51fb82902b | ||
|
|
3c342adb67 | ||
|
|
24d592f94f | ||
|
|
181ebf024c | ||
|
|
ecf693ac75 | ||
|
|
8266266639 | ||
|
|
0f2419357c | ||
|
|
2e57123aa2 | ||
|
|
881733e099 | ||
|
|
18f778ce11 | ||
|
|
b8060a5bcc | ||
|
|
7a34b2982f | ||
|
|
f695af587a | ||
|
|
7759615775 | ||
|
|
bbad03547d | ||
|
|
b638f86b75 | ||
|
|
ab6210dc30 | ||
|
|
9ca16e3933 | ||
|
|
76ab41a742 | ||
|
|
c6f6eb294b | ||
|
|
19836a55a3 | ||
|
|
862c7fde6d | ||
|
|
5d842273d9 | ||
|
|
33a9ebaba1 | ||
|
|
192e35882a | ||
|
|
e6b9aaf499 | ||
|
|
b821660e79 | ||
|
|
0beaf47a64 | ||
|
|
8a9e9e9a11 | ||
|
|
df17244353 | ||
|
|
ffd3e17364 | ||
|
|
211a6cc4f1 | ||
|
|
4c09879aab | ||
|
|
fd526e8754 | ||
|
|
974306d4f0 | ||
|
|
56452d9fd8 | ||
|
|
6d231fecd1 | ||
|
|
2e91cf727a | ||
|
|
64b9402e12 | ||
|
|
4bae0c0139 | ||
|
|
06bc4aa50b | ||
|
|
31a7ac1e81 | ||
|
|
c75ac3ac64 | ||
|
|
3e14d8f4dd | ||
|
|
6cde31f843 | ||
|
|
a7b70008ba | ||
|
|
8cc19d908e | ||
|
|
d58cda122d | ||
|
|
ab26945eca | ||
|
|
2da1b2af1a | ||
|
|
2586129dcd | ||
|
|
13e5d77041 | ||
|
|
d036ff6c4f | ||
|
|
1f1bc393d3 | ||
|
|
9aa34e2487 | ||
|
|
0b7bffe3b5 | ||
|
|
41f248f54d | ||
|
|
bc7cabde4e | ||
|
|
65d5bba7df | ||
|
|
340a6d195f | ||
|
|
83ac168664 | ||
|
|
8ac1a67b7d | ||
|
|
abd67d0786 | ||
|
|
9a9e4cddd7 | ||
|
|
10c44b08c9 | ||
|
|
86b19f742c | ||
|
|
cb94b03e3e | ||
|
|
a898c3d7bc | ||
|
|
86be6d7897 | ||
|
|
d3d4de12be | ||
|
|
04bac321d1 | ||
|
|
1011353729 | ||
|
|
5651993d93 | ||
|
|
c51466935c | ||
|
|
454aca7003 | ||
|
|
5ff9f01aba | ||
|
|
b5dd2e605d | ||
|
|
1bfe25f1a5 | ||
|
|
bd98779b3c | ||
|
|
7862ae6d36 | ||
|
|
dfbd78f71d | ||
|
|
e132e878d6 | ||
|
|
bb78c0ea6d | ||
|
|
1a772023d5 | ||
|
|
230f90173c | ||
|
|
fbc7c28188 | ||
|
|
5d88cb7099 | ||
|
|
caae7a5879 | ||
|
|
816f37bdc5 | ||
|
|
a2dd7171a5 | ||
|
|
a80d0bc2ca | ||
|
|
2e50d11be5 | ||
|
|
a5e2caf40b | ||
|
|
82f693a2bc | ||
|
|
349baa3550 | ||
|
|
712761ab0a | ||
|
|
e620d19422 | ||
|
|
8ba161463b | ||
|
|
d93aa183f3 | ||
|
|
29ceed91f0 | ||
|
|
7f7c7f360e | ||
|
|
c77ffa0f6a | ||
|
|
5acf5f6ee3 | ||
|
|
10c2232c39 | ||
|
|
116dbfd123 | ||
|
|
ec7dce7d5b | ||
|
|
a8c8bd8113 | ||
|
|
f57dadc362 | ||
|
|
6b7c1ad6cf | ||
|
|
67359c22d5 | ||
|
|
1881f5cb39 | ||
|
|
9f3d284c68 | ||
|
|
6921fb66d5 | ||
|
|
91849e4cd1 | ||
|
|
1fcaa481be | ||
|
|
04701cd69e | ||
|
|
f59551b89e | ||
|
|
bc34d80949 | ||
|
|
7480e481fc | ||
|
|
71ed48bb76 | ||
|
|
134bf61205 | ||
|
|
85ddabd763 | ||
|
|
889c184ba3 | ||
|
|
660bc2eb21 | ||
|
|
192667d65f | ||
|
|
4896c725b6 | ||
|
|
4bcb99a6b9 | ||
|
|
535eec5366 | ||
|
|
56cd679bcd | ||
|
|
e95ae66af0 | ||
|
|
dbb342da81 | ||
|
|
958381d3dd | ||
|
|
0a165675ce | ||
|
|
ce13b6abfd | ||
|
|
804e00cc26 | ||
|
|
f79de23be5 | ||
|
|
3404dc0b75 | ||
|
|
51c9f4f988 | ||
|
|
028ecf5561 | ||
|
|
419fb08266 | ||
|
|
1a28ef3244 | ||
|
|
6b8ffb2a85 | ||
|
|
9121b14009 | ||
|
|
9b54891474 | ||
|
|
058196e42a | ||
|
|
22743e06d5 | ||
|
|
c8b818f011 | ||
|
|
df838c98e9 | ||
|
|
595eab2614 | ||
|
|
288b6ea692 | ||
|
|
7db606857d | ||
|
|
746034a4fc | ||
|
|
f8ec95d872 | ||
|
|
ba082b74a7 | ||
|
|
ab981ce15a | ||
|
|
e143936a82 | ||
|
|
497cde7e92 | ||
|
|
948faf6cf9 | ||
|
|
56f199bd69 | ||
|
|
9e1f68d9eb | ||
|
|
7a9011c7e1 | ||
|
|
224a6c1e7c | ||
|
|
c89fe8bdbc | ||
|
|
cce9c2225e | ||
|
|
bdbc157c30 | ||
|
|
11eebfb78d | ||
|
|
4beadcc4f3 | ||
|
|
e062c8c6f2 | ||
|
|
f4709ce1f0 | ||
|
|
50e129bd8f | ||
|
|
f402dbd1e3 | ||
|
|
55af8b4cb4 | ||
|
|
005b587588 | ||
|
|
de4463d9a8 | ||
|
|
b3d577c937 | ||
|
|
51576018fd | ||
|
|
1b4f210d82 | ||
|
|
612bfd3acc | ||
|
|
4972c94aed | ||
|
|
642d77bb91 | ||
|
|
88270a7b66 | ||
|
|
29e0d37009 | ||
|
|
9c339367ad | ||
|
|
f69715d999 | ||
|
|
79990cbb27 | ||
|
|
a02be54421 | ||
|
|
20127f6a2a | ||
|
|
02a132a9d7 | ||
|
|
7c95c5e80a | ||
|
|
c0bc5657ea | ||
|
|
dfec166704 | ||
|
|
32f223c683 | ||
|
|
722eac1681 | ||
|
|
6bcbb6f7bb | ||
|
|
d266a0c0ce | ||
|
|
acf82af0bf | ||
|
|
98956056e3 | ||
|
|
ae0bb54b2d | ||
|
|
255da0a0d7 | ||
|
|
c0e8cc0254 | ||
|
|
41cec24644 | ||
|
|
2ecdedd5b4 | ||
|
|
358477c31b | ||
|
|
c1948f10a2 | ||
|
|
d33c487b29 | ||
|
|
b309b507eb | ||
|
|
daa8428b32 | ||
|
|
0529df7632 | ||
|
|
fc31fb9eba | ||
|
|
54436e341a | ||
|
|
fc35ac4d67 | ||
|
|
28a0b6f901 | ||
|
|
1b8f2c2adb | ||
|
|
6c8988ab69 | ||
|
|
e3c600a681 | ||
|
|
979e0de659 | ||
|
|
a76c10416d | ||
|
|
1276bf8c72 | ||
|
|
9ef5c5d639 | ||
|
|
69f51896c9 | ||
|
|
5f845aa6f8 | ||
|
|
87c610beaa | ||
|
|
3a331ec156 | ||
|
|
6c5ac490ab | ||
|
|
50b9840db1 | ||
|
|
41e884a1d2 | ||
|
|
15841b191d | ||
|
|
65514d89ad | ||
|
|
c6f8896826 | ||
|
|
882d84f1e6 | ||
|
|
0eba3a3678 | ||
|
|
756b28c3ab | ||
|
|
d78ebc40ae | ||
|
|
58aea21b82 | ||
|
|
c2b1d61dd1 | ||
|
|
f4d72dba06 | ||
|
|
31e81d7be2 | ||
|
|
6c9123beee | ||
|
|
0fa0397da2 | ||
|
|
b652fc7e1a | ||
|
|
c42fea0d3d | ||
|
|
48a56a848a | ||
|
|
d6937baa8e | ||
|
|
3490f8acb5 | ||
|
|
46ace7e8e8 | ||
|
|
698956e130 | ||
|
|
b25cd39953 | ||
|
|
de4f5eb2ca | ||
|
|
ccc5fa3981 | ||
|
|
b899a19184 | ||
|
|
6af7fac344 | ||
|
|
49ef2b4d54 | ||
|
|
fcc09a7375 | ||
|
|
8e9ad4df97 | ||
|
|
4dfcfd2542 | ||
|
|
12081c9bd6 | ||
|
|
abee7fdfa2 | ||
|
|
ca0bc0632b | ||
|
|
e465750cd2 | ||
|
|
934b08f720 | ||
|
|
78cc98840b | ||
|
|
d4cd7a120f | ||
|
|
4b6c91bbf1 | ||
|
|
e3be2b4451 | ||
|
|
c6ff845ecb | ||
|
|
846bde35ff | ||
|
|
69990ae226 | ||
|
|
415fc81577 | ||
|
|
b675566e23 | ||
|
|
190da0dcd4 | ||
|
|
5c40f93ca3 | ||
|
|
879c1e4992 | ||
|
|
311334c9e1 | ||
|
|
dc5268b0c0 | ||
|
|
d77ace6dc3 | ||
|
|
f0b3c1a9ab | ||
|
|
9efb73f592 | ||
|
|
569b4b29aa | ||
|
|
a61bde5b78 | ||
|
|
542dd67892 | ||
|
|
172eca6081 | ||
|
|
004aaed783 | ||
|
|
a1b15df648 | ||
|
|
b5d5bef678 | ||
|
|
421df0dff3 | ||
|
|
5b5e29cb7b | ||
|
|
db67ae12ec | ||
|
|
7dfd7ad5b9 | ||
|
|
ca5fa9e84d | ||
|
|
1afcfa4406 | ||
|
|
95b1455b62 | ||
|
|
d825937411 | ||
|
|
ee182df533 | ||
|
|
14651d8ea8 | ||
|
|
7e4ed7c1a9 | ||
|
|
13fe88c03f | ||
|
|
7b80a780c7 | ||
|
|
2b465bdf82 | ||
|
|
6d52119597 | ||
|
|
b75041173c | ||
|
|
23eba0a029 | ||
|
|
566781cab2 | ||
|
|
0ea1fc5602 | ||
|
|
2ce9e09e8b | ||
|
|
6cab7ceb0f | ||
|
|
8ae7d8aa07 | ||
|
|
ce6ccef2d0 | ||
|
|
2c6d880542 | ||
|
|
bf89287c56 | ||
|
|
df176dfe8a | ||
|
|
141a32d388 | ||
|
|
37786b76ed | ||
|
|
02b920f259 | ||
|
|
31e25f88a0 | ||
|
|
231c8a468e | ||
|
|
ae346f564f | ||
|
|
fcc0608cf2 | ||
|
|
641cd63462 | ||
|
|
0b907a3efa | ||
|
|
ce180cf2bf | ||
|
|
d97276404c | ||
|
|
d5a9b4344b | ||
|
|
e317fdfa3d | ||
|
|
150ea2639a | ||
|
|
a551348b40 | ||
|
|
3429b5d661 | ||
|
|
c8314b215b | ||
|
|
5929f7d23b | ||
|
|
85a7df3d27 | ||
|
|
e6c5a0e848 | ||
|
|
92dee72b10 | ||
|
|
4d6e57a5e6 | ||
|
|
936a1c2764 | ||
|
|
a08a3c6096 | ||
|
|
82be40eace | ||
|
|
20ba0bd1dc | ||
|
|
75ce6b82e8 | ||
|
|
9749ac56ba | ||
|
|
746f9bb778 | ||
|
|
f2dae588aa | ||
|
|
9f3f0a76aa | ||
|
|
30f28a51ca | ||
|
|
3e22344782 | ||
|
|
0b20d89d62 | ||
|
|
80d892c744 | ||
|
|
53326bef33 | ||
|
|
f05a5a3abb | ||
|
|
8581be4977 | ||
|
|
0e8277ba9e | ||
|
|
3cc2f83912 | ||
|
|
177034a498 | ||
|
|
f4d06e5183 | ||
|
|
637a6b5f7e | ||
|
|
75445b8b98 | ||
|
|
f96de55ac7 | ||
|
|
c4d4af3b5a | ||
|
|
5dfee44340 | ||
|
|
99f5857d84 | ||
|
|
520f7c6812 | ||
|
|
63d493aa1f | ||
|
|
38ab42f855 | ||
|
|
bc3771f3af | ||
|
|
9d90af409b | ||
|
|
20183bbd57 | ||
|
|
1d8efe1cf8 | ||
|
|
23354d413f | ||
|
|
715f03f5f1 | ||
|
|
ff6bbaed19 | ||
|
|
f82cbbab1c | ||
|
|
5a1b526b6c | ||
|
|
1ef92c87fb | ||
|
|
0aef515522 | ||
|
|
9b5c97666a | ||
|
|
a55d822f9a | ||
|
|
5b2bde6e0d | ||
|
|
020c5b27dc | ||
|
|
65457208e5 | ||
|
|
6eb1b98975 | ||
|
|
a927bab6b3 | ||
|
|
48e3e3e8cb | ||
|
|
b5d095401d | ||
|
|
b3e58d4794 | ||
|
|
79b064320e | ||
|
|
335b8326ee | ||
|
|
e777020e44 | ||
|
|
745d97ebe1 | ||
|
|
bb06d98a43 | ||
|
|
3500b0016c | ||
|
|
7ec916b777 | ||
|
|
3c71f79929 | ||
|
|
a83e70104c | ||
|
|
85af554bac | ||
|
|
885722afde | ||
|
|
b2f094da01 | ||
|
|
1e85ec6758 | ||
|
|
c8974aac3e | ||
|
|
ad318c04e5 | ||
|
|
db73e48206 | ||
|
|
d13972e0b8 | ||
|
|
df74b2bfcb | ||
|
|
b94b75726d | ||
|
|
9a2d38acff | ||
|
|
537f8f401e | ||
|
|
04f1a799dc | ||
|
|
74adb2f540 | ||
|
|
a129a2509f | ||
|
|
cc0b8e9d10 | ||
|
|
af8fcf234f | ||
|
|
e0dc2daf54 | ||
|
|
c066e655dc | ||
|
|
2698e6f0ea | ||
|
|
63902bde9c | ||
|
|
c876004fb2 | ||
|
|
633f37bfb6 | ||
|
|
d70bc74dc8 | ||
|
|
d7a4524e70 | ||
|
|
fe1e27fd40 | ||
|
|
8a7a099073 | ||
|
|
1b53b5f9eb | ||
|
|
8b758ee25a | ||
|
|
81c24a8478 | ||
|
|
a6f3e0b6af | ||
|
|
6e9e8127b6 | ||
|
|
63d43275d3 | ||
|
|
cb2bf7f8fa | ||
|
|
1fae760ccd | ||
|
|
4195c4c4bf | ||
|
|
13e7a1ed93 | ||
|
|
ea4357ca98 | ||
|
|
5e8255d24d | ||
|
|
003d6ec43f | ||
|
|
9749ff7c67 | ||
|
|
c88589e0e5 | ||
|
|
32ef1bb7a5 | ||
|
|
206c65904f | ||
|
|
219d4688e4 | ||
|
|
adc687f0a0 | ||
|
|
88e59c9a5a | ||
|
|
71a89a575f | ||
|
|
e3dc8dfcf4 | ||
|
|
2dd77d5bc7 | ||
|
|
0192226bb3 | ||
|
|
faf2658da2 | ||
|
|
9a1c00d2dc | ||
|
|
4a8695caff | ||
|
|
b28016bfeb | ||
|
|
4758a9e66d | ||
|
|
97bd1ef4ec | ||
|
|
2adac8bdae | ||
|
|
3c56914822 | ||
|
|
c5cc907838 | ||
|
|
0907aabacd | ||
|
|
f4290bda7f | ||
|
|
4bdb82a7a2 | ||
|
|
6a696dde3a | ||
|
|
8481684a82 | ||
|
|
03aa8b3356 | ||
|
|
64bfed2640 | ||
|
|
2edcc89303 | ||
|
|
18313f2e90 | ||
|
|
0ff96418bd | ||
|
|
1480abf0e8 | ||
|
|
e7ba75d533 | ||
|
|
044291d940 | ||
|
|
ad62efcb9e | ||
|
|
0dc59d9481 | ||
|
|
11ab3034b1 | ||
|
|
c594bda77f | ||
|
|
8218b74fb3 | ||
|
|
3d0beb1a2e | ||
|
|
515cfd48d8 | ||
|
|
1448bab5b3 | ||
|
|
2884f8acb8 | ||
|
|
075cae4efb | ||
|
|
d2b98323dd | ||
|
|
b1a81a85b1 | ||
|
|
668384649a | ||
|
|
a7252b1a7f | ||
|
|
a4e58e4d55 | ||
|
|
4241e01364 | ||
|
|
d7d7952138 | ||
|
|
9cc2253339 | ||
|
|
6831802590 | ||
|
|
9d79cc7e87 | ||
|
|
763b003a11 | ||
|
|
d560e2a558 | ||
|
|
f914f080b1 | ||
|
|
600a4e86e1 | ||
|
|
e7b4ada65f | ||
|
|
95f31be096 | ||
|
|
ad6db7eaae | ||
|
|
d7a99c6618 | ||
|
|
f20d8f5cc0 | ||
|
|
8930e6b393 | ||
|
|
f26886acb0 | ||
|
|
820ab8d486 | ||
|
|
8e425fb358 | ||
|
|
6006f499ac | ||
|
|
3caa740fc4 | ||
|
|
007ea9ea20 | ||
|
|
5d248d261d | ||
|
|
26908cba64 | ||
|
|
18d118746e | ||
|
|
9a633f5f2e | ||
|
|
5aa44e98d5 | ||
|
|
33916fa975 | ||
|
|
eab18df403 | ||
|
|
002caceb05 | ||
|
|
c250aa804a | ||
|
|
94ca50883f | ||
|
|
462c482873 | ||
|
|
e28e04a990 | ||
|
|
6438385d64 | ||
|
|
bfb08ce003 | ||
|
|
3590a06f40 | ||
|
|
23ca6c5e10 | ||
|
|
1aea5bcd50 | ||
|
|
82c5d8ed28 | ||
|
|
5dcd58a75f | ||
|
|
dc605a4ee1 | ||
|
|
fec940ab8b | ||
|
|
05fd7cecf4 | ||
|
|
2f52730b48 | ||
|
|
4c1819c7dd | ||
|
|
c58c0df30e | ||
|
|
c5902b3144 | ||
|
|
519eb424e7 | ||
|
|
03478afea4 | ||
|
|
306ef8addf | ||
|
|
d4659b261d | ||
|
|
69ce41807a | ||
|
|
cc81da5aa4 | ||
|
|
eee714f52b | ||
|
|
c976b637d8 | ||
|
|
ea93515d53 | ||
|
|
652499bdcf | ||
|
|
819862199a | ||
|
|
6c1bc1d7bb | ||
|
|
36ebe76e0a | ||
|
|
8f8d35dec7 | ||
|
|
ac1e436339 | ||
|
|
78d4812b0e | ||
|
|
6a1b7626e3 | ||
|
|
b6ccb4c96f | ||
|
|
9712ac550c | ||
|
|
5b173766c6 | ||
|
|
b535c4f321 | ||
|
|
56c5ebcb71 | ||
|
|
028234ba86 | ||
|
|
f063b4d231 | ||
|
|
508f27cc32 | ||
|
|
d4783170e5 | ||
|
|
51e459b386 | ||
|
|
1253d254af | ||
|
|
5e70574396 | ||
|
|
b5dce2f74b | ||
|
|
6113da3e68 | ||
|
|
faf6406289 | ||
|
|
7c443431d9 | ||
|
|
0f201e3fd8 | ||
|
|
bf96c30187 | ||
|
|
eb1b7b914a | ||
|
|
135bc2de52 | ||
|
|
ab2269717d | ||
|
|
b5a42cfa75 | ||
|
|
6693416d0a | ||
|
|
9cdf013933 | ||
|
|
1dfaa30520 | ||
|
|
d898fcee75 | ||
|
|
1e647a2058 | ||
|
|
10e379d862 | ||
|
|
ee456493c4 | ||
|
|
69e9c7d0be | ||
|
|
adce718d63 | ||
|
|
3a94a65f12 | ||
|
|
bbe30db1b7 | ||
|
|
68f3c43805 | ||
|
|
3c99ecda60 | ||
|
|
b1366696c4 | ||
|
|
534aeb4065 | ||
|
|
cc77a36dd9 | ||
|
|
5991068fdf | ||
|
|
913778d5ab | ||
|
|
9a8345d4f9 | ||
|
|
ba9bd3bc76 | ||
|
|
aad0070b77 | ||
|
|
d192e69811 | ||
|
|
ec8d919b93 | ||
|
|
4ce4f1d758 | ||
|
|
3aa40d4df6 | ||
|
|
ec1be41b62 | ||
|
|
c15d81545a | ||
|
|
1af8b9d16a | ||
|
|
d860cf834d | ||
|
|
63d5a3acbc | ||
|
|
132aacee89 | ||
|
|
973038da6a | ||
|
|
584da3c39b | ||
|
|
73c4829255 | ||
|
|
68942f7ec4 | ||
|
|
e914b83a1b | ||
|
|
2268376360 | ||
|
|
6bb3b9a684 | ||
|
|
9f213c119c | ||
|
|
f081e2b799 | ||
|
|
a024152c12 | ||
|
|
42d23dbc70 | ||
|
|
74786e8a25 | ||
|
|
eeb4ede60d | ||
|
|
f2eee8896c | ||
|
|
bf4a70d91c | ||
|
|
a35ab3937a | ||
|
|
5ef9a4be8a | ||
|
|
d76d7582fe | ||
|
|
44006142c7 | ||
|
|
6840b2cfe5 | ||
|
|
5613f60403 | ||
|
|
76d3959f1a | ||
|
|
b681759000 | ||
|
|
d6336c4302 | ||
|
|
35b161450a | ||
|
|
861aaf06c6 | ||
|
|
a910884e7d | ||
|
|
0e7bef9014 | ||
|
|
d942189bc6 | ||
|
|
eb16051b1e | ||
|
|
7749a7e41d | ||
|
|
dc4cef17d4 | ||
|
|
89ed40e4a4 | ||
|
|
10ee74d872 | ||
|
|
474ae1e91c | ||
|
|
0dc70ca5f3 | ||
|
|
633b1663ca | ||
|
|
153fe61b4b | ||
|
|
9734fd0353 | ||
|
|
6209c120c0 | ||
|
|
3516881e7a | ||
|
|
15398555b3 | ||
|
|
cb132fcbf4 | ||
|
|
f42f46c7d6 | ||
|
|
f1046f1cf1 | ||
|
|
4a62287139 | ||
|
|
69cd56357f | ||
|
|
b66a886682 | ||
|
|
249504b7d6 | ||
|
|
fa0086404d | ||
|
|
f243ebba91 | ||
|
|
540afb193b | ||
|
|
8294acdf1c | ||
|
|
7733d02938 | ||
|
|
9b6342e7fa | ||
|
|
22c09cb31b | ||
|
|
21e79cb54a | ||
|
|
b8cc829f4a | ||
|
|
ace0dacf15 | ||
|
|
5ca13098e3 | ||
|
|
07b13eedec | ||
|
|
d9168ed9ec | ||
|
|
fb4e2c167c | ||
|
|
10ee3585f6 | ||
|
|
5d4ba820dd | ||
|
|
a51e00e69f | ||
|
|
4dfa963851 | ||
|
|
f2d4f6ccf6 | ||
|
|
182cb8ab25 | ||
|
|
ece341d868 | ||
|
|
d72e8c2687 | ||
|
|
b0ff6f4c7b | ||
|
|
6ec5249492 | ||
|
|
c44cd76c5a | ||
|
|
37f711d72a | ||
|
|
fcf18fb965 | ||
|
|
2efd6250fb | ||
|
|
1b4bd8523d | ||
|
|
60c44910df | ||
|
|
faf67fae03 | ||
|
|
e95f547950 | ||
|
|
96b663b783 | ||
|
|
ce44f7e4b0 | ||
|
|
16a9c7d492 | ||
|
|
fc369c3448 | ||
|
|
b1a33edf0f | ||
|
|
3b805f1a24 | ||
|
|
954b4d8075 | ||
|
|
d073e2a881 | ||
|
|
044dd2af94 | ||
|
|
ee489fa8c0 | ||
|
|
035ed5f49b | ||
|
|
7dcd690f61 | ||
|
|
1c9290aded | ||
|
|
0b922b1ed1 | ||
|
|
34eec362e5 | ||
|
|
b829383864 | ||
|
|
3960235428 | ||
|
|
e91a662491 | ||
|
|
ba4da24984 | ||
|
|
70378432b7 | ||
|
|
6b63009b14 | ||
|
|
dd45fea732 | ||
|
|
ee09425cfb | ||
|
|
af02a1e024 | ||
|
|
2a86f0776c | ||
|
|
c6f73d9df8 | ||
|
|
5ab79f292b | ||
|
|
82c7a22d27 | ||
|
|
35fa977981 | ||
|
|
ecbc46a91d | ||
|
|
d2f6416e45 | ||
|
|
97a885a05c | ||
|
|
aa1edd6b94 | ||
|
|
083e401717 | ||
|
|
bdeca2edce | ||
|
|
c84e14db46 | ||
|
|
919c5bd0b3 | ||
|
|
af8a8f1e3f | ||
|
|
41d08e123f | ||
|
|
67d9656e35 | ||
|
|
1a58a70494 | ||
|
|
a477b2efd1 | ||
|
|
59c4546b8c | ||
|
|
ed1a75ef4c | ||
|
|
0cd942f152 | ||
|
|
fe7f082083 | ||
|
|
849fd71f76 | ||
|
|
4e3a72388d | ||
|
|
29e3d9eff5 | ||
|
|
64280f4285 | ||
|
|
98c6eaac3b | ||
|
|
22d965c66c | ||
|
|
2eb932ebc1 | ||
|
|
2ee0634db3 | ||
|
|
db3b6a1252 | ||
|
|
24810aeca3 | ||
|
|
c888319f22 | ||
|
|
13ee78a9c9 | ||
|
|
acaa07cf7c | ||
|
|
1a3c9939e8 | ||
|
|
56afe21022 | ||
|
|
b58bfa82e6 | ||
|
|
a6257b5901 | ||
|
|
16ad7e53ff | ||
|
|
3e4e4f2664 | ||
|
|
dc0c4fe8fb | ||
|
|
0c050bb266 | ||
|
|
47a5b227cc | ||
|
|
ed61d0c591 | ||
|
|
8ff856ecf8 | ||
|
|
93a607bea0 | ||
|
|
7bec7ba49d | ||
|
|
4c8f3bd392 | ||
|
|
74ba9eb159 | ||
|
|
d28ca4eda7 | ||
|
|
9563b5a7df | ||
|
|
d3a049c6e0 | ||
|
|
a52a3eb42f | ||
|
|
c54b21a754 | ||
|
|
cc8995cd5c | ||
|
|
2e222fbae2 | ||
|
|
cdf3b15336 | ||
|
|
a9a95de02d | ||
|
|
d4bcd4ab0c | ||
|
|
3b2ed06864 | ||
|
|
ab210b3988 | ||
|
|
70617be903 | ||
|
|
f039d5bbcb | ||
|
|
e0adb3cf9a | ||
|
|
4dd6e07b8d | ||
|
|
d69b7951e0 | ||
|
|
d915ece2e7 | ||
|
|
f1be3df112 | ||
|
|
29b7ca4c25 | ||
|
|
f478d916aa | ||
|
|
d2e50b09db | ||
|
|
23c2dd33f2 | ||
|
|
ce0c3c935c | ||
|
|
bdbafb7a2a | ||
|
|
edffe2a6fc | ||
|
|
cd69a53406 | ||
|
|
439ffa5849 | ||
|
|
4518c30cbe | ||
|
|
6683809447 | ||
|
|
cccd43a16b | ||
|
|
91d44147bb | ||
|
|
777311bbf5 | ||
|
|
9ded5dc78d | ||
|
|
5b81c4573c | ||
|
|
32b2e9f6cf | ||
|
|
a6dba44561 | ||
|
|
03fc317a3f | ||
|
|
00a8130201 | ||
|
|
74fc15cccd | ||
|
|
1d4d919f6d | ||
|
|
1826cc8870 | ||
|
|
8a6dab03c4 | ||
|
|
dffad444c3 | ||
|
|
d6f1b164f7 | ||
|
|
4011f054d6 | ||
|
|
14e9978359 | ||
|
|
98535638a2 | ||
|
|
8861c04e77 | ||
|
|
42b6f320d8 | ||
|
|
31b4a9197f | ||
|
|
f06c9d5b9b | ||
|
|
130fafd7c2 | ||
|
|
e76f79cd56 | ||
|
|
ba21718cb9 | ||
|
|
6dfb2997cb | ||
|
|
ae9ac3b439 | ||
|
|
d70b5a9886 | ||
|
|
fb2a20201c | ||
|
|
d1761558b4 | ||
|
|
5bd0a53edd | ||
|
|
53ea73238a | ||
|
|
28560cb887 | ||
|
|
0bcd12aa4e | ||
|
|
a7dfdebed6 | ||
|
|
aca07530aa | ||
|
|
c0110c6bab | ||
|
|
0ef9e0fa75 | ||
|
|
ba0751917d | ||
|
|
e3c1bfbcba | ||
|
|
5aaa0a7b5f | ||
|
|
2ca75970c0 | ||
|
|
d9c92288be | ||
|
|
e4f231502a | ||
|
|
04a61e6fd6 | ||
|
|
dc5c7d2ee8 | ||
|
|
87ac6812a3 | ||
|
|
8d4d2d62c1 | ||
|
|
68fc036b7a | ||
|
|
f053c4d532 | ||
|
|
06e4a2dbde | ||
|
|
9e0ecab0c1 | ||
|
|
996e61a383 | ||
|
|
309aa4a3f3 | ||
|
|
0906fbf995 | ||
|
|
2348ec40ee | ||
|
|
c6852f4b96 | ||
|
|
8b01139738 | ||
|
|
5ea3717152 | ||
|
|
d01a673adb | ||
|
|
571ec44c33 | ||
|
|
e5a3c12026 | ||
|
|
bb2f1aa4be | ||
|
|
59070bcd5b | ||
|
|
2f52dd88a9 | ||
|
|
79fec3ac40 | ||
|
|
6247bbf4b1 | ||
|
|
11de155432 | ||
|
|
bfe833c132 | ||
|
|
1fd1da72f4 | ||
|
|
f4c994d182 | ||
|
|
d81a6e6e89 | ||
|
|
fab5daacf8 | ||
|
|
b714c6b746 | ||
|
|
af1355a94e | ||
|
|
ebc08fd6f5 | ||
|
|
30b1445195 | ||
|
|
0d1c7a1414 | ||
|
|
7e8e7757f4 | ||
|
|
42eb180b6c | ||
|
|
dff35bc9b7 | ||
|
|
6a87ed2853 | ||
|
|
1266d49c65 | ||
|
|
c8b130b232 | ||
|
|
67a6b0f383 | ||
|
|
e7c176f904 | ||
|
|
4cc8363b5f | ||
|
|
93193d7e76 | ||
|
|
d68321ac27 | ||
|
|
b2e8359d31 | ||
|
|
a302ca3d6c | ||
|
|
670358f235 | ||
|
|
10e329f762 | ||
|
|
6a3c1bdb99 | ||
|
|
90923c965b | ||
|
|
d555241d03 | ||
|
|
3d2b6b7620 | ||
|
|
0b943b418c | ||
|
|
db12aaad11 | ||
|
|
860aa65d10 | ||
|
|
2e5e279a14 | ||
|
|
df87b9ff56 | ||
|
|
6c06ff3ca0 | ||
|
|
40d6e9c841 | ||
|
|
6a4f06f325 | ||
|
|
f7d306cb02 | ||
|
|
34bc182c22 | ||
|
|
3f8dd7e658 | ||
|
|
46341fea96 | ||
|
|
4319cdbba1 | ||
|
|
3453236830 | ||
|
|
fa2058ec77 | ||
|
|
7f823fe2a8 | ||
|
|
58e14705b5 | ||
|
|
99b7613206 | ||
|
|
545e614c04 | ||
|
|
5ea04a388d | ||
|
|
8922372f4b | ||
|
|
ceaa2c1619 | ||
|
|
4e73daab79 | ||
|
|
5b29d987c8 | ||
|
|
1cd53c051d | ||
|
|
5460d0030f | ||
|
|
d14a0ce592 | ||
|
|
a4000a3286 | ||
|
|
85fd650f5c | ||
|
|
b19033a375 | ||
|
|
33e19ce9f6 | ||
|
|
d21218fd57 | ||
|
|
9f2279c675 | ||
|
|
06bfbfaff4 | ||
|
|
562834e0d0 | ||
|
|
bdf2285f14 | ||
|
|
1780682a8d | ||
|
|
9b48bd27dd | ||
|
|
0b1e2a6107 | ||
|
|
c78edf3fff | ||
|
|
6fcd99c6da | ||
|
|
b42f3a5400 | ||
|
|
bb543920a6 | ||
|
|
0845758023 | ||
|
|
816f81260a | ||
|
|
a9583f4440 | ||
|
|
4e52c9cc65 | ||
|
|
8299dded0b | ||
|
|
5d83cafc50 | ||
|
|
9819e60aae | ||
|
|
1182eb4a9f | ||
|
|
48a0986c14 | ||
|
|
6c2f7046d1 | ||
|
|
9735bffae5 | ||
|
|
56a11910db | ||
|
|
70b00dc4e3 | ||
|
|
56c1bf01a4 | ||
|
|
022b295aaa | ||
|
|
fd977895ab | ||
|
|
ad1f3ddbad | ||
|
|
c8b159e38c | ||
|
|
7405e3c12a | ||
|
|
1b8ca164c9 | ||
|
|
74cdaa9fcb | ||
|
|
0ba331485a | ||
|
|
f5b3c0affc | ||
|
|
316ae0c785 | ||
|
|
c2d2fa2579 | ||
|
|
d683eb2dd1 | ||
|
|
470d35e96c | ||
|
|
7464d82243 | ||
|
|
c61fed32db | ||
|
|
c4cdec5531 | ||
|
|
3ad9d38063 | ||
|
|
f8b95abf0c | ||
|
|
579794666a | ||
|
|
2ef25b6338 | ||
|
|
faddd94518 | ||
|
|
cd5f9b8bd4 | ||
|
|
94fd20e864 | ||
|
|
3558eef66b | ||
|
|
ee66e2154d | ||
|
|
5500a86f0b | ||
|
|
9b1c1774cd | ||
|
|
a8e31469c5 | ||
|
|
b70bafaf51 | ||
|
|
d393349b4d | ||
|
|
0904724694 | ||
|
|
eff4825000 | ||
|
|
091c00229a | ||
|
|
126f0d6036 | ||
|
|
f99bc6d8f9 | ||
|
|
3da0117838 | ||
|
|
3d8cf6a90b | ||
|
|
ac44663f04 | ||
|
|
57113b21ed | ||
|
|
57d5ace61c | ||
|
|
f4da80e7c6 | ||
|
|
df3ca5c7c8 | ||
|
|
4b676df37f | ||
|
|
5dc04266ea | ||
|
|
dbcfe3f5d2 | ||
|
|
fdbec5b0d2 | ||
|
|
3ea129b4f8 | ||
|
|
48a7e40520 | ||
|
|
08b956cf88 | ||
|
|
93b1e1f5ac | ||
|
|
bdecf6baf5 | ||
|
|
4528311d77 | ||
|
|
0bc1761dae | ||
|
|
f690b0edf6 | ||
|
|
10851772af | ||
|
|
66e7b28195 | ||
|
|
76021fb582 | ||
|
|
db50adbd9f | ||
|
|
5c7cc146a1 | ||
|
|
fa3b384c6f | ||
|
|
3f9a878b03 | ||
|
|
ab3b972185 | ||
|
|
fb9118a044 | ||
|
|
5cce5b6707 | ||
|
|
3256c9b3f5 | ||
|
|
8b43b2b69d | ||
|
|
02a862684d | ||
|
|
c15f5b5106 | ||
|
|
0f06d51065 | ||
|
|
8abfa419e8 | ||
|
|
c3c90ab78b | ||
|
|
666be21f59 | ||
|
|
0fe8197100 | ||
|
|
d8a7a7792a | ||
|
|
82b9a0c949 | ||
|
|
a3083d2990 | ||
|
|
3c62914304 | ||
|
|
a094768469 | ||
|
|
3965f063d3 | ||
|
|
2b7c295bf1 | ||
|
|
2fd297c1e1 | ||
|
|
263c04aeb2 | ||
|
|
8f2b5e195e | ||
|
|
7e3dd2b8cc | ||
|
|
49c027537e | ||
|
|
a1a6095295 | ||
|
|
5f7dcc9b78 | ||
|
|
1705bf4f3c | ||
|
|
8612946bf5 | ||
|
|
7cf40576dd | ||
|
|
239f35d830 | ||
|
|
05ff42b767 | ||
|
|
7bab4817f2 | ||
|
|
0d87b7d720 | ||
|
|
6b72adbeee | ||
|
|
db97ae46e5 | ||
|
|
fc6c084693 | ||
|
|
9e01cc5705 | ||
|
|
f9ce45c058 | ||
|
|
056ff4b6ea | ||
|
|
52653f73b9 | ||
|
|
a06207b814 | ||
|
|
3b3ef411a4 | ||
|
|
6418f78fdb | ||
|
|
5d4187bf03 | ||
|
|
cfffad73eb | ||
|
|
ef7db87b82 | ||
|
|
212eea9cf5 | ||
|
|
da792cc272 | ||
|
|
2ae2142b35 | ||
|
|
a00f5f308a | ||
|
|
81cfde12f3 | ||
|
|
1a53d38dae | ||
|
|
b834fdbc5e | ||
|
|
1cb2db03ed | ||
|
|
57bca50ed0 | ||
|
|
94386583e2 | ||
|
|
b1ab63d549 | ||
|
|
ad56bdd354 | ||
|
|
65e30c13e2 | ||
|
|
0c54fac651 | ||
|
|
9660c22a9f | ||
|
|
31e8df4a59 | ||
|
|
8e6ecaf8d4 | ||
|
|
4d69a0ce29 | ||
|
|
1b842f86ca | ||
|
|
a2330fb630 | ||
|
|
30f0232d71 | ||
|
|
404e658a5d | ||
|
|
f5682397c2 | ||
|
|
4896810258 | ||
|
|
dd0de8b6e1 | ||
|
|
2a9f9f7ebd | ||
|
|
2f3afd3637 | ||
|
|
f0a2c88fdc | ||
|
|
c3a5b12cd3 | ||
|
|
d7b0e66270 | ||
|
|
1871ed5441 | ||
|
|
5ea6948127 | ||
|
|
9bd77d36f1 | ||
|
|
3ffa6cd1ac | ||
|
|
ad87df3168 | ||
|
|
8bd0d32fd2 | ||
|
|
f182675a6e | ||
|
|
56ce89e04f | ||
|
|
062ec036f8 | ||
|
|
8089242b2f | ||
|
|
8efa1a0032 | ||
|
|
7ce8304ce6 | ||
|
|
233adab647 | ||
|
|
475c86d100 | ||
|
|
f754654dae | ||
|
|
53ce20c0df | ||
|
|
ad91e3a344 | ||
|
|
4f2b33f80f | ||
|
|
2b24d42f8d | ||
|
|
ab70f306cd | ||
|
|
4fb83fe0a5 | ||
|
|
9c6ef34270 | ||
|
|
481eb8e5dc | ||
|
|
7cf65b899b | ||
|
|
dd70fcb9bc | ||
|
|
6dd8c05533 | ||
|
|
0b900d94f7 | ||
|
|
cf724c43cb | ||
|
|
cdf5ac4fc4 | ||
|
|
b768ce4ca4 | ||
|
|
0115503af9 | ||
|
|
08dd30c5bf | ||
|
|
72270013c8 | ||
|
|
a2a59cbeae | ||
|
|
20a38d2dbe | ||
|
|
9aade0a2da | ||
|
|
9af1d1af52 | ||
|
|
8bb69cd6da | ||
|
|
84a84a1687 | ||
|
|
462c43434b | ||
|
|
b830691611 | ||
|
|
204f1747cf | ||
|
|
13c9d80a3b | ||
|
|
64f45b061b | ||
|
|
c1202fd127 | ||
|
|
2060f3f59a | ||
|
|
1fb92df2e7 | ||
|
|
848301bf70 | ||
|
|
08b5b71fcb | ||
|
|
5414d4a9e4 | ||
|
|
b930bd7326 | ||
|
|
d1d1be49ba | ||
|
|
6ad7963347 | ||
|
|
2dcda2487a | ||
|
|
55911eac7a | ||
|
|
176b109ae7 | ||
|
|
0f12d43a59 | ||
|
|
6dfc2aca4b | ||
|
|
f5a34d5191 | ||
|
|
bc3a7f70e4 | ||
|
|
dcabee8d5e | ||
|
|
d7e290dc68 | ||
|
|
2e2341c8b2 | ||
|
|
0ee717342b | ||
|
|
9f372b3146 | ||
|
|
dd92e36feb | ||
|
|
c25738c62c | ||
|
|
c264e98e6e | ||
|
|
f2780bcbc2 | ||
|
|
050b703fc0 | ||
|
|
eed09f64f7 | ||
|
|
28c4ad1501 | ||
|
|
28d1dad629 | ||
|
|
b5f0672888 | ||
|
|
71fc4faae7 | ||
|
|
8bff1e8bc4 | ||
|
|
af67dd6610 | ||
|
|
c46c700f7c | ||
|
|
2a2de2efdc | ||
|
|
f384c42de5 | ||
|
|
bf1c54e5a3 | ||
|
|
d8f2cc50df | ||
|
|
06c25ba998 | ||
|
|
58654a3f3a | ||
|
|
32521cd1b6 | ||
|
|
e072fe6ea9 | ||
|
|
b5897fdb62 | ||
|
|
55df525f1b | ||
|
|
e6dde68924 | ||
|
|
b3e2305dea | ||
|
|
ec3e3ed1fd | ||
|
|
30fc97eef6 | ||
|
|
5939692616 | ||
|
|
9ce3176b59 | ||
|
|
497d35b03b | ||
|
|
6a1191de31 | ||
|
|
6c3a17de71 | ||
|
|
22cf82e44b | ||
|
|
10c7e49273 | ||
|
|
4900eae751 | ||
|
|
5334c599f0 | ||
|
|
ad10a1eba5 | ||
|
|
3ca626f2a9 | ||
|
|
e7ad40d8f4 | ||
|
|
d38ab1145a | ||
|
|
f31360e1a4 | ||
|
|
059fead736 | ||
|
|
4e8360c030 | ||
|
|
fbd80746a5 | ||
|
|
072a5de1c5 | ||
|
|
5c3c5a5521 | ||
|
|
461b294bc7 | ||
|
|
71de0f2d08 | ||
|
|
2ffdc4f2ef | ||
|
|
dc9b320c4a | ||
|
|
a6a93148b4 | ||
|
|
f7dc3b9ce4 | ||
|
|
12ad5d53c9 | ||
|
|
54dc1e2e15 | ||
|
|
073f715f17 | ||
|
|
7ff50893dc | ||
|
|
d128082b23 | ||
|
|
1b8f89c3f1 | ||
|
|
8eb138e0b3 | ||
|
|
8256579310 | ||
|
|
41f1fb8d95 | ||
|
|
277d91afce | ||
|
|
aaa840ebef | ||
|
|
29ffdadabb | ||
|
|
e5f19fe037 | ||
|
|
5791d71e9f | ||
|
|
104a7022fb | ||
|
|
6210b613be | ||
|
|
2ba9380616 | ||
|
|
59042bc2e2 | ||
|
|
ccfd8e51ea | ||
|
|
1aafb6c2c1 | ||
|
|
7976aa4b28 | ||
|
|
1b4e175c0c | ||
|
|
3ef955c139 | ||
|
|
51990ed0e5 | ||
|
|
138523bab3 | ||
|
|
995ec2b104 | ||
|
|
d13f8749d4 | ||
|
|
0350443810 | ||
|
|
c5841dccbb | ||
|
|
a0c50f9ef5 | ||
|
|
120020b4db | ||
|
|
676747467a | ||
|
|
e2d13541dc | ||
|
|
057cbc76b3 | ||
|
|
48035187d2 | ||
|
|
f05f60f929 | ||
|
|
3ab19e81ac | ||
|
|
532be6cd87 | ||
|
|
21a492fa43 | ||
|
|
edf83823f1 | ||
|
|
8d6f7de046 | ||
|
|
a7de4f3663 | ||
|
|
e538f16315 | ||
|
|
3f8b3e2baa | ||
|
|
a90ecde389 | ||
|
|
1ad65bb66b | ||
|
|
d85bb3bce1 | ||
|
|
8cd4732321 | ||
|
|
6957b02c27 | ||
|
|
adcadf08d1 | ||
|
|
3b36145257 | ||
|
|
c3e5eaf8da | ||
|
|
fd176107ae | ||
|
|
ad203e1461 | ||
|
|
1fe9ba5879 | ||
|
|
678321bb2f | ||
|
|
967ce824f7 | ||
|
|
336e5e0ff7 | ||
|
|
7a94f472c7 | ||
|
|
70b41a2a6e | ||
|
|
216e7f3b10 | ||
|
|
0717da6e37 | ||
|
|
3f64316e00 | ||
|
|
172eaf84b5 | ||
|
|
0c20889a17 | ||
|
|
62523d537b | ||
|
|
6643252019 | ||
|
|
13022a6bb0 | ||
|
|
fc018691e5 | ||
|
|
56666c4bf4 | ||
|
|
379da81f85 | ||
|
|
9ce6d4b72a | ||
|
|
be46c31c74 | ||
|
|
cd4029dc61 | ||
|
|
d2aa55a3bd | ||
|
|
838be0846d | ||
|
|
9414cb97b5 | ||
|
|
d6883a077a | ||
|
|
aa60b8399b | ||
|
|
cbe504df77 | ||
|
|
e0efcc1f25 | ||
|
|
c6e536a768 | ||
|
|
77ba53bda7 | ||
|
|
c2c6f1493a | ||
|
|
debaed6e5e | ||
|
|
0d6279617b | ||
|
|
3435314400 | ||
|
|
f248a8383b | ||
|
|
5458b007d1 | ||
|
|
6735291c99 | ||
|
|
6ad7a20c07 | ||
|
|
3191825ecc | ||
|
|
baee6b9738 | ||
|
|
c4a7f899db | ||
|
|
c01623ba56 | ||
|
|
81d0d5c59f | ||
|
|
cc4fdfd852 | ||
|
|
ba7be29153 | ||
|
|
4eae95b88d | ||
|
|
06d8281f16 | ||
|
|
87c21ba75e | ||
|
|
7f88a7c9bb | ||
|
|
38c57a662c | ||
|
|
36f5ddc543 | ||
|
|
8b873b6b1b | ||
|
|
68bd881ca8 | ||
|
|
c3e717a3ef | ||
|
|
d9be6f8a9a | ||
|
|
3bfb9d65f4 | ||
|
|
9ad26f943f | ||
|
|
c5112cb24e | ||
|
|
c17e1f9e75 | ||
|
|
b48b454909 | ||
|
|
6b59a924e8 | ||
|
|
87879a6784 | ||
|
|
fca5fda9da | ||
|
|
691d566482 | ||
|
|
61578f4dca | ||
|
|
9f4a7fc0da | ||
|
|
200a5d84c7 | ||
|
|
309a2ad0a3 | ||
|
|
e696331e2a | ||
|
|
c3126e24ce | ||
|
|
bde931f2f5 | ||
|
|
58b3e9f201 | ||
|
|
1423dcb619 | ||
|
|
df3540b0f9 | ||
|
|
921209580a | ||
|
|
d4e058a844 | ||
|
|
8f9eed154e | ||
|
|
1416655d53 | ||
|
|
9a147218ce | ||
|
|
34b575da03 | ||
|
|
54d22a23b5 | ||
|
|
ee10e17ce7 | ||
|
|
8ff97468cc | ||
|
|
6f898c6c97 | ||
|
|
cfeb8d053f | ||
|
|
d317171a45 | ||
|
|
9b0aadccf8 | ||
|
|
d6850ab358 | ||
|
|
c139a0d9ed | ||
|
|
67b0c4cddd | ||
|
|
ce36bf6134 | ||
|
|
e2dd65a403 | ||
|
|
a2595d5107 | ||
|
|
6dc0cf0c44 | ||
|
|
faac630001 | ||
|
|
0deacc7229 | ||
|
|
c849fe1496 | ||
|
|
4238e84ec4 | ||
|
|
df4e306c64 | ||
|
|
916c728d70 | ||
|
|
476d85915b | ||
|
|
e54b8ead72 | ||
|
|
d2444d2992 | ||
|
|
48acda2c3c | ||
|
|
264f7b1d30 | ||
|
|
fc44d54607 | ||
|
|
afc3698578 | ||
|
|
c3cd94b695 | ||
|
|
ea219f683e | ||
|
|
faf6584652 | ||
|
|
4dc41749fb | ||
|
|
2aa94301a8 | ||
|
|
d2870b6df7 | ||
|
|
5cbc44610c | ||
|
|
9032cc0ecc | ||
|
|
e48b314ad0 | ||
|
|
6fdaf905c4 | ||
|
|
79b706fb5c | ||
|
|
eaee188244 | ||
|
|
a6ac62d628 | ||
|
|
7a7f12504b | ||
|
|
55c83d17e1 | ||
|
|
8009c1b7eb | ||
|
|
1580453f4b | ||
|
|
9cc8f5dd07 | ||
|
|
7e326b8431 | ||
|
|
8bddb47fab | ||
|
|
b1b462d22b | ||
|
|
d5847faaba | ||
|
|
4c9f3aee74 | ||
|
|
ff4e0cb1c2 | ||
|
|
c159da1fbc | ||
|
|
d5e55f9dbd | ||
|
|
642ed4061a | ||
|
|
5178c3e67f | ||
|
|
e402347d73 | ||
|
|
3004c58798 | ||
|
|
15a44fe650 | ||
|
|
e37a96a94a | ||
|
|
e475a3b64c | ||
|
|
663ebd25ea | ||
|
|
e6bec0de72 | ||
|
|
f513effd47 | ||
|
|
dd05e898cc | ||
|
|
49a88e75e6 | ||
|
|
14a99471f4 | ||
|
|
bdbc181e38 | ||
|
|
133b1151bd | ||
|
|
653aab2358 | ||
|
|
13669313d4 | ||
|
|
e84d79ccf3 | ||
|
|
34077f9624 | ||
|
|
28ba64a4db | ||
|
|
0eefd3e140 | ||
|
|
20bbfc5917 | ||
|
|
9d6832224e | ||
|
|
2cf17b19dc | ||
|
|
390cf2114a | ||
|
|
8bff019b5d | ||
|
|
7d221f3be9 | ||
|
|
b8628b9772 | ||
|
|
cda4d9e1b2 | ||
|
|
f5d7a4d41e | ||
|
|
94486302f5 | ||
|
|
4f4a7409f6 | ||
|
|
60f57f9e4b | ||
|
|
2f98cd9eb0 | ||
|
|
f77586f13d | ||
|
|
fa82091989 | ||
|
|
66e9c68da4 | ||
|
|
c97c2fee37 | ||
|
|
fd03500786 | ||
|
|
83d5c31a0c | ||
|
|
7f19c10da9 | ||
|
|
c10ea527a0 | ||
|
|
5a54c1520a | ||
|
|
3f2732be7b | ||
|
|
d504b1f90f | ||
|
|
210dac058d | ||
|
|
ccb3012e5a | ||
|
|
c94f2e6f07 | ||
|
|
e31d7178b4 | ||
|
|
b3a4b8085c | ||
|
|
b56d7ab9c3 | ||
|
|
c63e270921 | ||
|
|
cffbae3a13 | ||
|
|
d2d03228ee | ||
|
|
30458fa536 | ||
|
|
0e60831f46 | ||
|
|
69238bf8e8 | ||
|
|
db483df9a6 | ||
|
|
1dc95f5d3a | ||
|
|
37caef10b1 | ||
|
|
381ecd8f70 | ||
|
|
f2a829362b | ||
|
|
fe2e994f2d | ||
|
|
95ba6bf040 | ||
|
|
6f937e8958 | ||
|
|
12f04650de | ||
|
|
f7330cce14 | ||
|
|
ba56f95da8 | ||
|
|
46704724e3 | ||
|
|
caadd5bb32 | ||
|
|
faa221f162 | ||
|
|
a814d5438a | ||
|
|
ab43c4cf2a | ||
|
|
d781e2dfb8 | ||
|
|
968ef1560f | ||
|
|
1631ceedb3 | ||
|
|
884c2af17d | ||
|
|
51ab030541 | ||
|
|
2a1e063641 | ||
|
|
62b3120ffd | ||
|
|
ea17b3d7c9 | ||
|
|
f3e98fc71c | ||
|
|
5034e11f22 | ||
|
|
560473d70b | ||
|
|
10e53509bd | ||
|
|
27afb02482 | ||
|
|
07fd0989ea | ||
|
|
d7c38aea50 | ||
|
|
20d57e27c9 | ||
|
|
4606c8092f | ||
|
|
30f256aad2 | ||
|
|
1b9dbd0e62 | ||
|
|
225c8871f9 | ||
|
|
d0333134d5 | ||
|
|
b24b8315d3 | ||
|
|
4ddc3b518b | ||
|
|
479a7e441d | ||
|
|
af5ae8d656 | ||
|
|
1365882de4 | ||
|
|
7854cd1f94 | ||
|
|
12a1a14527 | ||
|
|
a71cc552c9 | ||
|
|
e42d091502 | ||
|
|
d89d5befa0 | ||
|
|
92e5ae29c9 | ||
|
|
65aeb97e3e | ||
|
|
08a9ef1072 | ||
|
|
9c3f297e97 | ||
|
|
2554871c64 | ||
|
|
404edebdff | ||
|
|
2f2030babf | ||
|
|
b560b35175 | ||
|
|
3063b19e1d | ||
|
|
a17fb54c37 | ||
|
|
c1b8a8594d | ||
|
|
0a7fc6c48c | ||
|
|
79d59ff9ca | ||
|
|
c7d3c78e72 | ||
|
|
d56322a032 | ||
|
|
aac3c4d5c7 | ||
|
|
9ba1ddc2dd | ||
|
|
61eeaa0496 | ||
|
|
d3b6f9975c | ||
|
|
5200c8d659 | ||
|
|
e2c6f57859 | ||
|
|
b084210705 | ||
|
|
6622922468 | ||
|
|
caf31eb6d3 | ||
|
|
464691f129 | ||
|
|
afcf539e6e | ||
|
|
bf2c1a2df2 | ||
|
|
7400064cd5 | ||
|
|
7eb3754807 | ||
|
|
a9cc2fdb54 | ||
|
|
212282e77c | ||
|
|
1e8a820108 | ||
|
|
0117341b7e | ||
|
|
d21eac8b18 | ||
|
|
af4edc3b76 | ||
|
|
8a959896bf | ||
|
|
ba5107e801 | ||
|
|
d7de4a3579 | ||
|
|
175b14860e | ||
|
|
72fcb4ebda | ||
|
|
3a221f9b6e | ||
|
|
1241fb54f3 | ||
|
|
b291dcadc6 | ||
|
|
4105b19f75 | ||
|
|
b7b8ad7760 | ||
|
|
8465e3061a | ||
|
|
6b09cd61d2 | ||
|
|
aac609cc38 | ||
|
|
0b1d16f9db | ||
|
|
7374f6dc4f | ||
|
|
9577d80fc2 | ||
|
|
c550e27d21 | ||
|
|
423730da76 | ||
|
|
78a4c6f525 | ||
|
|
0d3ac21ae0 | ||
|
|
2cae3245aa | ||
|
|
e143a0ec6b | ||
|
|
35ce087f3b | ||
|
|
e787bc8ae4 | ||
|
|
4937052475 | ||
|
|
739eb67bec | ||
|
|
a3049b6f94 | ||
|
|
2f1346fefa | ||
|
|
f116db3108 | ||
|
|
87a8780cca | ||
|
|
d2de62283b | ||
|
|
11c16139c2 | ||
|
|
1c91ec69ba | ||
|
|
73429e7779 | ||
|
|
fe5aff0c72 | ||
|
|
c36d29a896 | ||
|
|
e3b5395905 | ||
|
|
3a25ecbbc9 | ||
|
|
7d63970293 | ||
|
|
ee267d23ba | ||
|
|
e0e4eed26b | ||
|
|
5b280bd60d | ||
|
|
2f9cc91b64 | ||
|
|
36bcced355 | ||
|
|
9a9b17d38d | ||
|
|
e2cd275ac5 | ||
|
|
61eb5d906c | ||
|
|
a113dc0861 | ||
|
|
6a164a235d | ||
|
|
c1eaa90c2b | ||
|
|
00e00eb7b5 | ||
|
|
0d2db28908 | ||
|
|
20202b793b | ||
|
|
62e84e73ae | ||
|
|
73f6fd49d0 | ||
|
|
4f9da35b76 | ||
|
|
cc7b413a2a | ||
|
|
fcf29f357d | ||
|
|
4fd1eae84f | ||
|
|
1c770a3c66 | ||
|
|
e152f54903 | ||
|
|
5d3a9d817a | ||
|
|
e884916275 | ||
|
|
5b7b16416b | ||
|
|
04b93aeaf2 | ||
|
|
39bdd37615 | ||
|
|
4ccb3810c2 | ||
|
|
1065ebb0aa | ||
|
|
74c08de530 | ||
|
|
b195fdbf60 | ||
|
|
f68efe6674 | ||
|
|
ed309182bf | ||
|
|
50c6b276f9 | ||
|
|
4c1a8f358a | ||
|
|
05ff79f347 | ||
|
|
3ae328898d | ||
|
|
7d35c43def | ||
|
|
d4f857b739 | ||
|
|
b6bc844b4d | ||
|
|
d06a477371 | ||
|
|
c128c029f3 | ||
|
|
a58ad5006f | ||
|
|
3c5655fc3d | ||
|
|
6ab04866ec | ||
|
|
1f07f9d127 | ||
|
|
e5ccfc4446 | ||
|
|
ec89382e35 | ||
|
|
4a7873ef77 | ||
|
|
ff2fd45ff0 | ||
|
|
e8cfeec0cf | ||
|
|
c72171d1da | ||
|
|
885b56000b | ||
|
|
3d1ee9dcf0 | ||
|
|
5d2133a483 | ||
|
|
52bb56ba43 | ||
|
|
d2edf11726 | ||
|
|
9a152c23bb | ||
|
|
8572445f57 | ||
|
|
9940d73167 | ||
|
|
8b8a9ae854 | ||
|
|
036bf92223 | ||
|
|
410969743f | ||
|
|
14da67121c | ||
|
|
681d3e09ba | ||
|
|
0ce130efa7 | ||
|
|
d14d7ade85 | ||
|
|
7b4fd28ef1 | ||
|
|
b2280b2d72 | ||
|
|
b41826c332 | ||
|
|
3d93ed9059 | ||
|
|
35a0756e5a | ||
|
|
10419366f9 | ||
|
|
8373d31013 | ||
|
|
0c89a8f145 | ||
|
|
257ac4d37e | ||
|
|
653aee8b07 | ||
|
|
88726aff8c | ||
|
|
baabdb4ac2 | ||
|
|
6277510557 | ||
|
|
e9ab17fcb1 | ||
|
|
2f9ba719d4 | ||
|
|
e259f300b1 | ||
|
|
fcc357ddd1 | ||
|
|
e613198af7 | ||
|
|
e3c1214971 | ||
|
|
1c3f9f7fbf | ||
|
|
f4a1573586 | ||
|
|
95db668c3c | ||
|
|
691e21fa78 | ||
|
|
c555681c8b | ||
|
|
ae7ef24196 | ||
|
|
f935b141f1 | ||
|
|
a893d43d16 | ||
|
|
7cb47c8494 | ||
|
|
5ef4c763b6 | ||
|
|
459b5bd89c | ||
|
|
c5237a926d | ||
|
|
2e5052a7fa | ||
|
|
cd8d9bf07c | ||
|
|
7da022ebb4 | ||
|
|
67f9c7e0f0 | ||
|
|
1812d557b6 | ||
|
|
34cde430a5 | ||
|
|
12a6b58614 | ||
|
|
cb81fccfaf | ||
|
|
1ce0fffd25 | ||
|
|
0c1c4b08c7 | ||
|
|
c875b61003 | ||
|
|
f4b34c8ca5 | ||
|
|
a6b4b5e30c | ||
|
|
64fb8f0c53 | ||
|
|
78a312f61c | ||
|
|
2c6c4426e8 | ||
|
|
a9df0601a6 | ||
|
|
4345f353a0 | ||
|
|
96b525658e | ||
|
|
9525952573 | ||
|
|
76828a87ee | ||
|
|
789eb59904 | ||
|
|
c0265f8fd9 | ||
|
|
891ebb8ff6 | ||
|
|
1111c20d54 | ||
|
|
387176e83d | ||
|
|
80a38b285d | ||
|
|
aa0c02a243 | ||
|
|
3c5932af75 | ||
|
|
f40a7d47f5 | ||
|
|
f85543c7ff | ||
|
|
36d2ff7c3b | ||
|
|
7ba673ed89 | ||
|
|
a0cba79df2 | ||
|
|
c91e8d7aa7 | ||
|
|
e85b0a81ba | ||
|
|
bfc40498bd | ||
|
|
41ac7062f8 | ||
|
|
71c19b566b | ||
|
|
0de72f3abb | ||
|
|
ce3c78d30b | ||
|
|
7152308c25 | ||
|
|
cd838d4902 | ||
|
|
f7799eee59 | ||
|
|
247718bc6c | ||
|
|
6b5521fbf7 | ||
|
|
13e00379ae | ||
|
|
347663716c | ||
|
|
69415ea966 | ||
|
|
6c71e3c583 | ||
|
|
06861ceb55 | ||
|
|
6e286473ab | ||
|
|
6091219aaf | ||
|
|
76cee1287a | ||
|
|
ff138c6d47 | ||
|
|
a89f8b8098 | ||
|
|
f4009a9944 | ||
|
|
16b479d21e | ||
|
|
0f8c20c3ab | ||
|
|
d5c3b258f3 | ||
|
|
ee4a703407 | ||
|
|
e901208721 | ||
|
|
5deb7371ab | ||
|
|
f999195f47 | ||
|
|
9b920cf813 | ||
|
|
4155e8e0ce | ||
|
|
b583530c66 | ||
|
|
43c13c22a8 | ||
|
|
32167b45ce | ||
|
|
f09ae1e2e3 | ||
|
|
086e1e1a74 | ||
|
|
1020637d79 | ||
|
|
9c30d69d55 | ||
|
|
ff673f053b | ||
|
|
2514987d3e | ||
|
|
e332a916b0 | ||
|
|
5eb7faec29 | ||
|
|
8cfebee922 | ||
|
|
f4a22f8aef | ||
|
|
5fd641e8c7 | ||
|
|
4cde537a7f | ||
|
|
56ee4c1ae5 | ||
|
|
1874ad2ff2 | ||
|
|
907ed641bf | ||
|
|
a23ccd863d | ||
|
|
8d145d7a32 | ||
|
|
4a0419e554 | ||
|
|
f23a458319 | ||
|
|
1e324103cc | ||
|
|
85d8ced299 | ||
|
|
0631b8f052 | ||
|
|
649994464c | ||
|
|
8c618780b7 | ||
|
|
0dc2e8994b | ||
|
|
d25ab4f204 | ||
|
|
ff26080c5c | ||
|
|
95bd2dde19 | ||
|
|
6ad31a5441 | ||
|
|
702a82bb38 | ||
|
|
a5e91385b0 | ||
|
|
4c690b9d4c | ||
|
|
695d6e14d4 | ||
|
|
c19f87134e | ||
|
|
3de50e8dd4 | ||
|
|
fb20dae0a8 | ||
|
|
0f8db11f53 | ||
|
|
e3f94156f1 | ||
|
|
cf468fc4d1 | ||
|
|
849cf30b95 | ||
|
|
d08febc711 | ||
|
|
53bfafb84c | ||
|
|
40809e40c2 | ||
|
|
925197ae09 | ||
|
|
07f72de63d | ||
|
|
f17f62b532 | ||
|
|
b97bbe0572 | ||
|
|
9e4cc7fdbc | ||
|
|
7dcb56ea5c | ||
|
|
a814c6d152 | ||
|
|
cbe3a0fde7 | ||
|
|
7e375370fa | ||
|
|
1d149b100b | ||
|
|
1bce75ed53 | ||
|
|
d8a72fe797 | ||
|
|
5bd8319f99 | ||
|
|
d8221b880b | ||
|
|
1316ce5ca8 | ||
|
|
d5562767a2 | ||
|
|
1a03ee8b9b | ||
|
|
d07e53e9a0 | ||
|
|
04160e6acc | ||
|
|
6f4c7ca171 | ||
|
|
2d397efcf5 | ||
|
|
ba8e59e1bd | ||
|
|
568faa526f | ||
|
|
b761fbaabe | ||
|
|
4a493a96d7 | ||
|
|
601244ba74 | ||
|
|
d606197264 | ||
|
|
1fee10e167 | ||
|
|
674802abe4 | ||
|
|
179422a84b | ||
|
|
5c9e4685db | ||
|
|
c59f8c734a | ||
|
|
d2fa2be5af | ||
|
|
2d3d66e9d1 | ||
|
|
21713801ad | ||
|
|
598e2adebe | ||
|
|
8bbb84fdc7 | ||
|
|
59b7bc7b98 | ||
|
|
55d52be3c2 | ||
|
|
3aa4e45bdb | ||
|
|
534976e64f | ||
|
|
3efa9d2030 | ||
|
|
2c4657355f | ||
|
|
68702ca43f | ||
|
|
54a0de9b52 | ||
|
|
94832f3f81 | ||
|
|
fb00ba9efd | ||
|
|
96736cf1de | ||
|
|
834c55ec6f | ||
|
|
6528a434ce | ||
|
|
a24ee0a331 | ||
|
|
e86144bb06 | ||
|
|
ce7cb16cfe | ||
|
|
754bafc069 | ||
|
|
7eff6fde7c | ||
|
|
626dac600a | ||
|
|
f1b2d4340d | ||
|
|
aea4d73e61 | ||
|
|
3d6c74ead1 | ||
|
|
c606f80fe3 | ||
|
|
250ca36f05 | ||
|
|
4c63be066f | ||
|
|
b559eeb7e6 | ||
|
|
a9742dbdc6 | ||
|
|
5feaade1c7 | ||
|
|
31747dfecd | ||
|
|
eda9484413 | ||
|
|
7e904c1d15 | ||
|
|
5f8527ba04 | ||
|
|
082e95b700 | ||
|
|
aef5c61415 | ||
|
|
68fdac532f | ||
|
|
f718284538 | ||
|
|
966283dd6d | ||
|
|
0f3ec9ad73 | ||
|
|
cb685904ef | ||
|
|
5bf545ee90 | ||
|
|
b018ada5c8 | ||
|
|
976e81be43 | ||
|
|
694cb18256 | ||
|
|
a715a5fa37 | ||
|
|
1e10c9d508 | ||
|
|
2aacfea8ea | ||
|
|
43c2cb4ba8 | ||
|
|
c93f708bc8 | ||
|
|
353416a088 | ||
|
|
93b98abb8d | ||
|
|
5e28e38c98 | ||
|
|
0e828e5b3b | ||
|
|
c331d12678 | ||
|
|
f0817b2461 | ||
|
|
d3f2cd5321 | ||
|
|
7017766591 | ||
|
|
841890c178 | ||
|
|
4f5189b0dd | ||
|
|
250ecd13bd | ||
|
|
34133b094b | ||
|
|
75c3939c88 | ||
|
|
cb44430a3f | ||
|
|
be88b5aba2 | ||
|
|
3d0f7b8e7e | ||
|
|
a53d5dc791 | ||
|
|
7f1164b6a6 | ||
|
|
2174f10db5 | ||
|
|
e3c218092c | ||
|
|
cf73ba2905 | ||
|
|
d653b951e3 | ||
|
|
900c0eafac | ||
|
|
bf6eaaf625 | ||
|
|
32f3d214cb | ||
|
|
cd62b2a209 | ||
|
|
ff25b4cb46 | ||
|
|
5c07dd995e | ||
|
|
f54cc28a43 | ||
|
|
9b1c7bb1e3 | ||
|
|
ffe8a729b7 | ||
|
|
a47f356021 | ||
|
|
7d7a34c733 | ||
|
|
e306959ebe | ||
|
|
ce16c4d37f | ||
|
|
565cc05b48 | ||
|
|
287839e498 | ||
|
|
4be0969098 | ||
|
|
f1008b1abf | ||
|
|
8d8b3c2194 | ||
|
|
6631b57fc0 | ||
|
|
88b4bc3753 | ||
|
|
23a4dde10f | ||
|
|
5a47eb8559 | ||
|
|
81cd990052 | ||
|
|
dd9e7cf665 | ||
|
|
b2f50b5327 | ||
|
|
b21fe4b2fc | ||
|
|
5f23a3143c | ||
|
|
ef136c9d00 | ||
|
|
c7e8b724c7 | ||
|
|
0243e7ba8b | ||
|
|
b3f5375283 | ||
|
|
f90f683be5 | ||
|
|
bd23666b45 | ||
|
|
a620c2ec1a | ||
|
|
a723612141 | ||
|
|
2d7d4212c1 | ||
|
|
52cca034cf | ||
|
|
79ec1f5a02 | ||
|
|
68729a9696 | ||
|
|
93383204b3 | ||
|
|
78f17bd083 | ||
|
|
ea87006150 | ||
|
|
c0027c377b | ||
|
|
77b84c1de0 | ||
|
|
a14e2fedcf | ||
|
|
0341399e54 | ||
|
|
1dcf3585fb | ||
|
|
dbb48cf086 | ||
|
|
064c8adcf2 | ||
|
|
cff83e095a | ||
|
|
ff9aecca48 | ||
|
|
53c529a12c | ||
|
|
78454ba876 | ||
|
|
c3c1702d2b | ||
|
|
bffc777b58 | ||
|
|
fcec6a8fdf | ||
|
|
a842f25f89 | ||
|
|
9f2bea8ac1 | ||
|
|
7f9a2a2d34 | ||
|
|
3225f17f5a | ||
|
|
2f8b1dff27 | ||
|
|
7884f972ea | ||
|
|
bfce264537 | ||
|
|
dee5f4c96a | ||
|
|
6bd83137fb | ||
|
|
6c6c38679a | ||
|
|
ca0c700afa | ||
|
|
cc2e434f3d | ||
|
|
4d337f0bee | ||
|
|
539c10883b | ||
|
|
ae8796a570 | ||
|
|
141227d846 | ||
|
|
bb42b87f4e | ||
|
|
866d9dacb6 | ||
|
|
006e32077c | ||
|
|
0aca1c6c7c | ||
|
|
d906d56505 | ||
|
|
3b9ebf358c | ||
|
|
1c643cda5b | ||
|
|
e5697a8070 | ||
|
|
07f1a13cbf | ||
|
|
4c88f3ad64 | ||
|
|
c099d60393 | ||
|
|
5e0d48b40f | ||
|
|
c4f8e83d02 | ||
|
|
a768c1e6c0 | ||
|
|
540325dc20 | ||
|
|
2e57f76c12 | ||
|
|
e71fd6f8b4 | ||
|
|
c721721fc5 | ||
|
|
0ab5d6a7b8 | ||
|
|
66599e5770 | ||
|
|
d7c7463380 | ||
|
|
491a4468dc | ||
|
|
c85150aaea | ||
|
|
c7ba6d2a82 | ||
|
|
ace64cf50f | ||
|
|
cd6d4f6f47 | ||
|
|
1bdf74951a | ||
|
|
eda2b38f46 | ||
|
|
f14e85d6c4 | ||
|
|
76f668dddd | ||
|
|
ce01d696a0 | ||
|
|
8179a3a349 | ||
|
|
e5c397203e | ||
|
|
60aeba732d | ||
|
|
de70ef1ef6 | ||
|
|
1d02c288b3 | ||
|
|
3776920807 | ||
|
|
7d54cde8eb | ||
|
|
1bab2061bd | ||
|
|
34e30cba0d | ||
|
|
ed600c9077 | ||
|
|
30dc6d2b19 | ||
|
|
77c3b4636e | ||
|
|
25edcbaff9 | ||
|
|
553b8fb2e0 | ||
|
|
461b401e28 | ||
|
|
d2a4611d1e | ||
|
|
65c3dbba2c | ||
|
|
7ef0b5b428 | ||
|
|
89589d7ef5 | ||
|
|
70b782c7e7 | ||
|
|
9732b0a636 | ||
|
|
00acaa56b9 | ||
|
|
1cea2be9c1 | ||
|
|
94381bd899 | ||
|
|
23d935d7ec | ||
|
|
69da13b261 | ||
|
|
a6519e0ff7 | ||
|
|
b701a36e21 | ||
|
|
24a34088d8 | ||
|
|
0eeb092aad | ||
|
|
7d4726d12e | ||
|
|
e13bf164ea | ||
|
|
07434b19ae | ||
|
|
819fa88eb7 | ||
|
|
95976814f5 | ||
|
|
0a2dd2a330 | ||
|
|
65f125d998 | ||
|
|
7a2f6ebfd5 | ||
|
|
5d89fa3f07 | ||
|
|
4a66e28584 | ||
|
|
85990bbeb3 | ||
|
|
e0311e1530 | ||
|
|
6eb4dbf9cd | ||
|
|
a90453461e | ||
|
|
7e04c9a909 | ||
|
|
e51602ccfa | ||
|
|
ca7adb59db | ||
|
|
3a12802a4b | ||
|
|
c770eab3e3 | ||
|
|
079b8e7337 | ||
|
|
2e4593eee7 | ||
|
|
3ca80a7bf3 | ||
|
|
a4c15e5fa5 | ||
|
|
a40748e3aa | ||
|
|
029aac8059 | ||
|
|
2970f66218 | ||
|
|
ef238de7a7 | ||
|
|
af05313dc5 | ||
|
|
df0d1b57a0 | ||
|
|
23cff25ed5 | ||
|
|
c70b13a650 | ||
|
|
a51c6a7670 | ||
|
|
0bdb643e14 | ||
|
|
0cbbbf1287 | ||
|
|
9a00b62d28 | ||
|
|
05dce760d6 | ||
|
|
4eaf91c3dc | ||
|
|
818c3d6140 | ||
|
|
5e19cd0084 | ||
|
|
7b06257955 | ||
|
|
2af21c8003 | ||
|
|
db6f907946 | ||
|
|
125ed8bff2 | ||
|
|
1d0f2e9d31 | ||
|
|
43efc930f4 | ||
|
|
737e18d2de | ||
|
|
445445603f | ||
|
|
5957c94958 | ||
|
|
1c41661712 | ||
|
|
1b2909605e | ||
|
|
c6a13f970f | ||
|
|
f2f57dc5a5 | ||
|
|
c6de1ab56c | ||
|
|
0392e37eed | ||
|
|
f630c4ec6c | ||
|
|
e668642b23 | ||
|
|
c4c0c050af | ||
|
|
b4ff8360ba | ||
|
|
708a2ec703 | ||
|
|
407cb2f7e6 | ||
|
|
0b22e76b85 | ||
|
|
7671187160 | ||
|
|
5695e0e6b6 | ||
|
|
e22b2f00dc | ||
|
|
2a017c3a7c | ||
|
|
ce65c3113a | ||
|
|
65a2ebb8ad | ||
|
|
f0a542b154 | ||
|
|
dfe1c940bc | ||
|
|
3cd8708368 | ||
|
|
e677161e49 | ||
|
|
818c6711d8 | ||
|
|
f60cc76f3e | ||
|
|
685321fdc5 | ||
|
|
303215d42f | ||
|
|
f313752888 | ||
|
|
28b83a486e | ||
|
|
80289bd452 | ||
|
|
054be39feb | ||
|
|
6448e049d1 | ||
|
|
8e1f7c8d6f | ||
|
|
c4e31e7a58 | ||
|
|
0860d9712e | ||
|
|
1a17cbd26b | ||
|
|
c2b1d3b551 | ||
|
|
d4fac798fc | ||
|
|
b009b23245 | ||
|
|
f276f1e2f5 | ||
|
|
154e57748f | ||
|
|
6854fee73e | ||
|
|
24240bfba4 | ||
|
|
40e32daabe | ||
|
|
008cbc8972 | ||
|
|
8a1d2b614a | ||
|
|
b79d03d9a4 | ||
|
|
83fb9f84ed | ||
|
|
c634830b9f | ||
|
|
24edd68833 | ||
|
|
6913798250 | ||
|
|
131bd2c2cd | ||
|
|
55ae55c803 | ||
|
|
63f0eea70c | ||
|
|
38aeef0760 | ||
|
|
88d5f5d76c | ||
|
|
486ba5fe0a | ||
|
|
76f85389ae | ||
|
|
3d311496e0 | ||
|
|
fdbfe0f84b | ||
|
|
8a25592904 | ||
|
|
7edf024c71 | ||
|
|
ee4d9890e7 | ||
|
|
9cc06a94ec | ||
|
|
dd6dc1d334 | ||
|
|
fb2bafb49e | ||
|
|
bc3b8e73fe | ||
|
|
4d48441102 | ||
|
|
c0fa980f70 | ||
|
|
bb3bac9933 | ||
|
|
1ac5fa544b | ||
|
|
91bb4d4b00 | ||
|
|
aecdd0fdd5 | ||
|
|
2e5f3cd25c | ||
|
|
8558c55284 | ||
|
|
b16b49aea4 | ||
|
|
09678eeef4 | ||
|
|
fad43842a4 | ||
|
|
4b448a877c | ||
|
|
f090af2292 | ||
|
|
7faaac94dd | ||
|
|
dae0b25717 | ||
|
|
de3d9dca72 | ||
|
|
a91abb3e8d | ||
|
|
dabea8b972 | ||
|
|
dedffb3560 | ||
|
|
5eb2306e9a | ||
|
|
8a2e06a713 | ||
|
|
23b495aee8 | ||
|
|
b9d314e64c | ||
|
|
5a4826e660 | ||
|
|
20bf67d352 | ||
|
|
8b4f1e1383 | ||
|
|
20297e359d | ||
|
|
de7409fd07 | ||
|
|
8498f12a9d | ||
|
|
e949eb8623 | ||
|
|
201d17bc31 | ||
|
|
143e9bd210 | ||
|
|
9ec874d8a6 | ||
|
|
2543afebf1 | ||
|
|
81a859604c | ||
|
|
d3be4bba37 | ||
|
|
6779c9eb36 | ||
|
|
733da570c8 | ||
|
|
65258d5b6a | ||
|
|
618c8bb5ad | ||
|
|
ba8684dfc7 | ||
|
|
36a1bd9e0f | ||
|
|
fe56c1c6f2 | ||
|
|
86a37e6f8d | ||
|
|
da1aad7b92 | ||
|
|
876621f8af | ||
|
|
8a908b720f | ||
|
|
dadde52c40 | ||
|
|
369dd98cbe | ||
|
|
8cdd6cd131 | ||
|
|
973bc21f37 | ||
|
|
2ba327345d | ||
|
|
138ecc4ee1 | ||
|
|
5b9a8e9bf9 | ||
|
|
e520486892 | ||
|
|
ecb91613e8 | ||
|
|
d4ac76081e | ||
|
|
63727b67ee | ||
|
|
d969dcecbf | ||
|
|
49c9a202e0 | ||
|
|
512c8de526 | ||
|
|
012a929067 | ||
|
|
bec4e8d8e4 | ||
|
|
9f0993f29b | ||
|
|
1b79448ac2 | ||
|
|
6cef7d5060 | ||
|
|
752545ec0e | ||
|
|
adbebf7ecc | ||
|
|
4d57ac0ce1 | ||
|
|
24b77d9dcb | ||
|
|
cc0f431c35 | ||
|
|
1e7927fbff | ||
|
|
129e56e570 | ||
|
|
5beef690ad | ||
|
|
b0383b0978 | ||
|
|
16c6a11b77 | ||
|
|
9117b13576 | ||
|
|
af55978918 | ||
|
|
0446a1b3a8 | ||
|
|
3986dd4c32 | ||
|
|
79afa16a7f | ||
|
|
087ed0aa6a | ||
|
|
44fa3d2d07 | ||
|
|
8654d83a33 | ||
|
|
efb78c823c | ||
|
|
3bb7f0c291 | ||
|
|
62e0db7c9b | ||
|
|
130695fcb3 | ||
|
|
05fa301ecb | ||
|
|
ee90f730b5 | ||
|
|
7b8a23453f | ||
|
|
cb44479420 | ||
|
|
afb3806326 | ||
|
|
d96bfd21b7 | ||
|
|
bbc3100bb3 | ||
|
|
ac1bb2a6bd | ||
|
|
41ef391d15 | ||
|
|
e51aa5899a | ||
|
|
38bb975abd | ||
|
|
a249b315ca | ||
|
|
eba85e1ec3 | ||
|
|
c1c92256ea | ||
|
|
58ce97c0b4 | ||
|
|
ca58bab1f0 | ||
|
|
052c484abd | ||
|
|
7a213c9d6f | ||
|
|
f4de7422b3 | ||
|
|
a3d18d0429 | ||
|
|
77fbffdc4b | ||
|
|
63ea01104b | ||
|
|
cad0f1f396 | ||
|
|
677fb93494 | ||
|
|
55cbb12701 | ||
|
|
14099813f0 | ||
|
|
b1fd4e853c | ||
|
|
c1d3fc1b78 | ||
|
|
829980a941 | ||
|
|
d1e1a90d08 | ||
|
|
d56de091f6 | ||
|
|
87bb926fef | ||
|
|
e983f93859 | ||
|
|
c721acc2fa | ||
|
|
16fd4c83ac | ||
|
|
999dfb84ee | ||
|
|
c6557e5078 | ||
|
|
f7aab02978 | ||
|
|
fdcd67dd6b | ||
|
|
6c611d71dd | ||
|
|
b7e2396269 | ||
|
|
ab62875ab1 | ||
|
|
a499fdbb13 | ||
|
|
bf2f0c38ed | ||
|
|
b14c05ccae | ||
|
|
66e7cd41b7 | ||
|
|
e9a15d9189 | ||
|
|
e4aee13e9e | ||
|
|
551f9fcdf9 | ||
|
|
2ec5e948b4 | ||
|
|
60b7f504e6 | ||
|
|
f99668f551 | ||
|
|
8ade41b270 | ||
|
|
a36a5363b4 | ||
|
|
cb22fb54e8 | ||
|
|
1dcfdfdb65 | ||
|
|
d309eb8fa1 | ||
|
|
16dfdbe314 | ||
|
|
b926ed7b00 | ||
|
|
67a6b88104 | ||
|
|
631699bf80 | ||
|
|
80801bf7d0 | ||
|
|
4850a033fa | ||
|
|
0b4029f7a1 | ||
|
|
c07ef0d92a | ||
|
|
ca48c5ddff | ||
|
|
a20c362983 | ||
|
|
7beb204b9d | ||
|
|
3e4f9451a0 | ||
|
|
6e5846d206 | ||
|
|
5965591934 | ||
|
|
78f8a03da5 | ||
|
|
4d10584233 | ||
|
|
106fa64060 | ||
|
|
95be8b2cf3 | ||
|
|
53d7c6c085 | ||
|
|
e4df75519c | ||
|
|
0438fa6816 | ||
|
|
2dab4ccf85 | ||
|
|
b338e76649 | ||
|
|
c737ab764e | ||
|
|
990e73fce6 | ||
|
|
99fac3ae1c | ||
|
|
ad0bcc7de9 | ||
|
|
8069853dda | ||
|
|
14ed669eba | ||
|
|
9ff5fa4acf | ||
|
|
d026024e8c | ||
|
|
25d1491e6b | ||
|
|
4e1415faf2 | ||
|
|
692f64a78a | ||
|
|
b20b8af5a6 | ||
|
|
d34cf636d8 | ||
|
|
3c72ea40b4 | ||
|
|
f87c7833a3 | ||
|
|
f3931140fe | ||
|
|
8459117c23 | ||
|
|
bbc0c97329 | ||
|
|
1d8b152758 | ||
|
|
1c4652448c | ||
|
|
3a34e606b8 | ||
|
|
ca55748103 | ||
|
|
43fa199cfa | ||
|
|
f288ca23ae | ||
|
|
4026714461 | ||
|
|
39a8652708 | ||
|
|
fb432465ea | ||
|
|
42bccfe1ec | ||
|
|
98566150d2 | ||
|
|
676e1705c1 | ||
|
|
172cc1ffea | ||
|
|
6845a52e92 | ||
|
|
b5dc89f0e6 | ||
|
|
ecaea51fe0 | ||
|
|
77baf08092 | ||
|
|
63ff5a2fe3 | ||
|
|
97662f4b3e | ||
|
|
38869d5035 | ||
|
|
08047d4ab7 | ||
|
|
cf33853e68 | ||
|
|
768e618ed9 | ||
|
|
025ed51f11 | ||
|
|
ab9dae3bf3 | ||
|
|
74da5dfd4b | ||
|
|
aaaf452fdc | ||
|
|
d2b97d8aea | ||
|
|
8b95216493 | ||
|
|
f933fa8c78 | ||
|
|
f955309139 | ||
|
|
9c65a82430 | ||
|
|
7b4dda9c73 | ||
|
|
9ad7d2d977 | ||
|
|
e3b4b2f667 | ||
|
|
60a1374fb4 | ||
|
|
7fcbc3c003 | ||
|
|
40421f4321 | ||
|
|
ad2683b610 | ||
|
|
7d49699e5f | ||
|
|
b34a239096 | ||
|
|
02d1251fe4 | ||
|
|
95e58ebb9f | ||
|
|
1cb2704f1b | ||
|
|
dea71f1aa9 | ||
|
|
aee975b7d8 | ||
|
|
18b6d51644 | ||
|
|
3a5ff851af | ||
|
|
cd929345e6 | ||
|
|
de232dd726 | ||
|
|
8ebe99d4f5 | ||
|
|
32f760a461 | ||
|
|
65eaab5cf4 | ||
|
|
51698944e0 | ||
|
|
64fc924357 | ||
|
|
c61a0cdd22 | ||
|
|
9a1de81fc5 | ||
|
|
3633d3cd73 | ||
|
|
9a0465eb05 | ||
|
|
088e199aa2 | ||
|
|
bc4c043d7e | ||
|
|
764299ea8a | ||
|
|
2abc87a1f2 | ||
|
|
75fa116c88 | ||
|
|
cc7575adab | ||
|
|
efb1a2c8e0 | ||
|
|
c2972fcaa0 | ||
|
|
250fd71e16 | ||
|
|
783c165201 | ||
|
|
326a3c5932 | ||
|
|
0af1a85442 | ||
|
|
10e7bb97ee | ||
|
|
c319bbc5f3 | ||
|
|
9e42f70e5f | ||
|
|
ff47152187 | ||
|
|
94b6ce5ca0 | ||
|
|
8e1020f134 | ||
|
|
be7a0fef41 | ||
|
|
9fe7bb7362 | ||
|
|
5d4b121ac1 | ||
|
|
cb424a5f78 | ||
|
|
88ab9d0756 | ||
|
|
29f4fd40ed | ||
|
|
b7f7ba06b9 | ||
|
|
94f8ac8d1d | ||
|
|
72ab38bd2f | ||
|
|
b3d5466131 | ||
|
|
bafbd8f1b6 | ||
|
|
8c1ce03183 | ||
|
|
97490b272f | ||
|
|
2afbe9514b | ||
|
|
603be609a1 | ||
|
|
4590be7b65 | ||
|
|
097a2f6582 | ||
|
|
f818e5bc51 | ||
|
|
34cf8fc43c | ||
|
|
7712765c3a | ||
|
|
eaf1304eda | ||
|
|
f97f32df0f | ||
|
|
79eecd6db4 | ||
|
|
5a75d8e788 | ||
|
|
42e58fb73a | ||
|
|
dba996b2c4 | ||
|
|
647f0dd34b | ||
|
|
a691a519e8 | ||
|
|
86075973b5 | ||
|
|
97ea15300c | ||
|
|
a150a8fd52 | ||
|
|
ad4e20da52 | ||
|
|
e43ab1e46f | ||
|
|
e32e280cf1 | ||
|
|
c1a07e0943 | ||
|
|
93fe641dbf | ||
|
|
d8194c0886 | ||
|
|
75ce4766d3 | ||
|
|
7eff3bf854 | ||
|
|
af143ae7dc | ||
|
|
a0e9140dde | ||
|
|
33e5d46c87 | ||
|
|
f74b206864 | ||
|
|
f334ebe577 | ||
|
|
9c39394d7f | ||
|
|
8ea0e6977a | ||
|
|
bf006473c0 | ||
|
|
568af27be4 | ||
|
|
bd55f86203 | ||
|
|
d95e577639 | ||
|
|
a904e54122 | ||
|
|
2a97655a8d | ||
|
|
d878718510 | ||
|
|
416227a2a2 | ||
|
|
7d1baa8798 | ||
|
|
fe2ee64ec9 | ||
|
|
96819628d6 | ||
|
|
1b30d7909c | ||
|
|
baf253d44e | ||
|
|
b7a4d50007 | ||
|
|
625b4befb5 | ||
|
|
30678f51bd | ||
|
|
7a4103dd48 | ||
|
|
bca3ff2eac | ||
|
|
28e2934a89 | ||
|
|
0563af682d | ||
|
|
5ccd63250b | ||
|
|
f262a0745d | ||
|
|
c42b63b008 | ||
|
|
e7ffb80877 | ||
|
|
919166212f | ||
|
|
deb124f645 | ||
|
|
86b1ff5125 | ||
|
|
2c8c96149f | ||
|
|
82e4cc9951 | ||
|
|
04df06404f | ||
|
|
f6fcf5fce4 | ||
|
|
ac5e92c879 | ||
|
|
37ccc80ba4 | ||
|
|
8153f97899 | ||
|
|
8dedc6d3dc | ||
|
|
807d75e13a | ||
|
|
feac1786e1 | ||
|
|
09e0f4e36c | ||
|
|
9999332107 | ||
|
|
d4ec7e5357 | ||
|
|
064b3caf08 | ||
|
|
c83d2e9513 | ||
|
|
48ff516215 | ||
|
|
cdccbb59ab | ||
|
|
2fe5a863ac | ||
|
|
7d1fccf474 | ||
|
|
0a8dbc8831 | ||
|
|
177a3c2cbd | ||
|
|
9f22e634f5 | ||
|
|
55a8c7b540 | ||
|
|
76c11fe65a | ||
|
|
b15ed00feb | ||
|
|
fc3ff34c2d | ||
|
|
5faa0f55bc | ||
|
|
77f0731c3e | ||
|
|
ffff623852 | ||
|
|
a6bc40b506 | ||
|
|
a034515019 | ||
|
|
49c8f23bf7 | ||
|
|
29b7a71812 | ||
|
|
8de3283dd1 | ||
|
|
4bbe5b3358 | ||
|
|
3dd3af4a73 | ||
|
|
7e7b129822 | ||
|
|
8bcc1d81d2 | ||
|
|
aa8e92e9a5 | ||
|
|
a8196ec99e | ||
|
|
bd3034819e | ||
|
|
7bb86c4e2a | ||
|
|
94ed21d1cf | ||
|
|
1bb7c31ee4 | ||
|
|
06d12b376c | ||
|
|
e9c8137fd8 | ||
|
|
eaaddf40d2 | ||
|
|
3e0c565019 | ||
|
|
984603112f | ||
|
|
fe29246256 | ||
|
|
84d0664112 | ||
|
|
3d3c59cea6 | ||
|
|
7940428b9b | ||
|
|
2e485b9ac5 | ||
|
|
b76aa926f6 | ||
|
|
58d81546da | ||
|
|
7a480990c6 | ||
|
|
afb10efd83 | ||
|
|
e2f05e137f | ||
|
|
d72ade9c70 | ||
|
|
64650fcdee | ||
|
|
e1acb7df13 | ||
|
|
319a30cf3a | ||
|
|
e631f1b313 | ||
|
|
617f31b47f | ||
|
|
61e9aac92d | ||
|
|
75812804f4 | ||
|
|
b60f36f211 | ||
|
|
e342c878d0 | ||
|
|
c6b3cadf55 | ||
|
|
869a361d09 | ||
|
|
f83119e188 | ||
|
|
578c4b444c | ||
|
|
d63f9be03f | ||
|
|
62fe02415a | ||
|
|
481970c763 | ||
|
|
7c8dc66ba1 | ||
|
|
20ffbf5a82 | ||
|
|
2b6f26b214 | ||
|
|
d743ec2d2b | ||
|
|
dfab332285 | ||
|
|
bbbce8a981 | ||
|
|
0dc4ccb42f | ||
|
|
b46c2c2527 | ||
|
|
3b128f844b | ||
|
|
d38b3d09ba | ||
|
|
d35c5ffa04 | ||
|
|
eb7243233e | ||
|
|
21bf629505 | ||
|
|
702022001d | ||
|
|
d9549ad634 | ||
|
|
daf91dbf95 | ||
|
|
2bc19120d9 | ||
|
|
8ddfa8cd68 | ||
|
|
076d10358e | ||
|
|
5930983641 | ||
|
|
a0c5cb51aa | ||
|
|
8e659745fd | ||
|
|
87297d2a07 | ||
|
|
8f23611f1a | ||
|
|
e2affb0f38 | ||
|
|
26e6041b7a | ||
|
|
81707a45d5 | ||
|
|
805f2b28a9 | ||
|
|
22aa02895e | ||
|
|
6bb89778b2 | ||
|
|
6631b9e78f | ||
|
|
7f7d5b32da | ||
|
|
52def444ab | ||
|
|
7d52ab7c54 | ||
|
|
852b324819 | ||
|
|
e019441ede | ||
|
|
ac8f8d0dd6 | ||
|
|
3fa2e7e12e | ||
|
|
5d099491df | ||
|
|
d7ca0f7734 | ||
|
|
5d31338b02 | ||
|
|
a44b81d240 | ||
|
|
742e499de0 | ||
|
|
eb395d6d2d | ||
|
|
a1383c34b5 | ||
|
|
e538da3959 | ||
|
|
687a072dc8 | ||
|
|
5dc9881241 | ||
|
|
0b3a7e2f0f | ||
|
|
123455a5bb | ||
|
|
34c8d8dd2e | ||
|
|
3f4c92d739 | ||
|
|
eb10245df1 | ||
|
|
2dbfcbb378 | ||
|
|
a717f5c030 | ||
|
|
3a711790c5 | ||
|
|
5d77cb0396 | ||
|
|
9972ea578b | ||
|
|
0bb3762397 | ||
|
|
fbd6e21152 | ||
|
|
bea62537df | ||
|
|
fdbe4c5bd5 | ||
|
|
91e779a52c | ||
|
|
e2c5e92cd3 | ||
|
|
5929676ea2 | ||
|
|
36e180ab91 | ||
|
|
1e8fe22553 | ||
|
|
8e1bd2d8f3 | ||
|
|
239ce262ef | ||
|
|
5be66e98c2 | ||
|
|
cacd072c15 | ||
|
|
14c6a1bf23 | ||
|
|
b27dfd4c77 | ||
|
|
4622e9658d | ||
|
|
f8bda517c3 | ||
|
|
de3d9fdb8b | ||
|
|
c6291bea52 | ||
|
|
a266e3c898 | ||
|
|
f9c34d6808 | ||
|
|
10a91cac2f | ||
|
|
f7e25e9c63 | ||
|
|
5f821a58a3 | ||
|
|
4a2ad4e6f9 | ||
|
|
4a2bbb52c1 | ||
|
|
ed401199bd | ||
|
|
eee3a263f5 | ||
|
|
eca1d9aabd | ||
|
|
33ff9cfbb6 | ||
|
|
de8e6d7174 | ||
|
|
cd9332cddf | ||
|
|
fb4a861c0d | ||
|
|
c30460df4c | ||
|
|
31e86a36f8 | ||
|
|
0b4fe85b33 | ||
|
|
99e7a1705a | ||
|
|
27c6259b53 | ||
|
|
1ecae14bae | ||
|
|
c56a09f318 | ||
|
|
ffec2699ea | ||
|
|
46faf0280c | ||
|
|
3b774ed507 | ||
|
|
9c62bbbc05 | ||
|
|
dc6b1ef47b | ||
|
|
1f8e1d2a29 | ||
|
|
b30a948601 | ||
|
|
e90568e044 | ||
|
|
c74b5ba3a2 | ||
|
|
2085d6afad | ||
|
|
8bfdbd0fed | ||
|
|
cc3dc6aff0 | ||
|
|
d01284d147 | ||
|
|
7b7d5118d6 | ||
|
|
a03a7dcb4a | ||
|
|
dfae413afc | ||
|
|
253642a85e | ||
|
|
ce64c8e7d1 | ||
|
|
d7ae0105c3 | ||
|
|
e7320e7bd3 | ||
|
|
a214565803 | ||
|
|
61f1290bea | ||
|
|
ba5e512d10 | ||
|
|
624e4bca40 | ||
|
|
613237727d | ||
|
|
fd2ddca6f2 | ||
|
|
e114c18031 | ||
|
|
49e22742de | ||
|
|
422d7942ef | ||
|
|
a63e7162bc | ||
|
|
1f973b72b8 | ||
|
|
d3dd97f167 | ||
|
|
f0f17e0041 | ||
|
|
d6fa8bf233 | ||
|
|
ec5e685a1c | ||
|
|
c88b95751c | ||
|
|
72ae25bc53 | ||
|
|
02e5cc1da8 | ||
|
|
3d092df56d | ||
|
|
912d5c700c | ||
|
|
6d3c492518 | ||
|
|
5e29e3f1cb | ||
|
|
0558495760 | ||
|
|
0471dfa2f8 | ||
|
|
7883e6544e | ||
|
|
6da87e4a79 | ||
|
|
bafe4fff93 | ||
|
|
da782398a2 | ||
|
|
4b26b46f6a | ||
|
|
0f1e69a2df | ||
|
|
85f2bd464c | ||
|
|
8a4956b736 | ||
|
|
4a369af4c7 | ||
|
|
9749305ecd | ||
|
|
639178dbdc | ||
|
|
62d038b547 | ||
|
|
9b80e3a33b | ||
|
|
0ea54f0458 | ||
|
|
374c52f71f | ||
|
|
60f63e125a | ||
|
|
7cfa7f3de4 | ||
|
|
92409831c2 | ||
|
|
e04790a628 | ||
|
|
cd7bf40508 | ||
|
|
dc378e9ce7 | ||
|
|
5fcdcec1a8 | ||
|
|
8773704c8b | ||
|
|
291fd1857e | ||
|
|
0aa4aeaddc | ||
|
|
ca81f1b2e8 | ||
|
|
fca3a14410 | ||
|
|
d105e80ed8 | ||
|
|
ce63faa597 | ||
|
|
25c1b63a00 | ||
|
|
548728abba | ||
|
|
2ebdbd565a | ||
|
|
86376616ff | ||
|
|
7c6865f948 | ||
|
|
c2da0070f5 | ||
|
|
bf2a2aed66 | ||
|
|
403ea0a0e1 | ||
|
|
27976cbe1a | ||
|
|
70147396a4 | ||
|
|
d6aed16e7c | ||
|
|
0414bae820 | ||
|
|
620866bc39 | ||
|
|
55f080e33f | ||
|
|
9f2b1b03d7 | ||
|
|
c0a0f3aaf5 | ||
|
|
7726b5c56b | ||
|
|
3daff8ab8a | ||
|
|
428c2097c7 | ||
|
|
7786583ecf | ||
|
|
9b79ea7d30 | ||
|
|
3dc8436362 | ||
|
|
9f1f2a4845 | ||
|
|
40204e8133 | ||
|
|
133b1067c5 | ||
|
|
5c8287203e | ||
|
|
061bbb1914 | ||
|
|
572168ef20 | ||
|
|
1aa27f2da3 | ||
|
|
be76614c90 | ||
|
|
e26d355fb7 | ||
|
|
d8dbcef5dd | ||
|
|
5d6a6590bf | ||
|
|
7dfdfe5b50 | ||
|
|
36fcc460f4 | ||
|
|
24b03d42d6 | ||
|
|
60275d3637 | ||
|
|
9b5b471802 | ||
|
|
1edb96f526 | ||
|
|
f949bdcfe4 | ||
|
|
21a45a940e | ||
|
|
fb61dfd39d | ||
|
|
9b5940505b | ||
|
|
8c07a67fe9 | ||
|
|
0f9687ce62 | ||
|
|
1460e46d1f | ||
|
|
692521c49d | ||
|
|
2f1d8cc196 | ||
|
|
eeabb47fb6 | ||
|
|
e078f584eb | ||
|
|
f86322545a | ||
|
|
720e19a01f | ||
|
|
3560fed86e | ||
|
|
5f8f5a9f85 | ||
|
|
1aae24b831 | ||
|
|
b544b1c3d4 | ||
|
|
f462f87183 | ||
|
|
6ed7ef25b2 | ||
|
|
bc79d09f2d | ||
|
|
5b2becb87f | ||
|
|
cd808fb5a5 | ||
|
|
c8a4e40bcf | ||
|
|
911b6c9679 | ||
|
|
03041f87c3 | ||
|
|
360c53d6ca | ||
|
|
3f1d555c71 | ||
|
|
ae1d72265c | ||
|
|
9570c65d88 | ||
|
|
3e0b04509a | ||
|
|
0884379e0b | ||
|
|
ec16532028 | ||
|
|
c8f13544a8 | ||
|
|
44bfe55413 | ||
|
|
b95c1adc86 | ||
|
|
b3a94c26d9 | ||
|
|
159c7238a8 | ||
|
|
70f40bab1d | ||
|
|
6c1a9dc14b | ||
|
|
816381a6a8 | ||
|
|
dd84bca638 | ||
|
|
a5d2019a39 | ||
|
|
26cee564c9 | ||
|
|
316b8a1375 | ||
|
|
618b25df08 | ||
|
|
8f9c4cd217 | ||
|
|
c6e2e33e87 | ||
|
|
db605ea7ca | ||
|
|
a1507d4844 | ||
|
|
c6340a64fe | ||
|
|
265b440c37 | ||
|
|
ea8e6d978d | ||
|
|
c3f5bc6bfb | ||
|
|
e322f6dbe2 | ||
|
|
83059a013c | ||
|
|
e374392450 | ||
|
|
72d505b2f1 | ||
|
|
a11bff0c7b | ||
|
|
a820ee4c82 | ||
|
|
a18be78bd3 | ||
|
|
83b5806cec | ||
|
|
4d7a1199ea | ||
|
|
d47cac563a | ||
|
|
2969290c63 | ||
|
|
277557cd99 | ||
|
|
21db7d438b | ||
|
|
61ff2da15c | ||
|
|
ad8296a535 | ||
|
|
aec3318f4c | ||
|
|
3297c3a2e2 | ||
|
|
84759de36f | ||
|
|
a562126f2f | ||
|
|
1901134601 | ||
|
|
eecb6986ee | ||
|
|
508cada017 | ||
|
|
2abae2f21a | ||
|
|
82c17dbde2 | ||
|
|
425499b3aa | ||
|
|
96605766bb | ||
|
|
161012b0a7 | ||
|
|
0669a053db | ||
|
|
ab66e77740 | ||
|
|
381cd53551 | ||
|
|
1f0e92a752 | ||
|
|
98b3496717 | ||
|
|
4200e2e4e4 | ||
|
|
e239ae1aba | ||
|
|
2acfc307b7 | ||
|
|
186f1cf714 | ||
|
|
a5cf42b7c8 | ||
|
|
fd7dba8860 | ||
|
|
32d7e365d2 | ||
|
|
1078cc1c91 | ||
|
|
c97fc370cd | ||
|
|
fca8da118e | ||
|
|
dda56405e6 | ||
|
|
f0f23d491c | ||
|
|
44c10d720a | ||
|
|
690e5a7f9c | ||
|
|
e4fdbc3cb4 | ||
|
|
fe2b86ba83 | ||
|
|
8fb9557520 | ||
|
|
25c91b398a | ||
|
|
8a524dd98f | ||
|
|
7371f8927c | ||
|
|
3d4f58d564 | ||
|
|
f0e32c88ec | ||
|
|
5ae3eccaf1 | ||
|
|
093f12254f | ||
|
|
3a8afe2969 | ||
|
|
fff5ae97f2 | ||
|
|
3c626e3ea5 | ||
|
|
26f57141a1 | ||
|
|
419aa9dcba | ||
|
|
3f15456b9c | ||
|
|
f67a2fa865 | ||
|
|
0f6de542bf | ||
|
|
1a529841e0 | ||
|
|
a9bf6a0e3b | ||
|
|
76dcd7d96e | ||
|
|
6aa1361b1a | ||
|
|
f623a4ecef | ||
|
|
aa465a12aa | ||
|
|
81ba623423 | ||
|
|
4f6f6cca0f | ||
|
|
56346f2a52 | ||
|
|
edcd3f5145 | ||
|
|
7acd3d5297 | ||
|
|
1732c16778 | ||
|
|
913d440c61 | ||
|
|
8cdb4d48f2 | ||
|
|
907ac05c00 | ||
|
|
067558529c | ||
|
|
c97e653ba1 | ||
|
|
9a935ba90c | ||
|
|
134ed51517 | ||
|
|
993dd84af9 | ||
|
|
28e3ab73fa | ||
|
|
70a5efa1d6 | ||
|
|
a51a355a53 | ||
|
|
fdd0a33571 | ||
|
|
6547d03b91 | ||
|
|
cc0c2f1b3c | ||
|
|
c80c59c692 | ||
|
|
10de191dd5 | ||
|
|
1626cec089 | ||
|
|
0404776d87 | ||
|
|
4398fca1bd | ||
|
|
e94ca12f9f | ||
|
|
036c2f6a1c | ||
|
|
611304e257 | ||
|
|
cf26447f7c | ||
|
|
e5b8e04dde | ||
|
|
bb201e6ca4 | ||
|
|
bb58d633c0 | ||
|
|
56ff8755d4 | ||
|
|
57fc027f77 | ||
|
|
bdb7c226f1 | ||
|
|
17e32017a7 | ||
|
|
2c772d0f4c | ||
|
|
769ff84a65 | ||
|
|
fd1fbd4843 | ||
|
|
eaa9430e26 | ||
|
|
2e5de88445 | ||
|
|
b4b9910203 | ||
|
|
afeeadd665 | ||
|
|
fcbeb10159 | ||
|
|
65227f601e | ||
|
|
56ae4dcd12 | ||
|
|
2b2c8e6b82 | ||
|
|
49c032315c | ||
|
|
15109f801e | ||
|
|
3de0a16a9d | ||
|
|
bb49b0c16a | ||
|
|
9561414985 | ||
|
|
db7354ab72 | ||
|
|
34396dbbec | ||
|
|
d842a2f62e | ||
|
|
a17c32bed0 | ||
|
|
fab0b91a79 | ||
|
|
88974d552d | ||
|
|
b90a38ce8b | ||
|
|
b3df27c362 | ||
|
|
854ea26ab7 | ||
|
|
e385b3499b | ||
|
|
77d323b38c | ||
|
|
64eeb091b8 | ||
|
|
65f5f8e8e2 | ||
|
|
6b3ee1aaaf | ||
|
|
27ca48c6bb | ||
|
|
2786c776e3 | ||
|
|
23cd5b906b | ||
|
|
0f9d20129d | ||
|
|
4649bd3906 | ||
|
|
3048ac2f6d | ||
|
|
8679377fcf | ||
|
|
db5264af3c | ||
|
|
059fbb9e5d | ||
|
|
01303c1e31 | ||
|
|
a8aaa793a0 | ||
|
|
c5698e82da | ||
|
|
ec12f7a5e7 | ||
|
|
b87fec554f | ||
|
|
740981376d | ||
|
|
8694364aa3 | ||
|
|
f1b1fee6e4 | ||
|
|
915596b23e | ||
|
|
6d65cb77ec | ||
|
|
51e2f8e49b | ||
|
|
0a7fc356b6 | ||
|
|
ff0f05a1c1 | ||
|
|
0ea9362d06 | ||
|
|
9d3932bd82 | ||
|
|
8c787fa7f7 | ||
|
|
2508e71324 | ||
|
|
b2f4f96ef9 | ||
|
|
fdae297fca | ||
|
|
36488fd836 | ||
|
|
ee01c944b4 | ||
|
|
d7f4f392d2 | ||
|
|
1756093618 | ||
|
|
1734c6e6bf | ||
|
|
839f345fa3 | ||
|
|
d69b5385e4 | ||
|
|
eb6b5755e7 | ||
|
|
9c65d9f957 | ||
|
|
cfa187f7d9 | ||
|
|
30d0fbeae6 | ||
|
|
9b21656314 | ||
|
|
b1b06a38af | ||
|
|
d2fffe5b88 | ||
|
|
09d560888e | ||
|
|
fa28326ed6 | ||
|
|
9ea4a6b7b6 | ||
|
|
ffa6fafcc1 | ||
|
|
4be5b80ff6 | ||
|
|
5028b07aaa | ||
|
|
7ce5dcdead | ||
|
|
7d8571b0e1 | ||
|
|
fca2fe2c8a | ||
|
|
75576577e0 | ||
|
|
eafc46f6c4 | ||
|
|
c0c36d3338 | ||
|
|
6a73b0820e | ||
|
|
bcb5eda7d8 | ||
|
|
2c833b5028 | ||
|
|
6821603980 | ||
|
|
8bec45cd58 | ||
|
|
ce0f44fb47 | ||
|
|
c740562dd8 | ||
|
|
63a1c8b63e | ||
|
|
112cdb4842 | ||
|
|
2d5f045c29 | ||
|
|
c43ff29f5d | ||
|
|
4c0e3c4db9 | ||
|
|
7995a57f77 | ||
|
|
0a47378f7f | ||
|
|
8e9a244cdd | ||
|
|
5f1a4ea08d | ||
|
|
034b19d85d | ||
|
|
68cb7ea471 | ||
|
|
d9a3ba0dd1 | ||
|
|
663e1d8336 | ||
|
|
31332f4f53 | ||
|
|
cb7163dd19 | ||
|
|
946029a3f7 | ||
|
|
69cbb6e109 | ||
|
|
6054f6bfe1 | ||
|
|
ae7b9f5fcb | ||
|
|
68dc6b9527 | ||
|
|
292cdfd5a0 | ||
|
|
28e2dee605 | ||
|
|
6d79ab2552 | ||
|
|
da17e424ea | ||
|
|
028c25afd3 | ||
|
|
9c2151dc37 | ||
|
|
9e9bd16b18 | ||
|
|
3f138aec22 | ||
|
|
e9f66e7c89 | ||
|
|
6be64b363c | ||
|
|
51230f21f5 | ||
|
|
e12540ba66 | ||
|
|
a6b1bee2af | ||
|
|
6187cdafe3 | ||
|
|
880f785d04 | ||
|
|
5aedcfd6a7 | ||
|
|
6ff1a2c236 | ||
|
|
317f888383 | ||
|
|
33f1f9abde | ||
|
|
913406b568 | ||
|
|
6a74d102a4 | ||
|
|
e9e36cebcb | ||
|
|
af6bf7a232 | ||
|
|
5720a7a5e3 | ||
|
|
449c946423 | ||
|
|
54a2a0da48 | ||
|
|
e209fedb27 | ||
|
|
12494f3008 | ||
|
|
7f60b46488 | ||
|
|
1c9ecd96d4 | ||
|
|
1f84803b91 | ||
|
|
3f6116f28f | ||
|
|
4ea0eb94d4 | ||
|
|
e222bc631a | ||
|
|
9c07c7fe4f | ||
|
|
35d74e18de | ||
|
|
266be2c25f | ||
|
|
b7cb090144 | ||
|
|
30e257bc2b | ||
|
|
fbd5679fb1 | ||
|
|
9db7234f24 | ||
|
|
220b2dc912 | ||
|
|
83c2420038 | ||
|
|
73913f450b | ||
|
|
bb966e7e6f | ||
|
|
b4adc127a4 | ||
|
|
2bc343b524 | ||
|
|
1f4d6eb0df | ||
|
|
ee936fe1a1 | ||
|
|
f6d9239b37 | ||
|
|
512e5b0240 | ||
|
|
600148f501 | ||
|
|
8791a4f696 | ||
|
|
ef40a8a925 | ||
|
|
2473e87947 | ||
|
|
bbe1dfb53d | ||
|
|
3bc27b1a02 | ||
|
|
ec4c6e140b | ||
|
|
545cc1074c | ||
|
|
9c0f4822bc | ||
|
|
5040ec109b | ||
|
|
25b216d7ef | ||
|
|
e475c847d7 | ||
|
|
e7c55c1ad6 | ||
|
|
cd8fcadd29 | ||
|
|
f78b6b30d9 | ||
|
|
cc6a991464 | ||
|
|
81d487dd89 | ||
|
|
af2795c07f | ||
|
|
178d9fb8d5 | ||
|
|
9bd12eb782 | ||
|
|
ef66650997 | ||
|
|
fcffcdde1b | ||
|
|
7de892ccac | ||
|
|
f90f2e051a | ||
|
|
24f49c8d83 | ||
|
|
a4ebaf15ab | ||
|
|
54a46dccc3 | ||
|
|
9747d5057d | ||
|
|
7f5c97d0be | ||
|
|
1933a76631 | ||
|
|
c20d7f9754 | ||
|
|
6b46dc7e89 | ||
|
|
0c1a26170c | ||
|
|
244ee08d7d | ||
|
|
a3acbca24b | ||
|
|
d77e4ed581 | ||
|
|
b928abb956 | ||
|
|
a46ef8d1a6 | ||
|
|
a5d459749f | ||
|
|
7dfa383968 | ||
|
|
036483d195 | ||
|
|
2c950f74bc | ||
|
|
2c59dcd929 | ||
|
|
658d14f31d | ||
|
|
819f4d2151 | ||
|
|
9b214d75df | ||
|
|
e0891a2d71 | ||
|
|
34a4876761 | ||
|
|
13ead0085d | ||
|
|
9e63270fc5 | ||
|
|
eccab3cd57 | ||
|
|
6446daf1a6 | ||
|
|
821602ef1c | ||
|
|
dc3512de9f | ||
|
|
36e9cb7108 | ||
|
|
42f4531720 | ||
|
|
d1fb379a40 | ||
|
|
e27bdb965c | ||
|
|
54fc6df3da | ||
|
|
9dd8f62c8a | ||
|
|
1db19148e7 | ||
|
|
93a01506e4 | ||
|
|
4767ed790c | ||
|
|
e39211347c | ||
|
|
a8cdbb65fe | ||
|
|
ff74ff4149 | ||
|
|
96e47f3d27 | ||
|
|
be52c181ea | ||
|
|
507f2ec544 | ||
|
|
fe00c628f4 | ||
|
|
e9387d322c | ||
|
|
2e3b135fe9 | ||
|
|
d28cc15be2 | ||
|
|
d15bd23800 | ||
|
|
90fe45c52d | ||
|
|
8f7be71905 | ||
|
|
5d583637c4 | ||
|
|
0efb4285c1 | ||
|
|
6dc543ca18 | ||
|
|
e93e1ddeb9 | ||
|
|
d5459f5996 | ||
|
|
c6420a910d | ||
|
|
f8e67b8e68 | ||
|
|
9ffcd382b4 | ||
|
|
725746badf | ||
|
|
9d5290de91 | ||
|
|
1bb0b58cce | ||
|
|
32f0ebbe61 | ||
|
|
25a1d74627 | ||
|
|
355b2f09bf | ||
|
|
01621f75b6 | ||
|
|
242e8a3bd6 | ||
|
|
010c26e716 | ||
|
|
e7bad10663 | ||
|
|
16242f98ce | ||
|
|
14a447b3d8 | ||
|
|
a2088fa500 | ||
|
|
87af68c092 | ||
|
|
06daad87ca | ||
|
|
0b4b86f6c9 | ||
|
|
10626904af | ||
|
|
90cca8a3eb | ||
|
|
8da0141cac | ||
|
|
39e123aaf4 | ||
|
|
24fd17f072 | ||
|
|
9270cc47b5 | ||
|
|
3721db34ab | ||
|
|
e85ae351c7 | ||
|
|
a56ba245ea | ||
|
|
d162eed4c7 | ||
|
|
43fea34f61 | ||
|
|
f7c960fc0d | ||
|
|
ee1933389a | ||
|
|
fdc9d5f1fd | ||
|
|
bad40b6125 | ||
|
|
d76ce85327 | ||
|
|
d3df072a22 | ||
|
|
4b3009a195 | ||
|
|
b72b0d60cb | ||
|
|
5841e62c66 | ||
|
|
9bd0c01702 | ||
|
|
6d86b3a950 | ||
|
|
5ff9b02c89 | ||
|
|
80934ea232 | ||
|
|
5acfa2bf3a | ||
|
|
4fada52e04 | ||
|
|
e1c8e95e11 | ||
|
|
1dfebad790 | ||
|
|
37ffe63d13 | ||
|
|
cc14c34dc2 | ||
|
|
e0cf4e644b | ||
|
|
aad55fc3db | ||
|
|
ba2b459220 | ||
|
|
086669fbe0 | ||
|
|
4cc3fcb6e8 | ||
|
|
8781053dbe | ||
|
|
bdac8974d8 | ||
|
|
9ae24141a3 | ||
|
|
e773efdc59 | ||
|
|
8f94bd1fbd | ||
|
|
d24d83d52a | ||
|
|
c938017baa | ||
|
|
728eea3ae1 | ||
|
|
88f9c1e539 | ||
|
|
76540c20f3 | ||
|
|
70761cf1d9 | ||
|
|
ace913a97d | ||
|
|
d6e269c7f6 | ||
|
|
ec10550b3a | ||
|
|
86e2374b48 | ||
|
|
d156dacbb9 | ||
|
|
1af5517da0 | ||
|
|
e5d34890a9 | ||
|
|
183b2548cf | ||
|
|
d2de489e3a | ||
|
|
90f8dbd86e | ||
|
|
3508ce19f3 | ||
|
|
00188c9818 | ||
|
|
499232f0e6 | ||
|
|
17471a12d2 | ||
|
|
de4b5eeda7 | ||
|
|
d0a0193707 | ||
|
|
5269a26b69 | ||
|
|
8dc6ad587f | ||
|
|
757339c52d | ||
|
|
6e289339d7 | ||
|
|
3ff0a44a1c | ||
|
|
0562228e9a | ||
|
|
0b6993bb7c | ||
|
|
4a19d90d48 | ||
|
|
038b1bcf7b | ||
|
|
a707c2fe8e | ||
|
|
3bb119f578 | ||
|
|
2a92600fa7 | ||
|
|
e80e1dab4d | ||
|
|
45d59d75ba | ||
|
|
28cd4c3ee9 | ||
|
|
e7c44274b0 | ||
|
|
3b2e0e34ef | ||
|
|
2276df07bd | ||
|
|
758ff03520 | ||
|
|
c3ac172960 | ||
|
|
562b4eb531 | ||
|
|
b1f8e845df | ||
|
|
bda869ea54 | ||
|
|
19cfbf082a | ||
|
|
07078bdd1f | ||
|
|
03657a98e1 | ||
|
|
b3f64abfae | ||
|
|
5d73c8f002 | ||
|
|
ba0882762d | ||
|
|
bb8855b628 | ||
|
|
883d5917f5 | ||
|
|
0275e99fe2 | ||
|
|
5d109077e5 | ||
|
|
540851ab6a | ||
|
|
6b920fa5e6 | ||
|
|
d1498bb9fb | ||
|
|
54eeef173a | ||
|
|
723ddf8cda | ||
|
|
9f12552907 | ||
|
|
a8b6fa413e | ||
|
|
76aae8ce42 | ||
|
|
ad0c287053 | ||
|
|
4a11a3559d | ||
|
|
1faa5a80e4 | ||
|
|
f1d3df1ec0 | ||
|
|
e7c94d3351 | ||
|
|
954f76dcf5 | ||
|
|
43037c0ff9 | ||
|
|
93df901b71 | ||
|
|
e97e645eda | ||
|
|
4a03ba3874 | ||
|
|
7f637e4acc | ||
|
|
8f3eeefafd | ||
|
|
5dc550a0ce | ||
|
|
6fe322da27 | ||
|
|
3cfe7c9a56 | ||
|
|
be7d5917cb | ||
|
|
ca28aa6ebd | ||
|
|
e76360c1b5 | ||
|
|
265ca8ba67 | ||
|
|
b0d942d0ec | ||
|
|
6c25905ae4 | ||
|
|
80a39393fe | ||
|
|
d4aed71abf | ||
|
|
ebb72bb992 | ||
|
|
8ffcd30b4d | ||
|
|
06804c37e2 | ||
|
|
1acca0278c | ||
|
|
639c8d4171 | ||
|
|
d77c9d3fca | ||
|
|
2c7cc2c191 | ||
|
|
d7c74b8004 | ||
|
|
aaa8003418 | ||
|
|
86890b13c6 | ||
|
|
39158b0eb6 | ||
|
|
87f1d55bc2 | ||
|
|
14343b5410 | ||
|
|
ffdac30b3c | ||
|
|
244c8dc391 | ||
|
|
e593344461 | ||
|
|
74c46f6e93 | ||
|
|
bbfd8aa249 | ||
|
|
2705a488ad | ||
|
|
850c253e08 | ||
|
|
80e0e3fcd7 | ||
|
|
2cc2d696f1 | ||
|
|
8a83a6b5be | ||
|
|
002d5338a0 | ||
|
|
743aa472f0 | ||
|
|
ba85d5d351 | ||
|
|
4e2ef908dc | ||
|
|
f5dd05ba8e | ||
|
|
17eda2a4cc | ||
|
|
d219c6e019 | ||
|
|
2dc539747b | ||
|
|
e941de50e8 | ||
|
|
63052257a2 | ||
|
|
ac5d2a714e | ||
|
|
59f78c16b1 | ||
|
|
3f7f8133df | ||
|
|
fef5e1ce2c | ||
|
|
0b97b3864f | ||
|
|
3d1330c85d | ||
|
|
041c0cc322 | ||
|
|
e72712640c | ||
|
|
6830195127 | ||
|
|
f9b5d6644d | ||
|
|
40f9eeda36 | ||
|
|
0fa0b0b1ea | ||
|
|
ff0b23f200 | ||
|
|
5456d4081b | ||
|
|
8948fae780 | ||
|
|
ee4542a699 | ||
|
|
31e4e631f9 | ||
|
|
cbf20b3271 | ||
|
|
a65fd50723 | ||
|
|
63a6aac2d8 | ||
|
|
afde4804c9 | ||
|
|
bc8ec9cd3e | ||
|
|
b63ab18e29 | ||
|
|
e7325f58c3 | ||
|
|
7b35bb8c96 | ||
|
|
e84671ce5d | ||
|
|
b01d50fe05 | ||
|
|
3f163051b1 | ||
|
|
4f1d03e1d4 | ||
|
|
fc39e4a225 | ||
|
|
bf88ad7fc8 | ||
|
|
11ba02067e | ||
|
|
952afa05ce | ||
|
|
3131cc3160 | ||
|
|
792f768479 | ||
|
|
ff312a15dd | ||
|
|
36207c9a98 | ||
|
|
b92105e888 | ||
|
|
35bd7c55d0 | ||
|
|
9f19c302d8 | ||
|
|
87b1ac776f | ||
|
|
41e401b05e | ||
|
|
d88da3589d | ||
|
|
9638c393bb | ||
|
|
9961ddc2a8 | ||
|
|
2d40dfd8d4 | ||
|
|
99c9bdf71d | ||
|
|
4fcd25ec88 | ||
|
|
440218da67 | ||
|
|
fefdb9fc8d | ||
|
|
21a0eff593 | ||
|
|
8825a094ae | ||
|
|
aa49ce5c56 | ||
|
|
1522d3385d | ||
|
|
510c41440a | ||
|
|
aa0c34ba1c | ||
|
|
af87e6ef62 | ||
|
|
30291ce6e6 | ||
|
|
890c2eb564 | ||
|
|
67a269b89c | ||
|
|
4b9ee81a78 | ||
|
|
4343f4d229 | ||
|
|
2162baa6c0 | ||
|
|
7e7f792710 | ||
|
|
1bbd9e24b0 | ||
|
|
6435aaa64f | ||
|
|
999aae0a33 | ||
|
|
ba795639b4 | ||
|
|
4c4b205721 | ||
|
|
b3c550b7c0 | ||
|
|
eb8953e784 | ||
|
|
b88b292d5d | ||
|
|
5f42c3b319 | ||
|
|
5b27ae0371 | ||
|
|
f26b1da1b5 | ||
|
|
7a853e2dcb | ||
|
|
9b22748bd0 | ||
|
|
c1e9dd3373 | ||
|
|
8cbbc47043 | ||
|
|
81b3567133 | ||
|
|
fc6568f390 | ||
|
|
8e30fe2946 | ||
|
|
6c811a3261 | ||
|
|
afbe5aa540 | ||
|
|
324afd2d6c | ||
|
|
58d94ef61e | ||
|
|
39974b0982 | ||
|
|
323d7306e2 | ||
|
|
251e228ce4 | ||
|
|
a99f3f217a | ||
|
|
e2acbee113 | ||
|
|
37b69eddf2 | ||
|
|
f0322e6f2c | ||
|
|
756587d080 | ||
|
|
1ad2c92324 | ||
|
|
e5433adf78 | ||
|
|
ed765f75d8 | ||
|
|
4136f1b377 | ||
|
|
860339b90e | ||
|
|
03254a0c0f | ||
|
|
a76081c979 | ||
|
|
71a207079f | ||
|
|
f6e724c4c5 | ||
|
|
4251b36b25 | ||
|
|
b8f39cbfdf | ||
|
|
088c621862 | ||
|
|
2459a53350 | ||
|
|
7093e9c0d4 | ||
|
|
4bc49978d1 | ||
|
|
96bac9c149 | ||
|
|
8dcc15f4d3 | ||
|
|
8183740c04 | ||
|
|
25e4231d7b | ||
|
|
3ed9e0e905 | ||
|
|
45bec0c440 | ||
|
|
5133e39d45 | ||
|
|
cb3b4e446e | ||
|
|
9829a2f3b4 | ||
|
|
7eadf11145 | ||
|
|
2a2bc44f43 | ||
|
|
9ccfa5cec9 | ||
|
|
02687f3c78 | ||
|
|
7ea7a6cbb1 | ||
|
|
a15a28fe5b | ||
|
|
265dedfae1 | ||
|
|
5ddbb8bc56 | ||
|
|
4101b8e937 | ||
|
|
56b6d50479 | ||
|
|
506f585d78 | ||
|
|
577dfb7220 | ||
|
|
7e4286adde | ||
|
|
1090228628 | ||
|
|
aeea861b73 | ||
|
|
997c43bbdd | ||
|
|
958d4dbd2e | ||
|
|
f2b350eb62 | ||
|
|
a3464780a1 | ||
|
|
fe1eb92196 | ||
|
|
0b2d26ec92 | ||
|
|
8024a25f2b | ||
|
|
d287ecbb34 | ||
|
|
d9c95e7730 | ||
|
|
c3b1af31ce | ||
|
|
465576b5cb | ||
|
|
9ecbcd0075 | ||
|
|
c1f62d72ae | ||
|
|
1b27834c41 | ||
|
|
77804907b6 | ||
|
|
9dfa2609be | ||
|
|
8ffb3ab3c4 | ||
|
|
65e1da34fa | ||
|
|
282110807c | ||
|
|
25e5f43d1c | ||
|
|
ce0441694d | ||
|
|
db29699927 | ||
|
|
9a4e2d7617 | ||
|
|
fbf64585b7 | ||
|
|
6d1c6dfd16 | ||
|
|
e78df4d981 | ||
|
|
a757b4d5dc | ||
|
|
d28036ee91 | ||
|
|
d2ba0d4e7a | ||
|
|
5787436177 | ||
|
|
f5ab24b8d2 | ||
|
|
05c0f32a24 | ||
|
|
7b918f77a9 | ||
|
|
d87929d61c | ||
|
|
a926829c33 | ||
|
|
d58e366c40 | ||
|
|
0fb4f7e1c4 | ||
|
|
6ee606e3e2 | ||
|
|
22d4a7690f | ||
|
|
f3a2f5018a | ||
|
|
d2a7589f7c | ||
|
|
f87b4e04f1 | ||
|
|
b5aa4c1f0c | ||
|
|
0c1eb6d288 | ||
|
|
8a03c5f998 | ||
|
|
60aa50ae45 | ||
|
|
aae6bbbb66 | ||
|
|
5ca903c428 | ||
|
|
e86b07f760 | ||
|
|
d7fea5dc78 | ||
|
|
c1eff5aebb | ||
|
|
f2dc490d6f | ||
|
|
b296e1b340 | ||
|
|
8adb060edb | ||
|
|
c3b984fea7 | ||
|
|
afbb2c338b | ||
|
|
6632241ab5 | ||
|
|
be50df81db | ||
|
|
9763b6e2cf | ||
|
|
812b848daf | ||
|
|
4907a7389f | ||
|
|
17dff36b65 | ||
|
|
904921d8c4 | ||
|
|
ac4c075d32 | ||
|
|
ddde64ece9 | ||
|
|
91c097e88d | ||
|
|
894658a3f5 | ||
|
|
a4454ea5f9 | ||
|
|
8ea8fa3a8a | ||
|
|
7480603295 | ||
|
|
079b749d5d | ||
|
|
4815600e85 | ||
|
|
1c63e2d295 | ||
|
|
cf13eca58c | ||
|
|
3cf4607870 | ||
|
|
23c3ba6ad7 | ||
|
|
17fc3c2317 | ||
|
|
af234cbe54 | ||
|
|
c8517c0ec9 | ||
|
|
20b226454b | ||
|
|
98eccf223a | ||
|
|
0fc2ab4d41 | ||
|
|
641b6efe7f | ||
|
|
4c83435b4b | ||
|
|
9f7319cff4 | ||
|
|
dd9baa1502 | ||
|
|
41b4d0daa1 | ||
|
|
e41b181163 | ||
|
|
288ac115d0 | ||
|
|
6774d46a6f | ||
|
|
607abf89f7 | ||
|
|
27f1e5e2f2 | ||
|
|
a457675ce1 | ||
|
|
82049096e6 | ||
|
|
6c965e0223 | ||
|
|
8b4d952929 | ||
|
|
873cc63f94 | ||
|
|
39fc839ff2 | ||
|
|
4edef4c959 | ||
|
|
1d9ced8037 | ||
|
|
4cb77d1429 | ||
|
|
b52d9d1bdd | ||
|
|
5fe7ca5e70 | ||
|
|
62fb440de2 | ||
|
|
96fbd7c7ba | ||
|
|
c9bec8e636 | ||
|
|
769e03e7f2 | ||
|
|
ab83f2d5e2 | ||
|
|
b60d0cdb17 | ||
|
|
677503dbf1 | ||
|
|
25efa29470 | ||
|
|
21a90f8f8f | ||
|
|
64e8d6ae99 | ||
|
|
16a204335e | ||
|
|
0a53f762fe | ||
|
|
6ba4778c1b | ||
|
|
0404c2266c | ||
|
|
e5e914282f | ||
|
|
9867d4bdc3 | ||
|
|
e4cb7112cf | ||
|
|
2d202e90b7 | ||
|
|
016391e442 | ||
|
|
1eff48a429 | ||
|
|
ce33af6bb5 | ||
|
|
fb9d4303f1 | ||
|
|
4e631c9e8f | ||
|
|
766d67d80d | ||
|
|
e2c2a37221 | ||
|
|
2b23020695 | ||
|
|
8d43c6b1a8 | ||
|
|
7362dd1a7c | ||
|
|
316caf7e8c | ||
|
|
87dc6631ee | ||
|
|
62246d7d43 | ||
|
|
a14be3a42c | ||
|
|
7fdf00d5e9 | ||
|
|
99e02f30fb | ||
|
|
716a5b9b5a | ||
|
|
87f880ca52 | ||
|
|
8ec7b84a78 | ||
|
|
05cf5bc8db | ||
|
|
ac25e21a0c | ||
|
|
cc1e0daaa4 | ||
|
|
f4120a9c8c | ||
|
|
e3b80a5e09 | ||
|
|
ef7cb26b01 | ||
|
|
408a5c168f | ||
|
|
0ad6ac95b2 | ||
|
|
bda4747e9c | ||
|
|
bd8f882c94 | ||
|
|
32b5b5b1c4 | ||
|
|
c1e543c9fe | ||
|
|
3908fa5c57 | ||
|
|
1b347fc185 | ||
|
|
282a5e0b01 | ||
|
|
e9d23cc1ea | ||
|
|
34173fd60f | ||
|
|
d0d3c8ef57 | ||
|
|
11912008dd | ||
|
|
c122007e17 | ||
|
|
69dfa1a175 | ||
|
|
bfea443e55 | ||
|
|
680798c28f | ||
|
|
9f0cc45c45 | ||
|
|
0ac97f467f | ||
|
|
647746ea72 | ||
|
|
7bea30b2e6 | ||
|
|
12bc852c89 | ||
|
|
0d42e84045 | ||
|
|
897b85b607 | ||
|
|
5c55cf0efb | ||
|
|
eccd6463f6 | ||
|
|
4a0897c734 | ||
|
|
c86a16df7f | ||
|
|
2ae0e9d902 | ||
|
|
bba18cd56b | ||
|
|
2f20781e16 | ||
|
|
3bee212876 | ||
|
|
6c8893a550 | ||
|
|
9c52ecc19b | ||
|
|
692c884ca2 | ||
|
|
3ef51d7fae | ||
|
|
73d95de122 | ||
|
|
04a568ac9b | ||
|
|
a45499cf04 | ||
|
|
b847d672ab | ||
|
|
3ffefdf6b5 | ||
|
|
cca4c4be80 | ||
|
|
cb9e044cb3 | ||
|
|
fd25dd83bd | ||
|
|
584bb00cfc | ||
|
|
5b9369d344 | ||
|
|
a64506a0de | ||
|
|
2fc83ef80b | ||
|
|
8bee3ebd65 | ||
|
|
99686fdd73 | ||
|
|
33bc3d6a1e | ||
|
|
90597530a4 | ||
|
|
b2af8da9a2 | ||
|
|
05dbf41fdc | ||
|
|
c56bb56708 | ||
|
|
4def1ea1dc | ||
|
|
0ba05e4de0 | ||
|
|
24fce89155 | ||
|
|
1a3c20f91d | ||
|
|
fe3e78cc1c | ||
|
|
749f49b1a0 | ||
|
|
f14010a09d | ||
|
|
0b48b9c7d4 | ||
|
|
13d62b01d1 | ||
|
|
4e7b71db1d | ||
|
|
069fc1f97b | ||
|
|
8684f75254 | ||
|
|
11cd924ce1 | ||
|
|
e2fd0cfc4e | ||
|
|
5eb3106706 | ||
|
|
1831efbe9d | ||
|
|
38edbadca5 | ||
|
|
6fcd80b979 | ||
|
|
cf5e5dbe55 | ||
|
|
a451861bf1 | ||
|
|
7313dd74a6 | ||
|
|
32b9de05f2 | ||
|
|
c79bed22f8 | ||
|
|
cdeb50132d | ||
|
|
090fb09955 | ||
|
|
54b862bd79 | ||
|
|
e37e1c109a | ||
|
|
939123785b | ||
|
|
221b347bd9 | ||
|
|
af9bf3e852 | ||
|
|
ed8746df77 | ||
|
|
bb187db49d | ||
|
|
081e72b3ea | ||
|
|
6188c38053 | ||
|
|
12b0186f5a | ||
|
|
9bccc9c53c | ||
|
|
351b2b320e | ||
|
|
94258feb09 | ||
|
|
8b0f033a78 | ||
|
|
f58f255fc8 | ||
|
|
e3eabcf648 | ||
|
|
9aa506cbd7 | ||
|
|
d8cff7b90f | ||
|
|
07e7bca9eb | ||
|
|
e1f442be90 | ||
|
|
c5d579e0e3 | ||
|
|
5271c2e08f | ||
|
|
9010a7ddbc | ||
|
|
bb95fb7d07 | ||
|
|
2edb11376d | ||
|
|
e7f5ebf912 | ||
|
|
da9758c2f3 | ||
|
|
3e11d58d73 | ||
|
|
6b35c097d6 | ||
|
|
619ba13265 | ||
|
|
529c5b8abf | ||
|
|
3a5ed6e800 | ||
|
|
52cddc015b | ||
|
|
4a01f4f65f | ||
|
|
f9768cb5a3 | ||
|
|
221e0e550c | ||
|
|
d2d1d42d0f | ||
|
|
faf018a097 | ||
|
|
a2a71a107e | ||
|
|
fc9c937e67 | ||
|
|
b4f2e9b442 | ||
|
|
1672645e73 | ||
|
|
4a42c44101 | ||
|
|
383b1a5769 | ||
|
|
77bac4cf9e | ||
|
|
e2b8e530c9 | ||
|
|
e9f752bd67 | ||
|
|
4b31921eb4 | ||
|
|
3df9fc6225 | ||
|
|
b57fe466ce | ||
|
|
bd4bff3b6b | ||
|
|
9d4618a223 | ||
|
|
93636180df | ||
|
|
fcceaa168f | ||
|
|
2639cc6138 | ||
|
|
4a99c2e928 | ||
|
|
7d5af3df05 | ||
|
|
c88b80d2a0 | ||
|
|
819d4abaa2 | ||
|
|
20630aeb47 | ||
|
|
0c0db3babb | ||
|
|
e7761f7e57 | ||
|
|
064fd497ae | ||
|
|
49c60b6b75 | ||
|
|
ca7f36506c | ||
|
|
155f0a9736 | ||
|
|
25e1eb3ce9 | ||
|
|
f2f980928b | ||
|
|
1d121a97a7 | ||
|
|
211d13da09 | ||
|
|
11343d469e | ||
|
|
d7c8041aa1 | ||
|
|
9587e30af8 | ||
|
|
76fa7affaf | ||
|
|
2971dd8672 | ||
|
|
2a33fe3564 | ||
|
|
46cdf5da70 | ||
|
|
28c801bfd4 | ||
|
|
c22cd40293 | ||
|
|
56bd430983 | ||
|
|
d873890e46 | ||
|
|
d29b8eca3c | ||
|
|
6f258000fe | ||
|
|
255211cd07 | ||
|
|
f6d28a90e3 | ||
|
|
ed66ff88a1 | ||
|
|
82e58f2bf9 | ||
|
|
797a87ca26 | ||
|
|
ec6a709393 | ||
|
|
07cbfdb424 | ||
|
|
3b9bd944fb | ||
|
|
934e585cb3 | ||
|
|
3a68f4cf54 | ||
|
|
bd00fcb875 | ||
|
|
905dd5a70f | ||
|
|
c65250ec39 | ||
|
|
607eec6ff0 | ||
|
|
14fb3bde60 | ||
|
|
6782bc8ca2 | ||
|
|
3db6841305 | ||
|
|
f478fa8029 | ||
|
|
d255f8400f | ||
|
|
a1545c60d6 | ||
|
|
ed48603ab5 | ||
|
|
23a0507439 | ||
|
|
482e013887 | ||
|
|
265727c30f | ||
|
|
4d3f4e096b | ||
|
|
7629bca62d | ||
|
|
2712f17262 | ||
|
|
86a37559ba | ||
|
|
b504a557f4 | ||
|
|
e849b46f6b | ||
|
|
738dc50a6f | ||
|
|
3138523b5b | ||
|
|
537643a4c3 | ||
|
|
04bfe098ed | ||
|
|
c507887bdd | ||
|
|
ee261313ac | ||
|
|
c9c152bc8a | ||
|
|
6c8e19a321 | ||
|
|
218e3b66f2 | ||
|
|
1d3488fa8e | ||
|
|
f4c1682592 | ||
|
|
28ac6623c7 | ||
|
|
16ab179e1d | ||
|
|
a8ff5385dc | ||
|
|
9dc33c6086 | ||
|
|
b17c576705 | ||
|
|
96f8f2891b | ||
|
|
581d73afe0 | ||
|
|
1baefebe8f | ||
|
|
39fb05033f | ||
|
|
c6093c084c | ||
|
|
dfec6d9a6d | ||
|
|
08b1261c75 | ||
|
|
2ad6faae3a | ||
|
|
4eff301db3 | ||
|
|
447e43e8f4 | ||
|
|
7457001275 | ||
|
|
fcabd5e79e | ||
|
|
594002316c | ||
|
|
eccf92ebaf | ||
|
|
ad9ddc5621 | ||
|
|
1825dd916e | ||
|
|
dfcde8171e | ||
|
|
b0361183df | ||
|
|
71fe13b249 | ||
|
|
442f51224d | ||
|
|
974678f500 | ||
|
|
8329409c03 | ||
|
|
06c2ac2724 | ||
|
|
04e9e8f9d8 | ||
|
|
7a3330cb8c | ||
|
|
cae29941ea | ||
|
|
15cf2ad076 | ||
|
|
2f16f6dc23 | ||
|
|
528aebffe4 | ||
|
|
e82b2f0cbe | ||
|
|
73e64f3e4a | ||
|
|
15f5b1f830 | ||
|
|
1b0a77f9a8 | ||
|
|
0f82ae3644 | ||
|
|
de3b01b54b | ||
|
|
c17e3646d5 | ||
|
|
26aed3e89e | ||
|
|
74caea8f8f | ||
|
|
2cf07fa072 | ||
|
|
1181cd2fd7 | ||
|
|
850d55ab45 | ||
|
|
a0c91b8754 | ||
|
|
937bdc05c8 | ||
|
|
453755bfa1 | ||
|
|
400b6fbb61 | ||
|
|
8c4e882fa3 | ||
|
|
84eec23793 | ||
|
|
7dfe69f6a5 | ||
|
|
ada6115073 | ||
|
|
e1643566f9 | ||
|
|
053a9a6317 | ||
|
|
425b976cc0 | ||
|
|
5f5f1b1e09 | ||
|
|
e6f4935c7b | ||
|
|
6452e5976b | ||
|
|
2383dff317 | ||
|
|
de3e5042fb | ||
|
|
0dcc35152c | ||
|
|
8eecfcbfaf | ||
|
|
efa3e60f89 | ||
|
|
782df659bc | ||
|
|
0aa158824f | ||
|
|
da7fb44e5d | ||
|
|
4b59ef802e | ||
|
|
be5789cd56 | ||
|
|
9adf0e5d59 | ||
|
|
e2de22470e | ||
|
|
3b7ab2e553 | ||
|
|
8617dedc46 | ||
|
|
0b8f1a9a58 | ||
|
|
16748c0920 | ||
|
|
01ec585a44 | ||
|
|
b5f2295f37 | ||
|
|
d6ca0199b7 | ||
|
|
2257c5e547 | ||
|
|
b5a3d39799 | ||
|
|
a26c3e9d3c | ||
|
|
98a09532eb | ||
|
|
d736789bbc | ||
|
|
82a6cfc03a | ||
|
|
62e9c7c75a | ||
|
|
eb32bd45e7 | ||
|
|
4b95f07923 | ||
|
|
dea8ad4c49 | ||
|
|
96553b217c | ||
|
|
3f79ed5d91 | ||
|
|
1e4283aad3 | ||
|
|
1dda31a28c | ||
|
|
10c87012be | ||
|
|
bda00bf512 | ||
|
|
c8f871ff2a | ||
|
|
58dc0b1aef | ||
|
|
4cd4d8f31a | ||
|
|
b751fd738d | ||
|
|
f97c6fb94c | ||
|
|
219138ade6 | ||
|
|
9086d189b9 | ||
|
|
d1178defe0 | ||
|
|
691a561a95 | ||
|
|
aaaac93bd0 | ||
|
|
fd790566b2 | ||
|
|
db3b429784 | ||
|
|
40ed3278d4 | ||
|
|
d174b13111 | ||
|
|
1708663b32 | ||
|
|
6fdce4ad0d | ||
|
|
fff8d5f07d | ||
|
|
9c8e1f4706 | ||
|
|
0a1036c78f | ||
|
|
0e881a7972 | ||
|
|
839e52ba30 | ||
|
|
8f7d5dcb4d | ||
|
|
1104b28bc1 | ||
|
|
48521cb1e4 | ||
|
|
17e113dafb | ||
|
|
c33825a904 | ||
|
|
b07ef98c8f | ||
|
|
b3d68893df | ||
|
|
1329599987 | ||
|
|
2adf3f364c | ||
|
|
436ee34a02 | ||
|
|
4a6e17b214 | ||
|
|
6e9cbccde6 | ||
|
|
a0cb8ec124 | ||
|
|
21217dfda3 | ||
|
|
25ba18e570 | ||
|
|
a210377f35 | ||
|
|
07b9ca457f | ||
|
|
5f1372d39c | ||
|
|
01b84c79f0 | ||
|
|
4017443b1e | ||
|
|
fd2a17d244 | ||
|
|
126804f7c3 | ||
|
|
5167bbf59e | ||
|
|
8bcdfa2793 | ||
|
|
2f9cb6a91e | ||
|
|
662be14535 | ||
|
|
d6d065cd61 | ||
|
|
ac7f045708 | ||
|
|
ffe02ad7bf | ||
|
|
db1a87d10c | ||
|
|
4bae41ffd8 | ||
|
|
be36fb979f | ||
|
|
0f66d763e0 | ||
|
|
06f4743f51 | ||
|
|
9cc11b8774 | ||
|
|
de821e55ae | ||
|
|
463b5c6e49 | ||
|
|
65ab5fdb34 | ||
|
|
d2f7a035b3 | ||
|
|
bc0b924283 | ||
|
|
56ad6af5b2 | ||
|
|
c50bb3a5a9 | ||
|
|
d993a62263 | ||
|
|
82bc52b909 | ||
|
|
f31598f916 | ||
|
|
6a9efd8ac6 | ||
|
|
a9dddb6066 | ||
|
|
40cf5c99ef | ||
|
|
42f58cbbb3 | ||
|
|
fd9c780015 | ||
|
|
383b92b207 | ||
|
|
7036ed5e2f | ||
|
|
30666aa111 | ||
|
|
9614d68baa | ||
|
|
c25fb4c743 | ||
|
|
09d5222b1f | ||
|
|
426ca78bf7 | ||
|
|
a77a0945fe | ||
|
|
5311a0f903 | ||
|
|
d421656be8 | ||
|
|
04459eaa50 | ||
|
|
3beda8eea0 | ||
|
|
5e894be06b | ||
|
|
bc8f93b596 | ||
|
|
2fb93bac99 | ||
|
|
d0c94c1aef | ||
|
|
77242bfb95 | ||
|
|
5d2d86bffc | ||
|
|
8492c13e72 | ||
|
|
e4eb5dadda | ||
|
|
8532dc4b75 | ||
|
|
1ca26ce676 | ||
|
|
d8e3e823a7 | ||
|
|
473dd7660b | ||
|
|
5afeed56ef | ||
|
|
b91b04f652 | ||
|
|
25de44a23d | ||
|
|
00cfb95971 | ||
|
|
f4ba0e1191 | ||
|
|
6499643769 | ||
|
|
f85287a444 | ||
|
|
483bc9ad87 | ||
|
|
93b89a93c1 | ||
|
|
10064c046c | ||
|
|
a5aecb9d0e | ||
|
|
de1e889f1d | ||
|
|
16f89b40c3 | ||
|
|
0e387d2cda | ||
|
|
837c15e4f9 | ||
|
|
ae7e353169 | ||
|
|
6c1bbd2344 | ||
|
|
27247e8e56 | ||
|
|
08249d78ea | ||
|
|
827091e522 | ||
|
|
13d901bf8d | ||
|
|
e69bdabc99 | ||
|
|
e8d19265e4 | ||
|
|
49e3a49dc5 | ||
|
|
82a7c01898 | ||
|
|
c0d7dbf639 | ||
|
|
569caa0bf2 | ||
|
|
f88ea1ee7d | ||
|
|
d5a8fa0b97 | ||
|
|
3f8f96edea | ||
|
|
04fb4aff28 | ||
|
|
83c6fb089e | ||
|
|
9d8d17b964 | ||
|
|
39d4842ff5 | ||
|
|
cad8473986 | ||
|
|
5f085ccb52 | ||
|
|
b406246689 | ||
|
|
cbe46afdff | ||
|
|
a59d6dc3c7 | ||
|
|
2afb2dd5fd | ||
|
|
4fc3c969d3 | ||
|
|
1796ce324b | ||
|
|
5e04c7f827 | ||
|
|
20fcede440 | ||
|
|
012c1833f2 | ||
|
|
32e8e03256 | ||
|
|
dca653cb92 | ||
|
|
0805eca979 | ||
|
|
17935a78ff | ||
|
|
e16918ee32 | ||
|
|
78471b4595 | ||
|
|
c30bcdd515 | ||
|
|
ac78c5f4e5 | ||
|
|
57a990ce25 | ||
|
|
24825b42a2 | ||
|
|
4f7323f7fc | ||
|
|
a228be85e2 | ||
|
|
fa565bdbdf | ||
|
|
2dc53223e5 | ||
|
|
958ac72805 | ||
|
|
f7297b84e7 | ||
|
|
9a7d9e7bb8 | ||
|
|
fa9df75cf7 | ||
|
|
e3ec76418b | ||
|
|
102d6d8c84 | ||
|
|
a742b5f3e2 | ||
|
|
a2a3bb291f | ||
|
|
b7c0ac7d67 | ||
|
|
13b1fc6b44 | ||
|
|
3939fcf6e7 | ||
|
|
13abbb81af | ||
|
|
019f0153c8 | ||
|
|
8abc2925e0 | ||
|
|
996c9a032a | ||
|
|
22d3794d22 | ||
|
|
ba948a38e9 | ||
|
|
e8a522c4df | ||
|
|
c60f3da32e | ||
|
|
0c92d3cbb2 | ||
|
|
e4fc8dd6fe | ||
|
|
1a849e2de0 | ||
|
|
ffdd79f86b | ||
|
|
e87e46b1b6 | ||
|
|
3ca81a4ff7 | ||
|
|
5477d3c292 | ||
|
|
08300183b3 | ||
|
|
095c77f22c | ||
|
|
09926e63a3 | ||
|
|
87d70f29a1 | ||
|
|
3a7661b111 | ||
|
|
ec976953cd | ||
|
|
1837562b50 | ||
|
|
f3bec4fc37 | ||
|
|
c2117ef4fd | ||
|
|
910804ecd1 | ||
|
|
ce5ae1dfdd | ||
|
|
2c31411ffb | ||
|
|
84d69fa2a1 | ||
|
|
2aea296d19 | ||
|
|
2b0bffc362 | ||
|
|
83356142c1 | ||
|
|
24dcc6947c | ||
|
|
a7e3136a0b | ||
|
|
71639cfea7 | ||
|
|
8c2d39fb82 | ||
|
|
e060d29337 | ||
|
|
79e9156d2f | ||
|
|
9100db55b0 | ||
|
|
141c10f6fe | ||
|
|
4613ab9dc3 | ||
|
|
061ad41b51 | ||
|
|
3a0007cd18 | ||
|
|
0044917943 | ||
|
|
0337c04278 | ||
|
|
4585acf70b | ||
|
|
2ad9bbae25 | ||
|
|
cf075df7d1 | ||
|
|
11cd9905c4 | ||
|
|
cf462542e9 | ||
|
|
b63f25a1ae | ||
|
|
7de69a21c5 | ||
|
|
21783e4ea0 | ||
|
|
53e5a756d7 | ||
|
|
8c911a2fd0 | ||
|
|
ce440e9f43 | ||
|
|
6465f8d8e6 | ||
|
|
4bdf28059a | ||
|
|
21010c6540 | ||
|
|
a5a6cabac6 | ||
|
|
f460c77f2c | ||
|
|
1c69d9213e | ||
|
|
c02c2d3b2c | ||
|
|
7adf5e763b | ||
|
|
0e4afefc7f | ||
|
|
c7f290f42e | ||
|
|
bb553b8a6a | ||
|
|
21eda2a1a3 | ||
|
|
48c13c990f | ||
|
|
a2665529f6 | ||
|
|
8d35d78eff |
12
.editorconfig
Normal file
12
.editorconfig
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# This file is for unifying the coding style for different editors and IDEs
|
||||||
|
# editorconfig.org
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
indent_size = 2
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
* text=auto
|
||||||
67
.github/CONTRIBUTING.md
vendored
Normal file
67
.github/CONTRIBUTING.md
vendored
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
# Contributing to Lodash
|
||||||
|
|
||||||
|
Contributions are always welcome. Before contributing please read the
|
||||||
|
[code of conduct](https://github.com/lodash/lodash/blob/master/CODE_OF_CONDUCT.md)
|
||||||
|
& [search the issue tracker](https://github.com/lodash/lodash/issues); your issue
|
||||||
|
may have already been discussed or fixed in `master`. To contribute,
|
||||||
|
[fork](https://help.github.com/articles/fork-a-repo/) Lodash, commit your changes,
|
||||||
|
& [send a pull request](https://help.github.com/articles/using-pull-requests/).
|
||||||
|
|
||||||
|
## Feature Requests
|
||||||
|
|
||||||
|
Feature requests are always welcome. They should be submitted in the
|
||||||
|
[issue tracker](https://github.com/lodash/lodash/issues), with a description of
|
||||||
|
the expected behavior & use case, where they’ll remain closed until sufficient
|
||||||
|
interest has been shown by the community. Before submitting a request,
|
||||||
|
please search for similar ones in the
|
||||||
|
[closed issues](https://github.com/lodash/lodash/issues?q=is%3Aissue+is%3Aclosed+label%3Aenhancement).
|
||||||
|
|
||||||
|
## Pull Requests
|
||||||
|
|
||||||
|
For additions or bug fixes you should only need to modify `lodash.js`. Include
|
||||||
|
updated unit tests in the `test` directory as part of your pull request. Don’t
|
||||||
|
worry about regenerating the `dist/` or `doc/` files.
|
||||||
|
|
||||||
|
Before running the unit tests you’ll need to install, `npm i`,
|
||||||
|
[development dependencies](https://docs.npmjs.com/files/package.json#devdependencies).
|
||||||
|
Run unit tests from the command-line via `npm test`, or open `test/index.html` &
|
||||||
|
`test/fp.html` in a web browser. The [Backbone](http://backbonejs.org/) &
|
||||||
|
[Underscore](http://underscorejs.org/) test suites are included as well.
|
||||||
|
|
||||||
|
## Contributor License Agreement
|
||||||
|
|
||||||
|
Lodash is a member of the [Dojo Foundation](http://dojofoundation.org/).
|
||||||
|
As such, we request that all contributors sign the Dojo Foundation
|
||||||
|
[contributor license agreement (CLA)](http://dojofoundation.org/about/claForm).
|
||||||
|
|
||||||
|
For more information about CLAs, please check out Alex Russell’s excellent post,
|
||||||
|
[“Why Do I Need to Sign This?”](http://infrequently.org/2008/06/why-do-i-need-to-sign-this/).
|
||||||
|
|
||||||
|
## Coding Guidelines
|
||||||
|
|
||||||
|
In addition to the following guidelines, please follow the conventions already
|
||||||
|
established in the code.
|
||||||
|
|
||||||
|
- **Spacing**:<br>
|
||||||
|
Use two spaces for indentation. No tabs.
|
||||||
|
|
||||||
|
- **Naming**:<br>
|
||||||
|
Keep variable & method names concise & descriptive.<br>
|
||||||
|
Variable names `index`, `collection`, & `callback` are preferable to
|
||||||
|
`i`, `arr`, & `fn`.
|
||||||
|
|
||||||
|
- **Quotes**:<br>
|
||||||
|
Single-quoted strings are preferred to double-quoted strings; however,
|
||||||
|
please use a double-quoted string if the value contains a single-quote
|
||||||
|
character to avoid unnecessary escaping.
|
||||||
|
|
||||||
|
- **Comments**:<br>
|
||||||
|
Please use single-line comments to annotate significant additions, &
|
||||||
|
[JSDoc-style](http://www.2ality.com/2011/08/jsdoc-intro.html) comments for
|
||||||
|
functions.
|
||||||
|
|
||||||
|
Guidelines are enforced using [JSCS](https://www.npmjs.com/package/jscs):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ npm run style
|
||||||
|
```
|
||||||
9
.gitignore
vendored
9
.gitignore
vendored
@@ -1,4 +1,7 @@
|
|||||||
*.custom.*
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
dist/
|
*.custom.*
|
||||||
node_modules/
|
*.log
|
||||||
|
*.map
|
||||||
|
lodash.compat.min.js
|
||||||
|
coverage
|
||||||
|
node_modules
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
*.custom.*
|
|
||||||
.*
|
|
||||||
dist/
|
|
||||||
doc/*.php
|
|
||||||
node_modules/
|
|
||||||
perf/*.sh
|
|
||||||
test/*.sh
|
|
||||||
96
.jscsrc
Normal file
96
.jscsrc
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
{
|
||||||
|
"maxErrors": "2000",
|
||||||
|
"maximumLineLength": {
|
||||||
|
"value": 180,
|
||||||
|
"allExcept": ["comments", "functionSignature", "regex"]
|
||||||
|
},
|
||||||
|
"requireCurlyBraces": [
|
||||||
|
"if",
|
||||||
|
"else",
|
||||||
|
"for",
|
||||||
|
"while",
|
||||||
|
"do",
|
||||||
|
"try",
|
||||||
|
"catch"
|
||||||
|
],
|
||||||
|
"requireOperatorBeforeLineBreak": [
|
||||||
|
"=",
|
||||||
|
"+",
|
||||||
|
"-",
|
||||||
|
"/",
|
||||||
|
"*",
|
||||||
|
"==",
|
||||||
|
"===",
|
||||||
|
"!=",
|
||||||
|
"!==",
|
||||||
|
">",
|
||||||
|
">=",
|
||||||
|
"<",
|
||||||
|
"<="
|
||||||
|
],
|
||||||
|
"requireSpaceAfterKeywords": [
|
||||||
|
"if",
|
||||||
|
"else",
|
||||||
|
"for",
|
||||||
|
"while",
|
||||||
|
"do",
|
||||||
|
"switch",
|
||||||
|
"return",
|
||||||
|
"try",
|
||||||
|
"catch"
|
||||||
|
],
|
||||||
|
"requireSpaceBeforeBinaryOperators": [
|
||||||
|
"=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=",
|
||||||
|
"&=", "|=", "^=", "+=",
|
||||||
|
|
||||||
|
"+", "-", "*", "/", "%", "<<", ">>", ">>>", "&",
|
||||||
|
"|", "^", "&&", "||", "===", "==", ">=",
|
||||||
|
"<=", "<", ">", "!=", "!=="
|
||||||
|
],
|
||||||
|
"requireSpacesInFunctionExpression": {
|
||||||
|
"beforeOpeningCurlyBrace": true
|
||||||
|
},
|
||||||
|
"requireCamelCaseOrUpperCaseIdentifiers": true,
|
||||||
|
"requireDotNotation": { "allExcept": ["keywords"] },
|
||||||
|
"requireEarlyReturn": true,
|
||||||
|
"requireLineFeedAtFileEnd": true,
|
||||||
|
"requireSemicolons": true,
|
||||||
|
"requireSpaceAfterBinaryOperators": true,
|
||||||
|
"requireSpacesInConditionalExpression": true,
|
||||||
|
"requireSpaceBeforeObjectValues": true,
|
||||||
|
"requireSpaceBeforeBlockStatements": true,
|
||||||
|
"requireSpacesInForStatement": true,
|
||||||
|
|
||||||
|
"validateIndentation": 2,
|
||||||
|
"validateParameterSeparator": ", ",
|
||||||
|
"validateQuoteMarks": { "mark": "'", "escape": true },
|
||||||
|
|
||||||
|
"disallowSpacesInAnonymousFunctionExpression": {
|
||||||
|
"beforeOpeningRoundBrace": true
|
||||||
|
},
|
||||||
|
"disallowSpacesInFunctionDeclaration": {
|
||||||
|
"beforeOpeningRoundBrace": true
|
||||||
|
},
|
||||||
|
"disallowSpacesInFunctionExpression": {
|
||||||
|
"beforeOpeningRoundBrace": true
|
||||||
|
},
|
||||||
|
"disallowKeywords": ["with"],
|
||||||
|
"disallowMixedSpacesAndTabs": true,
|
||||||
|
"disallowMultipleLineBreaks": true,
|
||||||
|
"disallowNewlineBeforeBlockStatements": true,
|
||||||
|
"disallowSpaceAfterObjectKeys": true,
|
||||||
|
"disallowSpaceAfterPrefixUnaryOperators": true,
|
||||||
|
"disallowSpacesInCallExpression": true,
|
||||||
|
"disallowSpacesInsideArrayBrackets": true,
|
||||||
|
"disallowSpacesInsideParentheses": true,
|
||||||
|
"disallowTrailingWhitespace": true,
|
||||||
|
|
||||||
|
"jsDoc": {
|
||||||
|
"checkRedundantAccess": true,
|
||||||
|
"checkTypes": true,
|
||||||
|
"requireNewlineAfterDescription": true,
|
||||||
|
"requireParamDescription": true,
|
||||||
|
"requireParamTypes": true,
|
||||||
|
"requireReturnTypes": true
|
||||||
|
}
|
||||||
|
}
|
||||||
16
.npmignore
16
.npmignore
@@ -1,16 +0,0 @@
|
|||||||
*.custom.*
|
|
||||||
.*
|
|
||||||
dist/
|
|
||||||
doc/*.php
|
|
||||||
node_modules/
|
|
||||||
perf/*.html
|
|
||||||
perf/*.sh
|
|
||||||
test/*.html
|
|
||||||
test/*-ui.js
|
|
||||||
test/*.sh
|
|
||||||
vendor/backbone/
|
|
||||||
vendor/docdown/
|
|
||||||
vendor/firebug-lite/
|
|
||||||
vendor/qunit/qunit/*.css
|
|
||||||
vendor/requirejs/
|
|
||||||
vendor/underscore/test/
|
|
||||||
77
.travis.yml
Normal file
77
.travis.yml
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
language: node_js
|
||||||
|
sudo: false
|
||||||
|
node_js:
|
||||||
|
- "5"
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
- BIN="node" ISTANBUL=false OPTION=""
|
||||||
|
- SAUCE_LABS=false SAUCE_USERNAME="lodash"
|
||||||
|
- secure: "tg1JFsIFnxzLaTboFPOnm+aJCuMm5+JdhLlESlqg9x3fwro++7KCnwHKLNovhchaPe4otC43ZMB/nfWhDnDm11dKbm/V6HlTkED+dadTsaLxVDg6J+7yK41QhokBPJOxLV78iDaNaAQVYEirAgZ0yn8kFubxmNKV+bpCGQNc9yU="
|
||||||
|
matrix:
|
||||||
|
-
|
||||||
|
- BIN="phantomjs"
|
||||||
|
- ISTANBUL=true
|
||||||
|
- SAUCE_LABS=true
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- node_js: "0.10"
|
||||||
|
env:
|
||||||
|
- node_js: "0.12"
|
||||||
|
env:
|
||||||
|
- node_js: "4"
|
||||||
|
env:
|
||||||
|
git:
|
||||||
|
depth: 10
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
notifications:
|
||||||
|
webhooks:
|
||||||
|
urls:
|
||||||
|
- https://webhooks.gitter.im/e/4aab6358b0e9aed0b628
|
||||||
|
on_success: change
|
||||||
|
on_failure: always
|
||||||
|
before_install:
|
||||||
|
- "nvm use $TRAVIS_NODE_VERSION"
|
||||||
|
- "npm set loglevel error"
|
||||||
|
- "npm set progress false"
|
||||||
|
- "npm i -g npm@\"^2.0.0\""
|
||||||
|
- |
|
||||||
|
PATTERN[0]="|\s*if\s*\(isHostObject\b[\s\S]+?\}(?=\n)|"
|
||||||
|
PATTERN[1]="|\s*if\s*\(enumerate\b[\s\S]+?\};\s*\}|"
|
||||||
|
PATTERN[2]="|\s*while\s*\([^)]+\)\s*\{\s*iteratee\(index\);\s*\}|"
|
||||||
|
PATTERN[3]="|\s*else\s*\{\s*assocSet\(data\b[\s\S]+?\}|"
|
||||||
|
PATTERN[4]="|\s*if\s*\(ctorString\b[\s\S]+?\}\s*\}|"
|
||||||
|
PATTERN[5]="|\bindex,\s*iterable\)\s*===\s*false\)[^}]+?(break;)|"
|
||||||
|
PATTERN[6]="|\s*if\s*\(!lodashFunc\)\s*\{\s*return;\s*\}|"
|
||||||
|
PATTERN[7]="|\s*define\([\s\S]+?\);|"
|
||||||
|
PATTERN[8]="|\s*root\._\s*=\s*_;|"
|
||||||
|
|
||||||
|
if [ $ISTANBUL == true ]; then
|
||||||
|
set -e
|
||||||
|
for PTRN in ${PATTERN[@]}; do
|
||||||
|
node ./test/remove.js "$PTRN" ./lodash.js
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
- "git clone --depth=10 --branch=master git://github.com/lodash/lodash-cli ./node_modules/lodash-cli && mkdir $_/node_modules && cd $_ && ln -s ../../../ ./lodash && cd ../ && npm i && cd ../../"
|
||||||
|
- "node ./node_modules/lodash-cli/bin/lodash -o ./dist/lodash.js"
|
||||||
|
script:
|
||||||
|
- "[ $ISTANBUL == false ] || istanbul cover -x \"**/vendor/**\" --report lcovonly ./test/test.js -- ./lodash.js"
|
||||||
|
- "[ $ISTANBUL == false ] || [ $TRAVIS_SECURE_ENV_VARS == false ] || (cat ./coverage/lcov.info | coveralls) || true"
|
||||||
|
- "[ $ISTANBUL == false ] || [ $TRAVIS_SECURE_ENV_VARS == false ] || (cat ./coverage/coverage.json | codecov) || true"
|
||||||
|
- "[ $SAUCE_LABS == true ] || [ $ISTANBUL == true ] || cd ./test"
|
||||||
|
- "[ $SAUCE_LABS == true ] || [ $ISTANBUL == true ] || $BIN $OPTION ./test.js ../lodash.js"
|
||||||
|
- "[ $SAUCE_LABS == true ] || [ $ISTANBUL == true ] || [ $TRAVIS_SECURE_ENV_VARS == false ] || $BIN $OPTION ./test.js ../dist/lodash.min.js"
|
||||||
|
- "[ $SAUCE_LABS == false ] || rm -rf ./node_modules/lodash"
|
||||||
|
- "[ $SAUCE_LABS == false ] || ($BIN ./node_modules/lodash-cli/bin/lodash modularize exports=node -o ./node_modules/lodash && node ./node_modules/lodash-cli/bin/lodash -d -o ./node_modules/lodash/lodash.js)"
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./node_modules/lodash-cli/bin/lodash core -o ./dist/lodash.core.js"
|
||||||
|
- "[ $SAUCE_LABS == false ] || npm run build"
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"lodash tests\" runner=\"test/index.html?build=../dist/lodash.js&noglobals=true\" tags=\"development\""
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"lodash tests\" runner=\"test/index.html?build=../dist/lodash.min.js&noglobals=true\" tags=\"production\""
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"lodash-fp tests\" runner=\"test/fp.html?noglobals=true\" tags=\"development\""
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"underscore tests\" runner=\"test/underscore.html?build=../dist/lodash.js\" tags=\"development,underscore\""
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"underscore tests\" runner=\"test/underscore.html?build=../dist/lodash.min.js\" tags=\"production,underscore\""
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"backbone tests\" runner=\"test/backbone.html?build=../dist/lodash.js\" tags=\"development,backbone\""
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"backbone tests\" runner=\"test/backbone.html?build=../dist/lodash.min.js\" tags=\"production,backbone\""
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"backbone tests\" runner=\"test/backbone.html?build=../dist/lodash.core.js\" tags=\"development,backbone\""
|
||||||
|
- "[ $SAUCE_LABS == false ] || $BIN ./test/saucelabs.js name=\"backbone tests\" runner=\"test/backbone.html?build=../dist/lodash.core.min.js\" tags=\"production,backbone\""
|
||||||
49
CODE_OF_CONDUCT.md
Normal file
49
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# Contributor Code of Conduct
|
||||||
|
|
||||||
|
As contributors and maintainers of this project, and in the interest of
|
||||||
|
fostering an open and welcoming community, we pledge to respect all people who
|
||||||
|
contribute through reporting issues, posting feature requests, updating
|
||||||
|
documentation, submitting pull requests or patches, and other activities.
|
||||||
|
|
||||||
|
We are committed to making participation in this project a harassment-free
|
||||||
|
experience for everyone, regardless of level of experience, gender, gender
|
||||||
|
identity and expression, sexual orientation, disability, personal appearance,
|
||||||
|
body size, race, ethnicity, age, religion, or nationality.
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery
|
||||||
|
* Personal attacks
|
||||||
|
* Trolling or insulting/derogatory comments
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing other's private information, such as physical or electronic
|
||||||
|
addresses, without explicit permission
|
||||||
|
* Other unethical or unprofessional conduct
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any contributor for other behaviors that they deem inappropriate,
|
||||||
|
threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
By adopting this Code of Conduct, project maintainers commit themselves to
|
||||||
|
fairly and consistently applying these principles to every aspect of managing
|
||||||
|
this project. Project maintainers who do not follow or enforce the Code of
|
||||||
|
Conduct may be permanently removed from the project team.
|
||||||
|
|
||||||
|
This code of conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community.
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by contacting a project maintainer at
|
||||||
|
[coc@lodash.com](mailto:coc@lodash.com). All complaints will be reviewed and
|
||||||
|
investigated and will result in a response that is deemed necessary and
|
||||||
|
appropriate to the circumstances. Maintainers are obligated to maintain
|
||||||
|
confidentiality with regard to the reporter of an incident.
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||||
|
version 1.3.0, available at
|
||||||
|
[http://contributor-covenant.org/version/1/3/0/][version]
|
||||||
|
|
||||||
|
[homepage]: http://contributor-covenant.org
|
||||||
|
[version]: http://contributor-covenant.org/version/1/3/0/
|
||||||
23
LICENSE
Normal file
23
LICENSE
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>
|
||||||
|
Based on Underscore.js, copyright 2009-2016 Jeremy Ashkenas,
|
||||||
|
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
|
||||||
|
|
||||||
|
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.
|
||||||
22
LICENSE.txt
22
LICENSE.txt
@@ -1,22 +0,0 @@
|
|||||||
Copyright 2012 John-David Dalton <http://allyoucanleet.com/>
|
|
||||||
Based on Underscore.js 1.3.3, copyright 2009-2012 Jeremy Ashkenas,
|
|
||||||
DocumentCloud Inc. <http://documentcloud.github.com/underscore>
|
|
||||||
|
|
||||||
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.
|
|
||||||
337
README.md
337
README.md
@@ -1,313 +1,52 @@
|
|||||||
# Lo-Dash <sup>v0.5.2</sup>
|
# lodash v4.5.1
|
||||||
|
|
||||||
A drop-in replacement<sup>[*](https://github.com/bestiejs/lodash/wiki/Drop-in-Disclaimer)</sup> for Underscore.js, from the devs behind [jsPerf.com](http://jsperf.com), delivering [performance](http://lodash.com/benchmarks), [bug fixes](https://github.com/bestiejs/lodash#resolved-underscorejs-issues-30), and [additional features](https://github.com/bestiejs/lodash#features).
|
The [lodash](https://lodash.com/) library exported as a [UMD](https://github.com/umdjs/umd) module.
|
||||||
|
|
||||||
Lo-Dash’s performance is gained by avoiding slower native methods, instead opting for simplified non-ES5 compliant methods optimized for common usage, and by leveraging function compilation to reduce the number of overall function calls.
|
Generated using [lodash-cli](https://www.npmjs.com/package/lodash-cli):
|
||||||
|
```bash
|
||||||
|
$ npm run build
|
||||||
|
$ lodash -o ./dist/lodash.js
|
||||||
|
$ lodash core -o ./dist/lodash.core.js
|
||||||
|
```
|
||||||
|
|
||||||
|
## Community
|
||||||
|
|
||||||
|
[](https://gitter.im/lodash/lodash)
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
* [API Documentation](https://lodash.com/docs)
|
||||||
|
* [FP Guide](https://github.com/lodash/lodash/wiki/FP-Guide)
|
||||||
|
|
||||||
## Download
|
## Download
|
||||||
|
|
||||||
* [Development source](https://raw.github.com/bestiejs/lodash/v0.5.2/lodash.js)
|
Lodash is released under the [MIT license](https://raw.githubusercontent.com/lodash/lodash/4.5.1/LICENSE) & supports [modern environments](#support).<br>
|
||||||
* [Production source](https://raw.github.com/bestiejs/lodash/v0.5.2/lodash.min.js)
|
Review the [build differences](https://github.com/lodash/lodash/wiki/build-differences) & pick one that’s right for you.
|
||||||
* CDN copies of ≤ [v0.5.2](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/0.5.2/lodash.min.js) are available on [cdnjs](http://cdnjs.com/) thanks to [CloudFlare](http://www.cloudflare.com/)
|
|
||||||
* For optimal performance, [create a custom build](https://github.com/bestiejs/lodash#custom-builds) with only the features you need
|
|
||||||
|
|
||||||
## Dive in
|
* [Core build](https://raw.githubusercontent.com/lodash/lodash/4.5.1/dist/lodash.core.js) ([~4 kB gzipped](https://raw.githubusercontent.com/lodash/lodash/4.5.1/dist/lodash.core.min.js))
|
||||||
|
* [Full build](https://raw.githubusercontent.com/lodash/lodash/4.5.1/dist/lodash.js) ([~21 kB gzipped](https://raw.githubusercontent.com/lodash/lodash/4.5.1/dist/lodash.min.js))
|
||||||
|
* [CDN copies](https://www.jsdelivr.com/projects/lodash)
|
||||||
|
|
||||||
We’ve got [API docs](http://lodash.com/docs), [benchmarks](http://lodash.com/benchmarks), and [unit tests](http://lodash.com/tests).
|
## Why Lodash?
|
||||||
|
|
||||||
Create your own benchmarks at [jsPerf](http://jsperf.com), or [search](http://jsperf.com/search?q=lodash) for existing ones.
|
Lodash makes JavaScript easier by taking the hassle out of working with arrays,<br>
|
||||||
|
numbers, objects, strings, etc. Lodash’s modular methods are great for:
|
||||||
|
|
||||||
For a list of upcoming features, check out our [roadmap](https://github.com/bestiejs/lodash/wiki/Roadmap).
|
* Iterating arrays, objects, & strings
|
||||||
|
* Manipulating & testing values
|
||||||
|
* Creating composite functions
|
||||||
|
|
||||||
## Screencasts
|
## Module Formats
|
||||||
|
|
||||||
For more information check out these screencasts over Lo-Dash:
|
Lodash is available in a [variety of builds](https://lodash.com/custom-builds) & module formats.
|
||||||
|
|
||||||
* [Introducing Lo-Dash](https://vimeo.com/44154599)
|
* [lodash](https://www.npmjs.com/package/lodash) & [per method packages](https://www.npmjs.com/browse/keyword/lodash-modularized)
|
||||||
* [Lo-Dash optimizations and custom builds](https://vimeo.com/44154601)
|
* [lodash-amd](https://www.npmjs.com/package/lodash-amd)
|
||||||
* [Lo-Dash’s origin and why it’s a better utility belt](https://vimeo.com/44154600)
|
* [lodash-es](https://www.npmjs.com/package/lodash-es) & [babel-plugin-lodash](https://www.npmjs.com/package/babel-plugin-lodash)
|
||||||
* [Unit testing in Lo-Dash](https://vimeo.com/45865290)
|
* [lodash/fp](https://github.com/lodash/lodash/tree/4.5.1-npm/fp)
|
||||||
|
|
||||||
## Features
|
## Further Reading
|
||||||
|
|
||||||
* AMD loader support ([RequireJS](http://requirejs.org/), [curl.js](https://github.com/cujojs/curl), etc.)
|
* [Contributing](https://github.com/lodash/lodash/blob/master/.github/CONTRIBUTING.md)
|
||||||
* [_.bind](http://lodash.com/docs#bind) supports *“lazy”* binding
|
* [Release Notes](https://github.com/lodash/lodash/releases/tag/4.0.0)
|
||||||
* [_.clone](http://lodash.com/docs#clone) supports *“deep”* cloning
|
* [Wiki (Changelog, Roadmap, etc.)](https://github.com/lodash/lodash/wiki)
|
||||||
* [_.countBy](http://lodash.com/docs#countBy) as a compainion function for [_.groupBy](http://lodash.com/docs#groupBy) and [_.sortBy](http://lodash.com/docs#sortBy)
|
|
||||||
* [_.debounce](http://lodash.com/docs#debounce)’ed functions match [_.throttle](http://lodash.com/docs#throttle)’ed functions’ return value behavior
|
|
||||||
* [_.drop](http://lodash.com/docs#drop) for the inverse functionality of [_.pick](http://lodash.com/docs#pick)
|
|
||||||
* [_.forEach](http://lodash.com/docs#forEach) is chainable and supports exiting iteration early
|
|
||||||
* [_.forIn](http://lodash.com/docs#forIn) for iterating over an object’s own and inherited properties
|
|
||||||
* [_.forOwn](http://lodash.com/docs#forOwn) for iterating over an object’s own properties
|
|
||||||
* [_.groupBy](http://lodash.com/docs#groupBy), [_.sortedIndex](http://lodash.com/docs#sortedIndex), and [_.uniq](http://lodash.com/docs#uniq) accept a `thisArg` argument
|
|
||||||
* [_.indexOf](http://lodash.com/docs#indexOf) and [_.lastIndexOf](http://lodash.com/docs#lastIndexOf) accept a `fromIndex` argument
|
|
||||||
* [_.merge](http://lodash.com/docs#merge) for a *“deep”* [_.extend](http://lodash.com/docs#extend)
|
|
||||||
* [_.partial](http://lodash.com/docs#partial) for partial application without `this` binding
|
|
||||||
* [_.sortBy](http://lodash.com/docs#sortBy) performs a [stable](http://en.wikipedia.org/wiki/Sorting_algorithm#Stability) sort
|
|
||||||
* [_.template](http://lodash.com/docs#template) utilizes [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) for easier debugging
|
|
||||||
* [_.where](http://lodash.com/docs#where) for filtering collections by contained properties
|
|
||||||
* [_.zipObject](http://lodash.com/docs#zipObject) for composing objects
|
|
||||||
* [_.contains](http://lodash.com/docs#contains), [_.size](http://lodash.com/docs#size), [_.toArray](http://lodash.com/docs#toArray),
|
|
||||||
[and more…](http://lodash.com/docs "_.every, _.filter, _.find, _.forEach, _.groupBy, _.invoke, _.map, _.pluck, _.reduce, _.reduceRight, _.reject, _.some, _sortBy") accept strings
|
|
||||||
|
|
||||||
## Support
|
|
||||||
|
|
||||||
Lo-Dash has been tested in at least Chrome 5-21, Firefox 1.5-13, IE 6-9, Opera 9.25-12.01, Safari 3-6, Node.js 0.4.8-0.8.7, Narwhal 0.3.2, RingoJS 0.8, and Rhino 1.7RC5.
|
|
||||||
|
|
||||||
## Custom builds
|
|
||||||
|
|
||||||
Custom builds make it easy to create lightweight versions of Lo-Dash containing only the methods you need.
|
|
||||||
We handle all the method dependency and alias mapping for you.
|
|
||||||
|
|
||||||
* Backbone builds, containing all methods required by Backbone, may be created using the `backbone` modifier argument.
|
|
||||||
```bash
|
|
||||||
lodash backbone
|
|
||||||
```
|
|
||||||
|
|
||||||
* CSP builds, supporting default Content Security Policy restrictions, may be created using the `csp` modifier argument.
|
|
||||||
```bash
|
|
||||||
lodash csp
|
|
||||||
```
|
|
||||||
|
|
||||||
* Legacy builds, tailored for older browsers without [ES5 support](http://es5.github.com/), may be created using the `legacy` modifier argument.
|
|
||||||
```bash
|
|
||||||
lodash legacy
|
|
||||||
```
|
|
||||||
|
|
||||||
* Mobile builds, with IE < 9 bug fixes and method compilation removed, may be created using the `mobile` modifier argument.
|
|
||||||
```bash
|
|
||||||
lodash mobile
|
|
||||||
```
|
|
||||||
|
|
||||||
* Strict builds, with `_.bindAll`, `_.defaults`, and `_.extend` in [strict mode](http://es5.github.com/#C), may be created using the `strict` modifier argument.
|
|
||||||
```bash
|
|
||||||
lodash strict
|
|
||||||
```
|
|
||||||
|
|
||||||
* Underscore builds, containing only methods included in Underscore, may be created using the `underscore` modifier argument.
|
|
||||||
```bash
|
|
||||||
lodash underscore
|
|
||||||
```
|
|
||||||
|
|
||||||
Custom builds may be created in three ways:
|
|
||||||
|
|
||||||
1. Use the `category` argument to pass the categories of methods to include in the build.<br>
|
|
||||||
Valid categories are *“arrays”*, *“chaining”*, *“collections”*, *“functions”*, *“objects”*, and *“utilities”*.
|
|
||||||
```bash
|
|
||||||
lodash category=collections,functions
|
|
||||||
lodash category="collections, functions"
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Use the `exclude` argument to pass the names of methods to exclude from the build.
|
|
||||||
```bash
|
|
||||||
lodash exclude=union,uniq,zip
|
|
||||||
lodash exclude="union, uniq, zip"
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Use the `include` argument to pass the names of methods to include in the build.
|
|
||||||
```bash
|
|
||||||
lodash include=each,filter,map
|
|
||||||
lodash include="each, filter, map"
|
|
||||||
```
|
|
||||||
|
|
||||||
All arguments, except `backbone` with `underscore`, `exclude` with `include`, and `legacy` with `csp`/`mobile`, may be combined.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
lodash backbone legacy category=utilities exclude=first,last
|
|
||||||
lodash underscore mobile strict category=functions include=pick,uniq
|
|
||||||
```
|
|
||||||
|
|
||||||
The `lodash` command-line utility is available when Lo-Dash is installed as a global package (i.e. `npm install -g lodash`).
|
|
||||||
|
|
||||||
Custom builds are saved to `lodash.custom.js` and `lodash.custom.min.js`.
|
|
||||||
|
|
||||||
## Installation and usage
|
|
||||||
|
|
||||||
In browsers:
|
|
||||||
|
|
||||||
```html
|
|
||||||
<script src="lodash.js"></script>
|
|
||||||
```
|
|
||||||
|
|
||||||
Using [npm](http://npmjs.org/):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm install lodash
|
|
||||||
npm install -g lodash
|
|
||||||
```
|
|
||||||
|
|
||||||
In [Node.js](http://nodejs.org/) and [RingoJS v0.8.0+](http://ringojs.org/):
|
|
||||||
|
|
||||||
```js
|
|
||||||
var _ = require('lodash');
|
|
||||||
```
|
|
||||||
|
|
||||||
In [RingoJS v0.7.0-](http://ringojs.org/):
|
|
||||||
|
|
||||||
```js
|
|
||||||
var _ = require('lodash')._;
|
|
||||||
```
|
|
||||||
|
|
||||||
In [Rhino](http://www.mozilla.org/rhino/):
|
|
||||||
|
|
||||||
```js
|
|
||||||
load('lodash.js');
|
|
||||||
```
|
|
||||||
|
|
||||||
In an AMD loader like [RequireJS](http://requirejs.org/):
|
|
||||||
|
|
||||||
```js
|
|
||||||
require({
|
|
||||||
'paths': {
|
|
||||||
'underscore': 'path/to/lodash'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
['underscore'], function(_) {
|
|
||||||
console.log(_.VERSION);
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## Resolved Underscore.js issues <sup>(30+)</sup>
|
|
||||||
|
|
||||||
* Allow iteration of objects with a `length` property [[#148](https://github.com/documentcloud/underscore/issues/148), [#154](https://github.com/documentcloud/underscore/issues/154), [#252](https://github.com/documentcloud/underscore/issues/252), [#448](https://github.com/documentcloud/underscore/issues/448), [#659](https://github.com/documentcloud/underscore/issues/659), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L551-557)]
|
|
||||||
* Ensure array-like objects with invalid `length` properties are treated like regular objects [[test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L499-509)]
|
|
||||||
* Ensure *“Arrays”*, “Collections”, and “Objects” methods don’t error when passed falsey arguments [[#650](https://github.com/documentcloud/underscore/pull/650), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L1558-1593)]
|
|
||||||
* Ensure *“Collections”* methods allow string `collection` arguments [[#247](https://github.com/documentcloud/underscore/issues/247), [#276](https://github.com/documentcloud/underscore/issues/276), [#561](https://github.com/documentcloud/underscore/pull/561), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L511-529)]
|
|
||||||
* Ensure templates compiled with errors are inspectable [[#666](https://github.com/documentcloud/underscore/issues/666), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L1299-1302)]
|
|
||||||
* Fix cross-browser object iteration bugs [[#60](https://github.com/documentcloud/underscore/issues/60), [#376](https://github.com/documentcloud/underscore/issues/376), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L562-587)]
|
|
||||||
* Handle arrays with `undefined` values correctly in IE < 9 [[#601](https://github.com/documentcloud/underscore/issues/601)]
|
|
||||||
* Methods should work on pages with incorrectly shimmed native methods [[#7](https://github.com/documentcloud/underscore/issues/7), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L117-123)]
|
|
||||||
* Register as an AMD module, but still export to global [[#431](https://github.com/documentcloud/underscore/pull/431), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L101-115)]
|
|
||||||
* `_(…)` should return passed wrapper instances [[test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L135-138)]
|
|
||||||
* `_.clone` should allow `deep` cloning [[#595](https://github.com/documentcloud/underscore/pull/595), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L205-220)]
|
|
||||||
* `_.contains` should work with strings [[#667](https://github.com/documentcloud/underscore/pull/667), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L275-284)]
|
|
||||||
* `_.escape` should return an empty string when passed `null` or `undefined` [[#427](https://github.com/documentcloud/underscore/issues/427), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L375-378)]
|
|
||||||
* `_.extend` should recursively extend objects [[#379](https://github.com/documentcloud/underscore/pull/379), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L952-974)]
|
|
||||||
* `_.forEach` should be chainable [[#142](https://github.com/documentcloud/underscore/issues/142), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L494-497)]
|
|
||||||
* `_.forEach` should allow exiting iteration early [[#211](https://github.com/documentcloud/underscore/issues/211), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L589-608)]
|
|
||||||
* `_.groupBy` should add values to own, not inherited, properties [[test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L623-630)]
|
|
||||||
* `_.isElement` should use strict equality for its duck type check [[test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L704-713)]
|
|
||||||
* `_.isEmpty` and `_.size` should support jQuery/MooTools DOM query collections [[#690](https://github.com/documentcloud/underscore/pull/690), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L740-745)]
|
|
||||||
* `_.isEqual` should return `true` for like-objects from different documents [[test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L781-801)]
|
|
||||||
* `_.isObject` should avoid V8 bug [#2291](http://code.google.com/p/v8/issues/detail?id=2291) [[#605](https://github.com/documentcloud/underscore/issues/605), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L809-821)]
|
|
||||||
* `_.isNaN(new Number(NaN))` should return `true` [[test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L829-831)]
|
|
||||||
* `_.keys` and `_.size` should work with `arguments` objects cross-browser [[#396](https://github.com/documentcloud/underscore/issues/396), [#653](https://github.com/documentcloud/underscore/issues/653), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L885-887)]
|
|
||||||
* `_.once` should free the given function for garbage collection [[#693](https://github.com/documentcloud/underscore/pull/693)]
|
|
||||||
* `_.range` should coerce arguments to numbers [[#634](https://github.com/documentcloud/underscore/issues/634), [#683](https://github.com/documentcloud/underscore/issues/683), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L1110-1113)]
|
|
||||||
* `_.reduceRight` should pass correct callback arguments when iterating objects [[test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L1121-1135)]
|
|
||||||
* `_.size` should return the `length` of string values [[test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L1179-1181)]
|
|
||||||
* `_.sortedIndex` should support arrays with high `length` values [[test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L1269-1278)]
|
|
||||||
* `_.template` should not augment the `options` object [[test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L1293-1297)]
|
|
||||||
* `_.throttle` should work when called in a loop [[#502](https://github.com/documentcloud/underscore/issues/502), [test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L1389-1399)]
|
|
||||||
* `_.toArray` uses custom `toArray` methods of arrays and strings [[test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L1426-1434)]
|
|
||||||
* `_.zipObject` should accept less than two arguments [[test](https://github.com/bestiejs/lodash/blob/v0.5.2/test/test.js#L1520-1522)]
|
|
||||||
|
|
||||||
## Optimized methods <sup>(50+)</sup>
|
|
||||||
|
|
||||||
* `_.bind`
|
|
||||||
* `_.bindAll`
|
|
||||||
* `_.clone`
|
|
||||||
* `_.compact`
|
|
||||||
* `_.contains`, `_.include`
|
|
||||||
* `_.defaults`
|
|
||||||
* `_.defer`
|
|
||||||
* `_.difference`
|
|
||||||
* `_.each`
|
|
||||||
* `_.escape`
|
|
||||||
* `_.every`, `_.all`
|
|
||||||
* `_.extend`
|
|
||||||
* `_.filter`, `_.select`
|
|
||||||
* `_.find`, `_.detect`
|
|
||||||
* `_.flatten`
|
|
||||||
* `_.forEach`, `_.each`
|
|
||||||
* `_.functions`, `_.methods`
|
|
||||||
* `_.groupBy`
|
|
||||||
* `_.indexOf`
|
|
||||||
* `_.intersection`
|
|
||||||
* `_.invoke`
|
|
||||||
* `_.isArguments`
|
|
||||||
* `_.isDate`
|
|
||||||
* `_.isEmpty`
|
|
||||||
* `_.isFinite`
|
|
||||||
* `_.isFunction`
|
|
||||||
* `_.isObject`
|
|
||||||
* `_.isNumber`
|
|
||||||
* `_.isRegExp`
|
|
||||||
* `_.isString`
|
|
||||||
* `_.keys`
|
|
||||||
* `_.lastIndexOf`
|
|
||||||
* `_.map`, `_.collect`
|
|
||||||
* `_.max`
|
|
||||||
* `_.memoize`
|
|
||||||
* `_.min`
|
|
||||||
* `_.mixin`
|
|
||||||
* `_.pick`
|
|
||||||
* `_.pluck`
|
|
||||||
* `_.reduce`, `_.foldl`, `_.inject`
|
|
||||||
* `_.reject`
|
|
||||||
* `_.result`
|
|
||||||
* `_.shuffle`
|
|
||||||
* `_.some`, `_.any`
|
|
||||||
* `_.sortBy`
|
|
||||||
* `_.sortedIndex`
|
|
||||||
* `_.template`
|
|
||||||
* `_.throttle`
|
|
||||||
* `_.times`
|
|
||||||
* `_.toArray`
|
|
||||||
* `_.union`
|
|
||||||
* `_.uniq`, `_.unique`
|
|
||||||
* `_.values`
|
|
||||||
* `_.without`
|
|
||||||
* `_.wrap`
|
|
||||||
* `_.zip`
|
|
||||||
* plus all `_(…)` method wrappers
|
|
||||||
|
|
||||||
## Release Notes
|
|
||||||
|
|
||||||
### <sup>v0.5.2</sup>
|
|
||||||
|
|
||||||
* Ensured `_.isElement` uses strict equality for its duck type check
|
|
||||||
* Ensured `_.isObject` returns a boolean value
|
|
||||||
* Ensured `_.template` and *“Objects”* methods don’t error when passed falsey arguments
|
|
||||||
* Made `_.template` generate less unused code in compiled templates
|
|
||||||
|
|
||||||
### <sup>v0.5.1</sup>
|
|
||||||
|
|
||||||
* Ensured `_.bind` correctly appends array arguments to partially applied arguments in older browsers
|
|
||||||
|
|
||||||
### <sup>v0.5.0</sup>
|
|
||||||
|
|
||||||
* Added [_.countBy](http://lodash.com/docs#countBy), [_.drop](http://lodash.com/docs#drop), [_.merge](http://lodash.com/docs#merge), and [_.where](http://lodash.com/docs#where)
|
|
||||||
* Added `csp` *(Content Security Policy)* and `underscore` build options
|
|
||||||
* Added `deep` cloning support to `_.clone`
|
|
||||||
* Added [Jam](http://jamjs.org/) package support
|
|
||||||
* Added support for exiting `_.forEach`, `_.forIn`, and `_.forOwn` early by returning `false` in the `callback`
|
|
||||||
* Added support for jQuery/MooTools DOM query collections to `_.isEmpty` and `_.size`
|
|
||||||
* Ensured development build works with IE conditional compilation enabled
|
|
||||||
* Ensured `_.clone` doesn’t clone functions, DOM nodes, `arguments` objects, and objects created by constructors other than `Object`
|
|
||||||
* Ensured `_.filter`’s `callback` can’t modify result values
|
|
||||||
* Ensured `_.isEmpty`, `_.isEquals`, and `_.size` support `arguments` objects
|
|
||||||
* Ensured `_.isEqual` doesn’t inspect DOM nodes, works with objects from other documents, and calls custom `isEqual` methods before checking strict equality
|
|
||||||
* Ensured `_.once` frees the given function for garbage collection
|
|
||||||
* Ensured `_.sortBy` performs a stable sort
|
|
||||||
* Ensured `reEvaluateDelimiter` is assigned when `_.templateSettings.evaluate` is undefined
|
|
||||||
* Made `_.range` coerce arguments to numbers
|
|
||||||
* Optimized `_.isFunction`
|
|
||||||
|
|
||||||
The full changelog is available [here](https://github.com/bestiejs/lodash/wiki/Changelog).
|
|
||||||
|
|
||||||
## BestieJS
|
|
||||||
|
|
||||||
Lo-Dash is part of the BestieJS *“Best in Class”* module collection. This means we promote solid browser/environment support, ES5 precedents, unit testing, and plenty of documentation.
|
|
||||||
|
|
||||||
## Author
|
|
||||||
|
|
||||||
* [John-David Dalton](http://allyoucanleet.com/)
|
|
||||||
[](https://twitter.com/jdalton "Follow @jdalton on Twitter")
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
* [Kit Cambridge](http://kitcambridge.github.com/)
|
|
||||||
[](https://twitter.com/kitcambridge "Follow @kitcambridge on Twitter")
|
|
||||||
* [Mathias Bynens](http://mathiasbynens.be/)
|
|
||||||
[](https://twitter.com/mathias "Follow @mathias on Twitter")
|
|
||||||
|
|||||||
347
build/minify.js
347
build/minify.js
@@ -1,347 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
;(function() {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/** The Node filesystem, path, `zlib`, and child process modules */
|
|
||||||
var fs = require('fs'),
|
|
||||||
gzip = require('zlib').gzip,
|
|
||||||
path = require('path'),
|
|
||||||
spawn = require('child_process').spawn;
|
|
||||||
|
|
||||||
/** The directory that is the base of the repository */
|
|
||||||
var basePath = path.join(__dirname, '../');
|
|
||||||
|
|
||||||
/** The directory where the Closure Compiler is located */
|
|
||||||
var closurePath = path.join(basePath, 'vendor', 'closure-compiler', 'compiler.jar');
|
|
||||||
|
|
||||||
/** The distribution directory */
|
|
||||||
var distPath = path.join(basePath, 'dist');
|
|
||||||
|
|
||||||
/** Load other modules */
|
|
||||||
var preprocess = require(path.join(__dirname, 'pre-compile')),
|
|
||||||
postprocess = require(path.join(__dirname, 'post-compile')),
|
|
||||||
uglifyJS = require(path.join(basePath, 'vendor', 'uglifyjs', 'uglify-js'));
|
|
||||||
|
|
||||||
/** Closure Compiler command-line options */
|
|
||||||
var closureOptions = [
|
|
||||||
'--compilation_level=ADVANCED_OPTIMIZATIONS',
|
|
||||||
'--language_in=ECMASCRIPT5_STRICT',
|
|
||||||
'--warning_level=QUIET'
|
|
||||||
];
|
|
||||||
|
|
||||||
/** Reassign `existsSync` for older versions of Node */
|
|
||||||
fs.existsSync || (fs.existsSync = path.existsSync);
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The exposed `minify` function minifies a given Lo-Dash `source` and invokes
|
|
||||||
* the `onComplete` callback when finished.
|
|
||||||
*
|
|
||||||
* @param {String} source The source to minify.
|
|
||||||
* @param {String} workingName The name to give temporary files creates during the minification process.
|
|
||||||
* @param {Function} onComplete A function called when minification has completed.
|
|
||||||
*/
|
|
||||||
function minify(source, workingName, onComplete) {
|
|
||||||
new Minify(source, workingName, onComplete);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Minify constructor used to keep state of each `minify` invocation.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @constructor
|
|
||||||
* @param {String} source The source to minify.
|
|
||||||
* @param {String} workingName The name to give temporary files creates during the minification process.
|
|
||||||
* @param {Function} onComplete A function called when minification has completed.
|
|
||||||
*/
|
|
||||||
function Minify(source, workingName, onComplete) {
|
|
||||||
// create the destination directory if it doesn't exist
|
|
||||||
if (!fs.existsSync(distPath)) {
|
|
||||||
// avoid errors when called as a npm executable
|
|
||||||
try {
|
|
||||||
fs.mkdirSync(distPath);
|
|
||||||
} catch(e) { }
|
|
||||||
}
|
|
||||||
|
|
||||||
this.compiled = {};
|
|
||||||
this.hybrid = {};
|
|
||||||
this.uglified = {};
|
|
||||||
this.onComplete = onComplete;
|
|
||||||
this.source = source = preprocess(source);
|
|
||||||
this.workingName = workingName;
|
|
||||||
|
|
||||||
// begin the minification process
|
|
||||||
closureCompile.call(this, source, onClosureCompile.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compresses a `source` string using the Closure Compiler. Yields the
|
|
||||||
* minified result, and any exceptions encountered, to a `callback` function.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} source The JavaScript source to minify.
|
|
||||||
* @param {String} [message] The message to log.
|
|
||||||
* @param {Function} callback The function to call once the process completes.
|
|
||||||
*/
|
|
||||||
function closureCompile(source, message, callback) {
|
|
||||||
// the standard error stream, standard output stream, and Closure Compiler process
|
|
||||||
var error = '',
|
|
||||||
output = '',
|
|
||||||
compiler = spawn('java', ['-jar', closurePath].concat(closureOptions));
|
|
||||||
|
|
||||||
// juggle arguments
|
|
||||||
if (typeof message == 'function') {
|
|
||||||
callback = message;
|
|
||||||
message = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(message == null
|
|
||||||
? 'Compressing ' + this.workingName + ' using the Closure Compiler...'
|
|
||||||
: message
|
|
||||||
);
|
|
||||||
|
|
||||||
compiler.stdout.on('data', function(data) {
|
|
||||||
// append the data to the output stream
|
|
||||||
output += data;
|
|
||||||
});
|
|
||||||
|
|
||||||
compiler.stderr.on('data', function(data) {
|
|
||||||
// append the error message to the error stream
|
|
||||||
error += data;
|
|
||||||
});
|
|
||||||
|
|
||||||
compiler.on('exit', function(status) {
|
|
||||||
var exception = null;
|
|
||||||
|
|
||||||
// `status` contains the process exit code
|
|
||||||
if (status) {
|
|
||||||
exception = new Error(error);
|
|
||||||
exception.status = status;
|
|
||||||
}
|
|
||||||
callback(exception, output);
|
|
||||||
});
|
|
||||||
|
|
||||||
// proxy the standard input to the Closure Compiler
|
|
||||||
compiler.stdin.end(source);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compresses a `source` string using UglifyJS. Yields the result to a
|
|
||||||
* `callback` function. This function is synchronous; the `callback` is used
|
|
||||||
* for symmetry.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} source The JavaScript source to minify.
|
|
||||||
* @param {String} [message] The message to log.
|
|
||||||
* @param {Function} callback The function to call once the process completes.
|
|
||||||
*/
|
|
||||||
function uglify(source, message, callback) {
|
|
||||||
var exception,
|
|
||||||
result,
|
|
||||||
ugly = uglifyJS.uglify;
|
|
||||||
|
|
||||||
// juggle arguments
|
|
||||||
if (typeof message == 'function') {
|
|
||||||
callback = message;
|
|
||||||
message = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(message == null
|
|
||||||
? 'Compressing ' + this.workingName + ' using UglifyJS...'
|
|
||||||
: message
|
|
||||||
);
|
|
||||||
|
|
||||||
try {
|
|
||||||
result = ugly.gen_code(
|
|
||||||
// enable unsafe transformations
|
|
||||||
ugly.ast_squeeze_more(
|
|
||||||
ugly.ast_squeeze(
|
|
||||||
// munge variable and function names, excluding the special `define`
|
|
||||||
// function exposed by AMD loaders
|
|
||||||
ugly.ast_mangle(uglifyJS.parser.parse(source), {
|
|
||||||
'except': ['define']
|
|
||||||
}
|
|
||||||
))), {
|
|
||||||
'ascii_only': true
|
|
||||||
});
|
|
||||||
} catch(e) {
|
|
||||||
exception = e;
|
|
||||||
}
|
|
||||||
// lines are restricted to 500 characters for consistency with the Closure Compiler
|
|
||||||
callback(exception, result && ugly.split_lines(result, 500));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The `closureCompile()` callback.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object|Undefined} exception The error object.
|
|
||||||
* @param {String} result The resulting minified source.
|
|
||||||
*/
|
|
||||||
function onClosureCompile(exception, result) {
|
|
||||||
if (exception) {
|
|
||||||
throw exception;
|
|
||||||
}
|
|
||||||
// store the post-processed Closure Compiler result and gzip it
|
|
||||||
this.compiled.source = result = postprocess(result);
|
|
||||||
gzip(result, onClosureGzip.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Closure Compiler `gzip` callback.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object|Undefined} exception The error object.
|
|
||||||
* @param {Buffer} result The resulting gzipped source.
|
|
||||||
*/
|
|
||||||
function onClosureGzip(exception, result) {
|
|
||||||
if (exception) {
|
|
||||||
throw exception;
|
|
||||||
}
|
|
||||||
// store the gzipped result and report the size
|
|
||||||
this.compiled.gzip = result;
|
|
||||||
console.log('Done. Size: %d bytes.', result.length);
|
|
||||||
|
|
||||||
// next, minify the source using only UglifyJS
|
|
||||||
uglify.call(this, this.source, onUglify.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The `uglify()` callback.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object|Undefined} exception The error object.
|
|
||||||
* @param {String} result The resulting minified source.
|
|
||||||
*/
|
|
||||||
function onUglify(exception, result) {
|
|
||||||
if (exception) {
|
|
||||||
throw exception;
|
|
||||||
}
|
|
||||||
// store the post-processed Uglified result and gzip it
|
|
||||||
this.uglified.source = result = postprocess(result);
|
|
||||||
gzip(result, onUglifyGzip.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The UglifyJS `gzip` callback.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object|Undefined} exception The error object.
|
|
||||||
* @param {Buffer} result The resulting gzipped source.
|
|
||||||
*/
|
|
||||||
function onUglifyGzip(exception, result) {
|
|
||||||
if (exception) {
|
|
||||||
throw exception;
|
|
||||||
}
|
|
||||||
var message = 'Compressing ' + this.workingName + ' using hybrid minification...';
|
|
||||||
|
|
||||||
// store the gzipped result and report the size
|
|
||||||
this.uglified.gzip = result;
|
|
||||||
console.log('Done. Size: %d bytes.', result.length);
|
|
||||||
|
|
||||||
// next, minify the Closure Compiler minified source using UglifyJS
|
|
||||||
uglify.call(this, this.compiled.source, message, onHybrid.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The hybrid `uglify()` callback.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object|Undefined} exception The error object.
|
|
||||||
* @param {String} result The resulting minified source.
|
|
||||||
*/
|
|
||||||
function onHybrid(exception, result) {
|
|
||||||
if (exception) {
|
|
||||||
throw exception;
|
|
||||||
}
|
|
||||||
// store the post-processed Uglified result and gzip it
|
|
||||||
this.hybrid.source = result = postprocess(result);
|
|
||||||
gzip(result, onHybridGzip.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The hybrid `gzip` callback.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object|Undefined} exception The error object.
|
|
||||||
* @param {Buffer} result The resulting gzipped source.
|
|
||||||
*/
|
|
||||||
function onHybridGzip(exception, result) {
|
|
||||||
if (exception) {
|
|
||||||
throw exception;
|
|
||||||
}
|
|
||||||
// store the gzipped result and report the size
|
|
||||||
this.hybrid.gzip = result;
|
|
||||||
console.log('Done. Size: %d bytes.', result.length);
|
|
||||||
|
|
||||||
// finish by choosing the smallest compressed file
|
|
||||||
onComplete.call(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The callback executed after JavaScript source is minified and gzipped.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function onComplete() {
|
|
||||||
var compiled = this.compiled,
|
|
||||||
hybrid = this.hybrid,
|
|
||||||
name = this.workingName,
|
|
||||||
uglified = this.uglified;
|
|
||||||
|
|
||||||
// avoid errors when called as a npm executable
|
|
||||||
try {
|
|
||||||
// save the Closure Compiled version to disk
|
|
||||||
fs.writeFileSync(path.join(distPath, name + '.compiler.js'), compiled.source);
|
|
||||||
fs.writeFileSync(path.join(distPath, name + '.compiler.js.gz'), compiled.gzip);
|
|
||||||
|
|
||||||
// save the Uglified version to disk
|
|
||||||
fs.writeFileSync(path.join(distPath, name + '.uglify.js'), uglified.source);
|
|
||||||
fs.writeFileSync(path.join(distPath, name + '.uglify.js.gz'), uglified.gzip);
|
|
||||||
|
|
||||||
// save the hybrid minified version to disk
|
|
||||||
fs.writeFileSync(path.join(distPath, name + '.hybrid.js'), hybrid.source);
|
|
||||||
fs.writeFileSync(path.join(distPath, name + '.hybrid.js.gz'), hybrid.gzip);
|
|
||||||
} catch(e) { }
|
|
||||||
|
|
||||||
// select the smallest gzipped file and use its minified counterpart as the
|
|
||||||
// official minified release (ties go to Closure Compiler)
|
|
||||||
var min = Math.min(compiled.gzip.length, hybrid.gzip.length, uglified.gzip.length);
|
|
||||||
|
|
||||||
// pass the minified source to the minify instances "onComplete" callback
|
|
||||||
this.onComplete(
|
|
||||||
compiled.gzip.length == min
|
|
||||||
? compiled.source
|
|
||||||
: uglified.gzip.length == min
|
|
||||||
? uglified.source
|
|
||||||
: hybrid.source
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// expose `minify`
|
|
||||||
if (module != require.main) {
|
|
||||||
module.exports = minify;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// read the Lo-Dash source file from the first argument if the script
|
|
||||||
// was invoked directly (e.g. `node minify.js source.js`) and write to
|
|
||||||
// `<filename>.min.js`
|
|
||||||
(function() {
|
|
||||||
var filePath = process.argv[2],
|
|
||||||
dirPath = path.dirname(filePath),
|
|
||||||
source = fs.readFileSync(filePath, 'utf8'),
|
|
||||||
workingName = path.basename(filePath, '.js') + '.min';
|
|
||||||
|
|
||||||
minify(source, workingName, function(result) {
|
|
||||||
fs.writeFileSync(path.join(dirPath, workingName + '.js'), result, 'utf8');
|
|
||||||
});
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
;(function() {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/** The Node filesystem module */
|
|
||||||
var fs = require('fs');
|
|
||||||
|
|
||||||
/** The minimal license/copyright template */
|
|
||||||
var licenseTemplate =
|
|
||||||
'/*!\n' +
|
|
||||||
' Lo-Dash @VERSION lodash.com/license\n' +
|
|
||||||
' Underscore.js 1.3.3 github.com/documentcloud/underscore/blob/master/LICENSE\n' +
|
|
||||||
'*/';
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Post-process a given minified Lo-Dash `source`, preparing it for
|
|
||||||
* deployment.
|
|
||||||
*
|
|
||||||
* @param {String} source The source to process.
|
|
||||||
* @returns {String} Returns the processed source.
|
|
||||||
*/
|
|
||||||
function postprocess(source) {
|
|
||||||
// exit early if snippet isn't found
|
|
||||||
var snippet = /VERSION\s*[=:]\s*([\'"])(.*?)\1/.exec(source);
|
|
||||||
if (!snippet) {
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
|
|
||||||
// set the version
|
|
||||||
var license = licenseTemplate.replace('@VERSION', snippet[2]);
|
|
||||||
|
|
||||||
// move vars exposed by Closure Compiler into the IIFE
|
|
||||||
source = source.replace(/^([^(\n]+)\s*(\(function[^)]+\){)/, '$2$1');
|
|
||||||
|
|
||||||
// unescape properties (i.e. foo["bar"] => foo.bar)
|
|
||||||
source = source.replace(/(\w)\["([^."]+)"\]/g, '$1.$2');
|
|
||||||
|
|
||||||
// correct AMD module definition for AMD build optimizers
|
|
||||||
source = source.replace(/("function")\s*==\s*(typeof define)\s*&&\s*\(?\s*("object")\s*==\s*(typeof define\.amd)\s*&&\s*(define\.amd)\s*\)?/, '$2==$1&&$4==$3&&$5');
|
|
||||||
|
|
||||||
// add license
|
|
||||||
source = license + '\n;' + source;
|
|
||||||
|
|
||||||
// add trailing semicolon
|
|
||||||
return source.replace(/[\s;]*$/, ';');
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// expose `postprocess`
|
|
||||||
if (module != require.main) {
|
|
||||||
module.exports = postprocess;
|
|
||||||
} else {
|
|
||||||
// read the Lo-Dash source file from the first argument if the script
|
|
||||||
// was invoked directly (e.g. `node post-compile.js source.js`) and write to
|
|
||||||
// the same file
|
|
||||||
(function() {
|
|
||||||
var source = fs.readFileSync(process.argv[2], 'utf8');
|
|
||||||
fs.writeFileSync(process.argv[2], postprocess(source), 'utf8');
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
@@ -1,445 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
;(function() {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/** The Node filesystem module */
|
|
||||||
var fs = require('fs');
|
|
||||||
|
|
||||||
/** Used to minify variables embedded in compiled strings */
|
|
||||||
var compiledVars = [
|
|
||||||
'callback',
|
|
||||||
'collection',
|
|
||||||
'concat',
|
|
||||||
'ctor',
|
|
||||||
'hasOwnProperty',
|
|
||||||
'identity',
|
|
||||||
'index',
|
|
||||||
'iteratee',
|
|
||||||
'iteratorBind',
|
|
||||||
'length',
|
|
||||||
'nativeKeys',
|
|
||||||
'object',
|
|
||||||
'ownIndex',
|
|
||||||
'ownProps',
|
|
||||||
'prop',
|
|
||||||
'propertyIsEnumerable',
|
|
||||||
'propIndex',
|
|
||||||
'props',
|
|
||||||
'result',
|
|
||||||
'skipProto',
|
|
||||||
'slice',
|
|
||||||
'stringClass',
|
|
||||||
'thisArg',
|
|
||||||
'toString',
|
|
||||||
'value',
|
|
||||||
|
|
||||||
// lesser used variables
|
|
||||||
'accumulator',
|
|
||||||
'args',
|
|
||||||
'argsIndex',
|
|
||||||
'argsLength',
|
|
||||||
'arrayLikeClasses',
|
|
||||||
'ArrayProto',
|
|
||||||
'bind',
|
|
||||||
'callee',
|
|
||||||
'className',
|
|
||||||
'compareAscending',
|
|
||||||
'destValue',
|
|
||||||
'forIn',
|
|
||||||
'found',
|
|
||||||
'funcs',
|
|
||||||
'indexOf',
|
|
||||||
'indicator',
|
|
||||||
'isArguments',
|
|
||||||
'isArr',
|
|
||||||
'isArray',
|
|
||||||
'isFunc',
|
|
||||||
'isFunction',
|
|
||||||
'isPlainObject',
|
|
||||||
'methodName',
|
|
||||||
'noaccum',
|
|
||||||
'objectClass',
|
|
||||||
'objectTypes',
|
|
||||||
'pass',
|
|
||||||
'properties',
|
|
||||||
'property',
|
|
||||||
'propsLength',
|
|
||||||
'recursive',
|
|
||||||
'source',
|
|
||||||
'stack',
|
|
||||||
'stackLength',
|
|
||||||
'target',
|
|
||||||
'valueProp'
|
|
||||||
];
|
|
||||||
|
|
||||||
/** Used to minify `compileIterator` option properties */
|
|
||||||
var iteratorOptions = [
|
|
||||||
'args',
|
|
||||||
'array',
|
|
||||||
'arrayBranch',
|
|
||||||
'beforeLoop',
|
|
||||||
'bottom',
|
|
||||||
'exit',
|
|
||||||
'firstArg',
|
|
||||||
'hasDontEnumBug',
|
|
||||||
'inLoop',
|
|
||||||
'init',
|
|
||||||
'isKeysFast',
|
|
||||||
'object',
|
|
||||||
'objectBranch',
|
|
||||||
'noArgsEnum',
|
|
||||||
'noCharByIndex',
|
|
||||||
'shadowed',
|
|
||||||
'top',
|
|
||||||
'useHas',
|
|
||||||
'useStrict'
|
|
||||||
];
|
|
||||||
|
|
||||||
/** Used to minify variables and string values to a single character */
|
|
||||||
var minNames = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
|
|
||||||
minNames.push.apply(minNames, minNames.map(function(value) {
|
|
||||||
return value + value;
|
|
||||||
}));
|
|
||||||
|
|
||||||
/** Used to protect the specified properties from getting minified */
|
|
||||||
var propWhitelist = [
|
|
||||||
'_',
|
|
||||||
'_chain',
|
|
||||||
'_wrapped',
|
|
||||||
'after',
|
|
||||||
'all',
|
|
||||||
'amd',
|
|
||||||
'any',
|
|
||||||
'attachEvent',
|
|
||||||
'bind',
|
|
||||||
'bindAll',
|
|
||||||
'chain',
|
|
||||||
'clearTimeout',
|
|
||||||
'clone',
|
|
||||||
'collect',
|
|
||||||
'compact',
|
|
||||||
'compose',
|
|
||||||
'contains',
|
|
||||||
'countBy',
|
|
||||||
'criteria',
|
|
||||||
'debounce',
|
|
||||||
'defaults',
|
|
||||||
'defer',
|
|
||||||
'delay',
|
|
||||||
'detect',
|
|
||||||
'difference',
|
|
||||||
'drop',
|
|
||||||
'each',
|
|
||||||
'environment',
|
|
||||||
'escape',
|
|
||||||
'escape',
|
|
||||||
'evaluate',
|
|
||||||
'every',
|
|
||||||
'extend',
|
|
||||||
'filter',
|
|
||||||
'find',
|
|
||||||
'first',
|
|
||||||
'flatten',
|
|
||||||
'foldl',
|
|
||||||
'foldr',
|
|
||||||
'forEach',
|
|
||||||
'forIn',
|
|
||||||
'forOwn',
|
|
||||||
'functions',
|
|
||||||
'groupBy',
|
|
||||||
'has',
|
|
||||||
'head',
|
|
||||||
'identity',
|
|
||||||
'include',
|
|
||||||
'index',
|
|
||||||
'indexOf',
|
|
||||||
'initial',
|
|
||||||
'inject',
|
|
||||||
'interpolate',
|
|
||||||
'intersection',
|
|
||||||
'invoke',
|
|
||||||
'isArguments',
|
|
||||||
'isArray',
|
|
||||||
'isBoolean',
|
|
||||||
'isDate',
|
|
||||||
'isElement',
|
|
||||||
'isEmpty',
|
|
||||||
'isEqual',
|
|
||||||
'isEqual',
|
|
||||||
'isFinite',
|
|
||||||
'isFinite',
|
|
||||||
'isFunction',
|
|
||||||
'isNaN',
|
|
||||||
'isNull',
|
|
||||||
'isNumber',
|
|
||||||
'isObject',
|
|
||||||
'isRegExp',
|
|
||||||
'isString',
|
|
||||||
'isUndefined',
|
|
||||||
'keys',
|
|
||||||
'last',
|
|
||||||
'lastIndexOf',
|
|
||||||
'map',
|
|
||||||
'max',
|
|
||||||
'memoize',
|
|
||||||
'merge',
|
|
||||||
'methods',
|
|
||||||
'min',
|
|
||||||
'mixin',
|
|
||||||
'noConflict',
|
|
||||||
'once',
|
|
||||||
'opera',
|
|
||||||
'partial',
|
|
||||||
'pick',
|
|
||||||
'pluck',
|
|
||||||
'range',
|
|
||||||
'reduce',
|
|
||||||
'reduceRight',
|
|
||||||
'reject',
|
|
||||||
'rest',
|
|
||||||
'result',
|
|
||||||
'select',
|
|
||||||
'setTimeout',
|
|
||||||
'shuffle',
|
|
||||||
'size',
|
|
||||||
'some',
|
|
||||||
'sortBy',
|
|
||||||
'sortedIndex',
|
|
||||||
'source',
|
|
||||||
'tail',
|
|
||||||
'take',
|
|
||||||
'tap',
|
|
||||||
'template',
|
|
||||||
'templateSettings',
|
|
||||||
'throttle',
|
|
||||||
'times',
|
|
||||||
'toArray',
|
|
||||||
'union',
|
|
||||||
'uniq',
|
|
||||||
'unique',
|
|
||||||
'uniqueId',
|
|
||||||
'value',
|
|
||||||
'values',
|
|
||||||
'variable',
|
|
||||||
'VERSION',
|
|
||||||
'where',
|
|
||||||
'without',
|
|
||||||
'wrap',
|
|
||||||
'zip',
|
|
||||||
'zipObject'
|
|
||||||
];
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pre-process a given Lo-Dash `source`, preparing it for minification.
|
|
||||||
*
|
|
||||||
* @param {String} source The source to process.
|
|
||||||
* @returns {String} Returns the processed source.
|
|
||||||
*/
|
|
||||||
function preprocess(source) {
|
|
||||||
// remove copyright to add later in post-compile.js
|
|
||||||
source = source.replace(/\/\*![\s\S]+?\*\//, '');
|
|
||||||
|
|
||||||
// remove unrecognized JSDoc tags so Closure Compiler won't complain
|
|
||||||
source = source.replace(/@(?:alias|category)\b.*/g, '');
|
|
||||||
|
|
||||||
// manually convert `arrayLikeClasses` property assignments because
|
|
||||||
// Closure Compiler errors trying to minify them
|
|
||||||
source = source.replace(/(arrayLikeClasses =)[\s\S]+?= *true/,
|
|
||||||
"$1{'[object Arguments]': true, '[object Array]': true, '[object Boolean]': false, " +
|
|
||||||
"'[object Date]': false, '[object Function]': false, '[object Number]': false, " +
|
|
||||||
"'[object Object]': false, '[object RegExp]': false, '[object String]': true }"
|
|
||||||
);
|
|
||||||
|
|
||||||
// manually convert `cloneableClasses` property assignments because
|
|
||||||
// Closure Compiler errors trying to minify them
|
|
||||||
source = source.replace(/(cloneableClasses =)[\s\S]+?= *true/,
|
|
||||||
"$1{'[object Arguments]': false, '[object Array]': true, '[object Boolean]': true, " +
|
|
||||||
"'[object Date]': true, '[object Function]': false, '[object Number]': true, " +
|
|
||||||
"'[object Object]': true, '[object RegExp]': true, '[object String]': true }"
|
|
||||||
);
|
|
||||||
|
|
||||||
// add brackets to whitelisted properties so Closure Compiler won't mung them
|
|
||||||
// http://code.google.com/closure/compiler/docs/api-tutorial3.html#export
|
|
||||||
source = source.replace(RegExp('\\.(' + propWhitelist.join('|') + ')\\b', 'g'), "['$1']");
|
|
||||||
|
|
||||||
// remove brackets from `_.escape()` in `_.template`
|
|
||||||
source = source.replace(/__e *= *_\['escape']/g, '__e=_.escape');
|
|
||||||
|
|
||||||
// remove brackets from `collection.indexOf` in `_.contains`
|
|
||||||
source = source.replace("collection['indexOf'](target)", 'collection.indexOf(target)');
|
|
||||||
|
|
||||||
// remove brackets from `result[length].value` in `_.sortBy`
|
|
||||||
source = source.replace("result[length]['value']", 'result[length].value');
|
|
||||||
|
|
||||||
// remove whitespace from string literals
|
|
||||||
source = source.replace(/'(?:(?=(\\?))\1.)*?'/g, function(string) {
|
|
||||||
// avoids removing the '\n' of the `stringEscapes` object
|
|
||||||
return string.replace(/\[object |else if|function | in |return\s+[\w']|throw |typeof |use strict|var |@ |'\\n'|\\\\n|\\n|\s+/g, function(match) {
|
|
||||||
return match == false || match == '\\n' ? '' : match;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// remove whitespace from `_.template` related regexes
|
|
||||||
source = source.replace(/(?:reDelimiterCode\w+|reEmptyString\w+|reInsertVariable) *=.+/g, function(match) {
|
|
||||||
return match.replace(/ |\\n/g, '');
|
|
||||||
});
|
|
||||||
|
|
||||||
// remove newline from double-quoted strings in `_.template`
|
|
||||||
source = source
|
|
||||||
.replace('"\';\\n__with ("', '"\';__with("')
|
|
||||||
.replace('"\\n}__\\n__p += \'"', '"}____p+=\'"')
|
|
||||||
.replace('"__p = \'"', '"__p=\'"')
|
|
||||||
.replace('"\';\\n"', '"\';"')
|
|
||||||
.replace("') {\\n'", "'){'")
|
|
||||||
|
|
||||||
// remove `useSourceURL` variable
|
|
||||||
source = source.replace(/(?:\n +\/\*[^*]*\*+(?:[^\/][^*]*\*+)*\/)?\n *try *\{(?:\s*\/\/.*)*\n *var useSourceURL[\s\S]+?catch[^}]+}\n/, '');
|
|
||||||
|
|
||||||
// remove debug sourceURL use in `_.template`
|
|
||||||
source = source.replace(/(?:\s*\/\/.*\n)* *if *\(useSourceURL[^}]+}/, '');
|
|
||||||
|
|
||||||
// minify internal properties used by 'compareAscending', `_.clone`, `_.merge`, and `_.sortBy`
|
|
||||||
(function() {
|
|
||||||
var properties = ['criteria', 'index', 'source', 'value'],
|
|
||||||
snippets = source.match(/( +)(?:function clone|function compareAscending|var merge|var sortBy)\b[\s\S]+?\n\1}/g);
|
|
||||||
|
|
||||||
if (!snippets) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
snippets.forEach(function(snippet) {
|
|
||||||
var modified = snippet,
|
|
||||||
isCompilable = /(?:var merge|var sortBy)\b/.test(modified),
|
|
||||||
isInlined = !/\bcreateIterator\b/.test(modified);
|
|
||||||
|
|
||||||
// minify properties
|
|
||||||
properties.forEach(function(property, index) {
|
|
||||||
var reBracketProp = RegExp("\\['(" + property + ")'\\]", 'g'),
|
|
||||||
reDotProp = RegExp('\\.' + property + '\\b', 'g'),
|
|
||||||
rePropColon = RegExp("(')?\\b" + property + "\\1 *:", 'g');
|
|
||||||
|
|
||||||
if (isCompilable) {
|
|
||||||
// add quotes around properties in the inlined `_.merge` and `_.sortBy`
|
|
||||||
// of the mobile build so Closure Compiler won't mung them
|
|
||||||
if (isInlined) {
|
|
||||||
modified = modified
|
|
||||||
.replace(reBracketProp, "['" + minNames[index] + "']")
|
|
||||||
.replace(reDotProp, "['" + minNames[index] + "']")
|
|
||||||
.replace(rePropColon, "'" + minNames[index] + "':");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
modified = modified
|
|
||||||
.replace(reBracketProp, '.' + minNames[index])
|
|
||||||
.replace(reDotProp, '.' + minNames[index])
|
|
||||||
.replace(rePropColon, minNames[index] + ':');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
modified = modified
|
|
||||||
.replace(reBracketProp, "['" + minNames[index] + "']")
|
|
||||||
.replace(reDotProp, '.' + minNames[index])
|
|
||||||
.replace(rePropColon, "'" + minNames[index] + "':")
|
|
||||||
|
|
||||||
// correct `value.source` in regexp branch of `_.clone`
|
|
||||||
if (property == 'source') {
|
|
||||||
modified = modified.replace("value['" + minNames[index] + "']", "value['source']");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// replace with modified snippet
|
|
||||||
source = source.replace(snippet, modified);
|
|
||||||
});
|
|
||||||
}());
|
|
||||||
|
|
||||||
// minify all compilable snippets
|
|
||||||
var snippets = source.match(
|
|
||||||
RegExp([
|
|
||||||
// match the `iteratorTemplate`
|
|
||||||
'( +)var iteratorTemplate\\b[\\s\\S]+?\\n\\1}',
|
|
||||||
// match methods created by `createIterator` calls
|
|
||||||
'createIterator\\((?:{|[a-zA-Z]+)[\\s\\S]+?\\);\\n',
|
|
||||||
// match variables storing `createIterator` options
|
|
||||||
'( +)var [a-zA-Z]+IteratorOptions\\b[\\s\\S]+?\\n\\2}',
|
|
||||||
// match the the `createIterator` function
|
|
||||||
'( +)function createIterator\\b[\\s\\S]+?\\n\\3}'
|
|
||||||
].join('|'), 'g')
|
|
||||||
);
|
|
||||||
|
|
||||||
// exit early if no compilable snippets
|
|
||||||
if (!snippets) {
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
|
|
||||||
snippets.forEach(function(snippet, index) {
|
|
||||||
var isCreateIterator = /function createIterator\b/.test(snippet),
|
|
||||||
isIteratorTemplate = /var iteratorTemplate\b/.test(snippet),
|
|
||||||
modified = snippet;
|
|
||||||
|
|
||||||
// add brackets to whitelisted properties so Closure Compiler won't mung them
|
|
||||||
modified = modified.replace(RegExp('\\.(' + iteratorOptions.join('|') + ')\\b', 'g'), "['$1']");
|
|
||||||
|
|
||||||
if (isCreateIterator) {
|
|
||||||
// replace with modified snippet early and clip snippet to the `factory`
|
|
||||||
// call so other arguments aren't minified
|
|
||||||
source = source.replace(snippet, modified);
|
|
||||||
snippet = modified = modified.replace(/factory\([\s\S]+$/, '');
|
|
||||||
}
|
|
||||||
|
|
||||||
// minify snippet variables / arguments
|
|
||||||
compiledVars.forEach(function(variable, index) {
|
|
||||||
// ensure properties in compiled strings aren't minified
|
|
||||||
modified = modified.replace(RegExp('([^.]\\b)' + variable + '\\b(?!\' *[\\]:])', 'g'), '$1' + minNames[index]);
|
|
||||||
|
|
||||||
// correct `typeof x == 'object'`
|
|
||||||
if (variable == 'object') {
|
|
||||||
modified = modified.replace(RegExp("(typeof [^']+')" + minNames[index] + "'", 'g'), "$1object'");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// minify `createIterator` option property names
|
|
||||||
iteratorOptions.forEach(function(property, index) {
|
|
||||||
if (isIteratorTemplate) {
|
|
||||||
// minify property names as interpolated template variables
|
|
||||||
modified = modified.replace(RegExp('\\b' + property + '\\b', 'g'), minNames[index]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (property == 'array' || property == 'object') {
|
|
||||||
// minify "array" and "object" sub property names
|
|
||||||
modified = modified.replace(RegExp("'" + property + "'( *[\\]:])", 'g'), "'" + minNames[index] + "'$1");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// minify property name strings
|
|
||||||
modified = modified.replace(RegExp("'" + property + "'", 'g'), "'" + minNames[index] + "'");
|
|
||||||
// minify property names in regexes and accessors
|
|
||||||
if (isCreateIterator) {
|
|
||||||
modified = modified.replace(RegExp('([\\.|/])' + property + '\\b' , 'g'), '$1' + minNames[index]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// replace with modified snippet
|
|
||||||
source = source.replace(snippet, modified);
|
|
||||||
});
|
|
||||||
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// expose `preprocess`
|
|
||||||
if (module != require.main) {
|
|
||||||
module.exports = preprocess;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// read the Lo-Dash source file from the first argument if the script
|
|
||||||
// was invoked directly (e.g. `node pre-compile.js source.js`) and write to
|
|
||||||
// the same file
|
|
||||||
(function() {
|
|
||||||
var source = fs.readFileSync(process.argv[2], 'utf8');
|
|
||||||
fs.writeFileSync(process.argv[2], preprocess(source), 'utf8');
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
3823
dist/lodash.core.js
vendored
Normal file
3823
dist/lodash.core.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
29
dist/lodash.core.min.js
vendored
Normal file
29
dist/lodash.core.min.js
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* lodash 4.5.1 (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
|
||||||
|
* Build: `lodash core -o ./dist/lodash.core.js`
|
||||||
|
*/
|
||||||
|
;(function(){function n(n,t){for(var r=-1,e=t.length,u=n.length;++r<e;)n[u+r]=t[r];return n}function t(n,t,r){for(var e=-1,u=n.length;++e<u;){var o=n[e],i=t(o);if(null!=i&&(c===an?i===i:r(i,c)))var c=i,f=o}return f}function r(n,t,r){var e;return r(n,function(n,r,u){return t(n,r,u)?(e=n,false):void 0}),e}function e(n,t,r,e,u){return u(n,function(n,u,o){r=e?(e=false,n):t(r,n,u,o)}),r}function u(n,t){return O(t,function(t){return n[t]})}function o(n){return n&&n.Object===Object?n:null}function i(n){return vn[n];
|
||||||
|
}function c(n){var t=false;if(null!=n&&typeof n.toString!="function")try{t=!!(n+"")}catch(r){}return t}function f(n,t){return n=typeof n=="number"||hn.test(n)?+n:-1,n>-1&&0==n%1&&(null==t?9007199254740991:t)>n}function a(n){if(Y(n)&&!Pn(n)){if(n instanceof l)return n;if(En.call(n,"__wrapped__")){var t=new l(n.__wrapped__,n.__chain__);return t.__actions__=N(n.__actions__),t}}return new l(n)}function l(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t}function p(n,t,r,e){var u;return(u=n===an)||(u=xn[r],
|
||||||
|
u=(n===u||n!==n&&u!==u)&&!En.call(e,r)),u?t:n}function s(n){return X(n)?Fn(n):{}}function h(n,t,r){if(typeof n!="function")throw new TypeError("Expected a function");return setTimeout(function(){n.apply(an,r)},t)}function v(n,t){var r=true;return $n(n,function(n,e,u){return r=!!t(n,e,u)}),r}function y(n,t){var r=[];return $n(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function _(t,r,e,u){u||(u=[]);for(var o=-1,i=t.length;++o<i;){var c=t[o];r>0&&Y(c)&&L(c)&&(e||Pn(c)||K(c))?r>1?_(c,r-1,e,u):n(u,c):e||(u[u.length]=c);
|
||||||
|
}return u}function g(n,t){return n&&qn(n,t,en)}function b(n,t){return y(t,function(t){return Q(n[t])})}function j(n,t,r,e,u){return n===t?true:null==n||null==t||!X(n)&&!Y(t)?n!==n&&t!==t:m(n,t,j,r,e,u)}function m(n,t,r,e,u,o){var i=Pn(n),f=Pn(t),a="[object Array]",l="[object Array]";i||(a=kn.call(n),"[object Arguments]"==a&&(a="[object Object]")),f||(l=kn.call(t),"[object Arguments]"==l&&(l="[object Object]"));var p="[object Object]"==a&&!c(n),f="[object Object]"==l&&!c(t);return!(l=a==l)||i||p?2&u||(a=p&&En.call(n,"__wrapped__"),
|
||||||
|
f=f&&En.call(t,"__wrapped__"),!a&&!f)?l?(o||(o=[]),(a=J(o,function(t){return t[0]===n}))&&a[1]?a[1]==t:(o.push([n,t]),t=(i?I:q)(n,t,r,e,u,o),o.pop(),t)):false:r(a?n.value():n,f?t.value():t,e,u,o):$(n,t,a)}function d(n){var t=typeof n;return"function"==t?n:null==n?cn:("object"==t?x:A)(n)}function w(n){n=null==n?n:Object(n);var t,r=[];for(t in n)r.push(t);return r}function O(n,t){var r=-1,e=L(n)?Array(n.length):[];return $n(n,function(n,u,o){e[++r]=t(n,u,o)}),e}function x(n){var t=en(n);return function(r){
|
||||||
|
var e=t.length;if(null==r)return!e;for(r=Object(r);e--;){var u=t[e];if(!(u in r&&j(n[u],r[u],an,3)))return false}return true}}function E(n,t){return n=Object(n),P(t,function(t,r){return r in n&&(t[r]=n[r]),t},{})}function A(n){return function(t){return null==t?an:t[n]}}function k(n,t,r){var e=-1,u=n.length;for(0>t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Array(u);++e<u;)r[e]=n[e+t];return r}function N(n){return k(n,0,n.length)}function S(n,t){var r;return $n(n,function(n,e,u){return r=t(n,e,u),
|
||||||
|
!r}),!!r}function T(t,r){return P(r,function(t,r){return r.func.apply(r.thisArg,n([t],r.args))},t)}function F(n,t,r,e){r||(r={});for(var u=-1,o=t.length;++u<o;){var i=t[u],c=e?e(r[i],n[i],i,r,n):n[i],f=r,a=f[i];En.call(f,i)&&(a===c||a!==a&&c!==c)&&(c!==an||i in f)||(f[i]=c)}return r}function R(n){return V(function(t,r){var e=-1,u=r.length,o=u>1?r[u-1]:an,o=typeof o=="function"?(u--,o):an;for(t=Object(t);++e<u;){var i=r[e];i&&n(t,i,e,o)}return t})}function B(n){return function(){var t=arguments,r=s(n.prototype),t=n.apply(r,t);
|
||||||
|
return X(t)?t:r}}function D(n,t,r){function e(){for(var o=-1,i=arguments.length,c=-1,f=r.length,a=Array(f+i),l=this&&this!==wn&&this instanceof e?u:n;++c<f;)a[c]=r[c];for(;i--;)a[c++]=arguments[++o];return l.apply(t,a)}if(typeof n!="function")throw new TypeError("Expected a function");var u=B(n);return e}function I(n,t,r,e,u,o){var i=-1,c=1&u,f=n.length,a=t.length;if(f!=a&&!(2&u&&a>f))return false;for(a=true;++i<f;){var l=n[i],p=t[i];if(void 0!==an){a=false;break}if(c){if(!S(t,function(n){return l===n||r(l,n,e,u,o);
|
||||||
|
})){a=false;break}}else if(l!==p&&!r(l,p,e,u,o)){a=false;break}}return a}function $(n,t,r){switch(r){case"[object Boolean]":case"[object Date]":return+n==+t;case"[object Error]":return n.name==t.name&&n.message==t.message;case"[object Number]":return n!=+n?t!=+t:n==+t;case"[object RegExp]":case"[object String]":return n==t+""}return false}function q(n,t,r,e,u,o){var i=2&u,c=en(n),f=c.length,a=en(t).length;if(f!=a&&!i)return false;for(var l=f;l--;){var p=c[l];if(!(i?p in t:En.call(t,p)))return false}for(a=true;++l<f;){
|
||||||
|
var p=c[l],s=n[p],h=t[p];if(void 0!==an||s!==h&&!r(s,h,e,u,o)){a=false;break}i||(i="constructor"==p)}return a&&!i&&(r=n.constructor,e=t.constructor,r!=e&&"constructor"in n&&"constructor"in t&&!(typeof r=="function"&&r instanceof r&&typeof e=="function"&&e instanceof e)&&(a=false)),a}function z(n){var t=n?n.length:an;if(W(t)&&(Pn(n)||nn(n)||K(n))){n=String;for(var r=-1,e=Array(t);++r<t;)e[r]=n(r);t=e}else t=null;return t}function C(n){var t=n&&n.constructor,t=Q(t)&&t.prototype||xn;return n===t}function G(n){
|
||||||
|
return n?n[0]:an}function J(n,t){return r(n,d(t),$n)}function M(n,t){return $n(n,typeof t=="function"?t:cn)}function P(n,t,r){return e(n,d(t),r,3>arguments.length,$n)}function U(n,t){var r;if(typeof t!="function")throw new TypeError("Expected a function");return n=Un(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=an),r}}function V(n){var t;if(typeof n!="function")throw new TypeError("Expected a function");return t=In(t===an?n.length-1:Un(t),0),function(){for(var r=arguments,e=-1,u=In(r.length-t,0),o=Array(u);++e<u;)o[e]=r[t+e];
|
||||||
|
for(u=Array(t+1),e=-1;++e<t;)u[e]=r[e];return u[t]=o,n.apply(this,u)}}function H(n,t){return n>t}function K(n){return Y(n)&&L(n)&&En.call(n,"callee")&&(!Rn.call(n,"callee")||"[object Arguments]"==kn.call(n))}function L(n){return null!=n&&!(typeof n=="function"&&Q(n))&&W(zn(n))}function Q(n){return n=X(n)?kn.call(n):"","[object Function]"==n||"[object GeneratorFunction]"==n}function W(n){return typeof n=="number"&&n>-1&&0==n%1&&9007199254740991>=n}function X(n){var t=typeof n;return!!n&&("object"==t||"function"==t);
|
||||||
|
}function Y(n){return!!n&&typeof n=="object"}function Z(n){return typeof n=="number"||Y(n)&&"[object Number]"==kn.call(n)}function nn(n){return typeof n=="string"||!Pn(n)&&Y(n)&&"[object String]"==kn.call(n)}function tn(n,t){return t>n}function rn(n){return typeof n=="string"?n:null==n?"":n+""}function en(n){var t=C(n);if(!t&&!L(n))return Dn(Object(n));var r,e=z(n),u=!!e,e=e||[],o=e.length;for(r in n)!En.call(n,r)||u&&("length"==r||f(r,o))||t&&"constructor"==r||e.push(r);return e}function un(n){for(var t=-1,r=C(n),e=w(n),u=e.length,o=z(n),i=!!o,o=o||[],c=o.length;++t<u;){
|
||||||
|
var a=e[t];i&&("length"==a||f(a,c))||"constructor"==a&&(r||!En.call(n,a))||o.push(a)}return o}function on(n){return n?u(n,en(n)):[]}function cn(n){return n}function fn(t,r,e){var u=en(r),o=b(r,u);null!=e||X(r)&&(o.length||!u.length)||(e=r,r=t,t=this,o=b(r,en(r)));var i=X(e)&&"chain"in e?e.chain:true,c=Q(t);return $n(o,function(e){var u=r[e];t[e]=u,c&&(t.prototype[e]=function(){var r=this.__chain__;if(i||r){var e=t(this.__wrapped__);return(e.__actions__=N(this.__actions__)).push({func:u,args:arguments,
|
||||||
|
thisArg:t}),e.__chain__=r,e}return u.apply(t,n([this.value()],arguments))})}),t}var an,ln=1/0,pn=/[&<>"'`]/g,sn=RegExp(pn.source),hn=/^(?:0|[1-9]\d*)$/,vn={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},yn={"function":true,object:true},_n=yn[typeof exports]&&exports&&!exports.nodeType?exports:an,gn=yn[typeof module]&&module&&!module.nodeType?module:an,bn=gn&&gn.exports===_n?_n:an,jn=o(yn[typeof self]&&self),mn=o(yn[typeof window]&&window),dn=o(yn[typeof this]&&this),wn=o(_n&&gn&&typeof global=="object"&&global)||mn!==(dn&&dn.window)&&mn||jn||dn||Function("return this")(),On=Array.prototype,xn=Object.prototype,En=xn.hasOwnProperty,An=0,kn=xn.toString,Nn=wn._,Sn=wn.Reflect,Tn=Sn?Sn.f:an,Fn=Object.create,Rn=xn.propertyIsEnumerable,Bn=wn.isFinite,Dn=Object.keys,In=Math.max,$n=function(n,t){
|
||||||
|
return function(r,e){if(null==r)return r;if(!L(r))return n(r,e);for(var u=r.length,o=t?u:-1,i=Object(r);(t?o--:++o<u)&&false!==e(i[o],o,i););return r}}(g),qn=function(n){return function(t,r,e){var u=-1,o=Object(t);e=e(t);for(var i=e.length;i--;){var c=e[n?i:++u];if(false===r(o[c],c,o))break}return t}}();Tn&&!Rn.call({valueOf:1},"valueOf")&&(w=function(n){n=Tn(n);for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r});var zn=A("length"),Cn=V(function(t,r){return Pn(t)||(t=null==t?[]:[Object(t)]),_(r,1),
|
||||||
|
n(N(t),on)}),Gn=V(function(n,t,r){return D(n,t,r)}),Jn=V(function(n,t){return h(n,1,t)}),Mn=V(function(n,t,r){return h(n,Vn(t)||0,r)}),Pn=Array.isArray,Un=Number,Vn=Number,Hn=R(function(n,t){F(t,en(t),n)}),Kn=R(function(n,t){F(t,un(t),n)}),Ln=R(function(n,t,r,e){F(t,un(t),n,e)}),Qn=V(function(n){return n.push(an,p),Ln.apply(an,n)}),Wn=V(function(n,t){return null==n?{}:E(n,_(t,1))}),Xn=d;l.prototype=s(a.prototype),l.prototype.constructor=l,a.assignIn=Kn,a.before=U,a.bind=Gn,a.chain=function(n){return n=a(n),
|
||||||
|
n.__chain__=true,n},a.compact=function(n){return y(n,Boolean)},a.concat=Cn,a.create=function(n,t){var r=s(n);return t?Hn(r,t):r},a.defaults=Qn,a.defer=Jn,a.delay=Mn,a.filter=function(n,t){return y(n,d(t))},a.flatten=function(n){return n&&n.length?_(n,1):[]},a.flattenDeep=function(n){return n&&n.length?_(n,ln):[]},a.iteratee=Xn,a.keys=en,a.map=function(n,t){return O(n,d(t))},a.matches=function(n){return x(Hn({},n))},a.mixin=fn,a.negate=function(n){if(typeof n!="function")throw new TypeError("Expected a function");
|
||||||
|
return function(){return!n.apply(this,arguments)}},a.once=function(n){return U(2,n)},a.pick=Wn,a.slice=function(n,t,r){var e=n?n.length:0;return r=r===an?e:+r,e?k(n,null==t?0:+t,r):[]},a.sortBy=function(n,t){var r=0;return t=d(t),O(O(n,function(n,e,u){return{c:n,b:r++,a:t(n,e,u)}}).sort(function(n,t){var r;n:{r=n.a;var e=t.a;if(r!==e){var u=null===r,o=r===an,i=r===r,c=null===e,f=e===an,a=e===e;if(r>e&&!c||!i||u&&!f&&a||o&&a){r=1;break n}if(e>r&&!u||!a||c&&!o&&i||f&&i){r=-1;break n}}r=0}return r||n.b-t.b;
|
||||||
|
}),A("c"))},a.tap=function(n,t){return t(n),n},a.thru=function(n,t){return t(n)},a.toArray=function(n){return L(n)?n.length?N(n):[]:on(n)},a.values=on,a.extend=Kn,fn(a,a),a.clone=function(n){return X(n)?Pn(n)?N(n):F(n,en(n)):n},a.escape=function(n){return(n=rn(n))&&sn.test(n)?n.replace(pn,i):n},a.every=function(n,t,r){return t=r?an:t,v(n,d(t))},a.find=J,a.forEach=M,a.has=function(n,t){return null!=n&&En.call(n,t)},a.head=G,a.identity=cn,a.indexOf=function(n,t,r){var e=n?n.length:0;r=typeof r=="number"?0>r?In(e+r,0):r:0,
|
||||||
|
r=(r||0)-1;for(var u=t===t;++r<e;){var o=n[r];if(u?o===t:o!==o)return r}return-1},a.isArguments=K,a.isArray=Pn,a.isBoolean=function(n){return true===n||false===n||Y(n)&&"[object Boolean]"==kn.call(n)},a.isDate=function(n){return Y(n)&&"[object Date]"==kn.call(n)},a.isEmpty=function(n){if(L(n)&&(Pn(n)||nn(n)||Q(n.splice)||K(n)))return!n.length;for(var t in n)if(En.call(n,t))return false;return true},a.isEqual=function(n,t){return j(n,t)},a.isFinite=function(n){return typeof n=="number"&&Bn(n)},a.isFunction=Q,a.isNaN=function(n){
|
||||||
|
return Z(n)&&n!=+n},a.isNull=function(n){return null===n},a.isNumber=Z,a.isObject=X,a.isRegExp=function(n){return X(n)&&"[object RegExp]"==kn.call(n)},a.isString=nn,a.isUndefined=function(n){return n===an},a.last=function(n){var t=n?n.length:0;return t?n[t-1]:an},a.max=function(n){return n&&n.length?t(n,cn,H):an},a.min=function(n){return n&&n.length?t(n,cn,tn):an},a.noConflict=function(){return wn._===this&&(wn._=Nn),this},a.noop=function(){},a.reduce=P,a.result=function(n,t,r){return t=null==n?an:n[t],
|
||||||
|
t===an&&(t=r),Q(t)?t.call(n):t},a.size=function(n){return null==n?0:(n=L(n)?n:en(n),n.length)},a.some=function(n,t,r){return t=r?an:t,S(n,d(t))},a.uniqueId=function(n){var t=++An;return rn(n)+t},a.each=M,a.first=G,fn(a,function(){var n={};return g(a,function(t,r){En.call(a.prototype,r)||(n[r]=t)}),n}(),{chain:false}),a.VERSION="4.5.1",$n("pop join replace reverse split push shift sort splice unshift".split(" "),function(n){var t=(/^(?:replace|split)$/.test(n)?String.prototype:On)[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|join|replace|shift)$/.test(n);
|
||||||
|
a.prototype[n]=function(){var n=arguments;return e&&!this.__chain__?t.apply(this.value(),n):this[r](function(r){return t.apply(r,n)})}}),a.prototype.toJSON=a.prototype.valueOf=a.prototype.value=function(){return T(this.__wrapped__,this.__actions__)},(mn||jn||{})._=a,typeof define=="function"&&typeof define.amd=="object"&&define.amd? define(function(){return a}):_n&&gn?(bn&&((gn.exports=a)._=a),_n._=a):wn._=a}).call(this);
|
||||||
647
dist/lodash.fp.js
vendored
Normal file
647
dist/lodash.fp.js
vendored
Normal file
@@ -0,0 +1,647 @@
|
|||||||
|
(function webpackUniversalModuleDefinition(root, factory) {
|
||||||
|
if(typeof exports === 'object' && typeof module === 'object')
|
||||||
|
module.exports = factory();
|
||||||
|
else if(typeof define === 'function' && define.amd)
|
||||||
|
define([], factory);
|
||||||
|
else if(typeof exports === 'object')
|
||||||
|
exports["fp"] = factory();
|
||||||
|
else
|
||||||
|
root["fp"] = factory();
|
||||||
|
})(this, function() {
|
||||||
|
return /******/ (function(modules) { // webpackBootstrap
|
||||||
|
/******/ // The module cache
|
||||||
|
/******/ var installedModules = {};
|
||||||
|
|
||||||
|
/******/ // The require function
|
||||||
|
/******/ function __webpack_require__(moduleId) {
|
||||||
|
|
||||||
|
/******/ // Check if module is in cache
|
||||||
|
/******/ if(installedModules[moduleId])
|
||||||
|
/******/ return installedModules[moduleId].exports;
|
||||||
|
|
||||||
|
/******/ // Create a new module (and put it into the cache)
|
||||||
|
/******/ var module = installedModules[moduleId] = {
|
||||||
|
/******/ exports: {},
|
||||||
|
/******/ id: moduleId,
|
||||||
|
/******/ loaded: false
|
||||||
|
/******/ };
|
||||||
|
|
||||||
|
/******/ // Execute the module function
|
||||||
|
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
||||||
|
|
||||||
|
/******/ // Flag the module as loaded
|
||||||
|
/******/ module.loaded = true;
|
||||||
|
|
||||||
|
/******/ // Return the exports of the module
|
||||||
|
/******/ return module.exports;
|
||||||
|
/******/ }
|
||||||
|
|
||||||
|
|
||||||
|
/******/ // expose the modules object (__webpack_modules__)
|
||||||
|
/******/ __webpack_require__.m = modules;
|
||||||
|
|
||||||
|
/******/ // expose the module cache
|
||||||
|
/******/ __webpack_require__.c = installedModules;
|
||||||
|
|
||||||
|
/******/ // __webpack_public_path__
|
||||||
|
/******/ __webpack_require__.p = "";
|
||||||
|
|
||||||
|
/******/ // Load entry module and return exports
|
||||||
|
/******/ return __webpack_require__(0);
|
||||||
|
/******/ })
|
||||||
|
/************************************************************************/
|
||||||
|
/******/ ([
|
||||||
|
/* 0 */
|
||||||
|
/***/ function(module, exports, __webpack_require__) {
|
||||||
|
|
||||||
|
var baseConvert = __webpack_require__(1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts `lodash` to an immutable auto-curried iteratee-first data-last version.
|
||||||
|
*
|
||||||
|
* @param {Function} lodash The lodash function.
|
||||||
|
* @param {Object} [options] The options object. See `baseConvert` for more details.
|
||||||
|
* @returns {Function} Returns the converted `lodash`.
|
||||||
|
*/
|
||||||
|
function browserConvert(lodash, options) {
|
||||||
|
return baseConvert(lodash, lodash, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof _ == 'function') {
|
||||||
|
_ = browserConvert(_.runInContext());
|
||||||
|
}
|
||||||
|
module.exports = browserConvert;
|
||||||
|
|
||||||
|
|
||||||
|
/***/ },
|
||||||
|
/* 1 */
|
||||||
|
/***/ function(module, exports, __webpack_require__) {
|
||||||
|
|
||||||
|
var mapping = __webpack_require__(2),
|
||||||
|
mutateMap = mapping.mutate,
|
||||||
|
placeholder = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `convert` which accepts a `util` object of methods
|
||||||
|
* required to perform conversions.
|
||||||
|
*
|
||||||
|
* @param {Object} util The util object.
|
||||||
|
* @param {string} name The name of the function to wrap.
|
||||||
|
* @param {Function} func The function to wrap.
|
||||||
|
* @param {Object} [options] The options object.
|
||||||
|
* @param {boolean} [options.cap=true] Specify capping iteratee arguments.
|
||||||
|
* @param {boolean} [options.curry=true] Specify currying.
|
||||||
|
* @param {boolean} [options.fixed=true] Specify fixed arity.
|
||||||
|
* @param {boolean} [options.immutable=true] Specify immutable operations.
|
||||||
|
* @param {boolean} [options.rearg=true] Specify rearranging arguments.
|
||||||
|
* @returns {Function|Object} Returns the converted function or object.
|
||||||
|
*/
|
||||||
|
function baseConvert(util, name, func, options) {
|
||||||
|
var setPlaceholder,
|
||||||
|
isLib = typeof name == 'function',
|
||||||
|
isObj = name === Object(name);
|
||||||
|
|
||||||
|
if (isObj) {
|
||||||
|
options = func;
|
||||||
|
func = name;
|
||||||
|
name = undefined;
|
||||||
|
}
|
||||||
|
if (func == null) {
|
||||||
|
throw new TypeError;
|
||||||
|
}
|
||||||
|
options || (options = {});
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
'cap': 'cap' in options ? options.cap : true,
|
||||||
|
'curry': 'curry' in options ? options.curry : true,
|
||||||
|
'fixed': 'fixed' in options ? options.fixed : true,
|
||||||
|
'immutable': 'immutable' in options ? options.immutable : true,
|
||||||
|
'rearg': 'rearg' in options ? options.rearg : true
|
||||||
|
};
|
||||||
|
|
||||||
|
var forceRearg = ('rearg' in options) && options.rearg;
|
||||||
|
|
||||||
|
var helpers = isLib ? func : {
|
||||||
|
'ary': util.ary,
|
||||||
|
'clone': util.clone,
|
||||||
|
'curry': util.curry,
|
||||||
|
'forEach': util.forEach,
|
||||||
|
'isArray': util.isArray,
|
||||||
|
'isFunction': util.isFunction,
|
||||||
|
'iteratee': util.iteratee,
|
||||||
|
'keys': util.keys,
|
||||||
|
'rearg': util.rearg,
|
||||||
|
'spread': util.spread,
|
||||||
|
'toPath': util.toPath
|
||||||
|
};
|
||||||
|
|
||||||
|
var ary = helpers.ary,
|
||||||
|
clone = helpers.clone,
|
||||||
|
curry = helpers.curry,
|
||||||
|
each = helpers.forEach,
|
||||||
|
isArray = helpers.isArray,
|
||||||
|
isFunction = helpers.isFunction,
|
||||||
|
keys = helpers.keys,
|
||||||
|
rearg = helpers.rearg,
|
||||||
|
spread = helpers.spread,
|
||||||
|
toPath = helpers.toPath;
|
||||||
|
|
||||||
|
var aryMethodKeys = keys(mapping.aryMethod);
|
||||||
|
|
||||||
|
var baseArity = function(func, n) {
|
||||||
|
return n == 2
|
||||||
|
? function(a, b) { return func.apply(undefined, arguments); }
|
||||||
|
: function(a) { return func.apply(undefined, arguments); };
|
||||||
|
};
|
||||||
|
|
||||||
|
var baseAry = function(func, n) {
|
||||||
|
return n == 2
|
||||||
|
? function(a, b) { return func(a, b); }
|
||||||
|
: function(a) { return func(a); };
|
||||||
|
};
|
||||||
|
|
||||||
|
var cloneArray = function(array) {
|
||||||
|
var length = array ? array.length : 0,
|
||||||
|
result = Array(length);
|
||||||
|
|
||||||
|
while (length--) {
|
||||||
|
result[length] = array[length];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
var cloneByPath = function(object, path) {
|
||||||
|
path = toPath(path);
|
||||||
|
|
||||||
|
var index = -1,
|
||||||
|
length = path.length,
|
||||||
|
result = clone(Object(object)),
|
||||||
|
nested = result;
|
||||||
|
|
||||||
|
while (nested != null && ++index < length) {
|
||||||
|
var key = path[index],
|
||||||
|
value = nested[key];
|
||||||
|
|
||||||
|
if (value != null) {
|
||||||
|
nested[key] = clone(Object(value));
|
||||||
|
}
|
||||||
|
nested = nested[key];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
var createCloner = function(func) {
|
||||||
|
return function(object) {
|
||||||
|
return func({}, object);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var immutWrap = function(func, cloner) {
|
||||||
|
return function() {
|
||||||
|
var length = arguments.length;
|
||||||
|
if (!length) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
var args = Array(length);
|
||||||
|
while (length--) {
|
||||||
|
args[length] = arguments[length];
|
||||||
|
}
|
||||||
|
var result = args[0] = cloner.apply(undefined, args);
|
||||||
|
func.apply(undefined, args);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var iterateeAry = function(func, n) {
|
||||||
|
return overArg(func, function(func) {
|
||||||
|
return typeof func == 'function' ? baseAry(func, n) : func;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
var iterateeRearg = function(func, indexes) {
|
||||||
|
return overArg(func, function(func) {
|
||||||
|
var n = indexes.length;
|
||||||
|
return baseArity(rearg(baseAry(func, n), indexes), n);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
var overArg = function(func, iteratee, retArg) {
|
||||||
|
return function() {
|
||||||
|
var length = arguments.length;
|
||||||
|
if (!length) {
|
||||||
|
return func();
|
||||||
|
}
|
||||||
|
var args = Array(length);
|
||||||
|
while (length--) {
|
||||||
|
args[length] = arguments[length];
|
||||||
|
}
|
||||||
|
var index = config.rearg ? 0 : (length - 1);
|
||||||
|
args[index] = iteratee(args[index]);
|
||||||
|
return func.apply(undefined, args);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var wrappers = {
|
||||||
|
'castArray': function(castArray) {
|
||||||
|
return function() {
|
||||||
|
var value = arguments[0];
|
||||||
|
return isArray(value)
|
||||||
|
? castArray(cloneArray(value))
|
||||||
|
: castArray.apply(undefined, arguments);
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'iteratee': function(iteratee) {
|
||||||
|
return function() {
|
||||||
|
var func = arguments[0],
|
||||||
|
arity = arguments[1],
|
||||||
|
result = iteratee(func, arity),
|
||||||
|
length = result.length;
|
||||||
|
|
||||||
|
if (config.cap && typeof arity == 'number') {
|
||||||
|
arity = arity > 2 ? (arity - 2) : 1;
|
||||||
|
return (length && length <= arity) ? result : baseAry(result, arity);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'mixin': function(mixin) {
|
||||||
|
return function(source) {
|
||||||
|
var func = this;
|
||||||
|
if (!isFunction(func)) {
|
||||||
|
return mixin(func, Object(source));
|
||||||
|
}
|
||||||
|
var methods = [],
|
||||||
|
methodNames = [];
|
||||||
|
|
||||||
|
each(keys(source), function(key) {
|
||||||
|
var value = source[key];
|
||||||
|
if (isFunction(value)) {
|
||||||
|
methodNames.push(key);
|
||||||
|
methods.push(func.prototype[key]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
mixin(func, Object(source));
|
||||||
|
|
||||||
|
each(methodNames, function(methodName, index) {
|
||||||
|
var method = methods[index];
|
||||||
|
if (isFunction(method)) {
|
||||||
|
func.prototype[methodName] = method;
|
||||||
|
} else {
|
||||||
|
delete func.prototype[methodName];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return func;
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'runInContext': function(runInContext) {
|
||||||
|
return function(context) {
|
||||||
|
return baseConvert(util, runInContext(context), options);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var wrap = function(name, func) {
|
||||||
|
name = mapping.aliasToReal[name] || name;
|
||||||
|
var wrapper = wrappers[name];
|
||||||
|
if (wrapper) {
|
||||||
|
return wrapper(func);
|
||||||
|
}
|
||||||
|
var wrapped = func;
|
||||||
|
if (config.immutable) {
|
||||||
|
if (mutateMap.array[name]) {
|
||||||
|
wrapped = immutWrap(func, cloneArray);
|
||||||
|
}
|
||||||
|
else if (mutateMap.object[name]) {
|
||||||
|
wrapped = immutWrap(func, createCloner(func));
|
||||||
|
}
|
||||||
|
else if (mutateMap.set[name]) {
|
||||||
|
wrapped = immutWrap(func, cloneByPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var result;
|
||||||
|
each(aryMethodKeys, function(aryKey) {
|
||||||
|
each(mapping.aryMethod[aryKey], function(otherName) {
|
||||||
|
if (name == otherName) {
|
||||||
|
var aryN = !isLib && mapping.iterateeAry[name],
|
||||||
|
reargIndexes = mapping.iterateeRearg[name],
|
||||||
|
spreadStart = mapping.methodSpread[name];
|
||||||
|
|
||||||
|
result = wrapped;
|
||||||
|
if (config.fixed) {
|
||||||
|
result = spreadStart === undefined
|
||||||
|
? ary(result, aryKey)
|
||||||
|
: spread(result, spreadStart);
|
||||||
|
}
|
||||||
|
if (config.rearg && aryKey > 1 && (forceRearg || !mapping.skipRearg[name])) {
|
||||||
|
result = rearg(result, mapping.methodRearg[name] || mapping.aryRearg[aryKey]);
|
||||||
|
}
|
||||||
|
if (config.cap) {
|
||||||
|
if (reargIndexes) {
|
||||||
|
result = iterateeRearg(result, reargIndexes);
|
||||||
|
} else if (aryN) {
|
||||||
|
result = iterateeAry(result, aryN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (config.curry && aryKey > 1) {
|
||||||
|
result = curry(result, aryKey);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return !result;
|
||||||
|
});
|
||||||
|
|
||||||
|
result || (result = wrapped);
|
||||||
|
if (mapping.placeholder[name]) {
|
||||||
|
setPlaceholder = true;
|
||||||
|
func.placeholder = result.placeholder = placeholder;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!isObj) {
|
||||||
|
return wrap(name, func);
|
||||||
|
}
|
||||||
|
var _ = func;
|
||||||
|
|
||||||
|
// Iterate over methods for the current ary cap.
|
||||||
|
var pairs = [];
|
||||||
|
each(aryMethodKeys, function(aryKey) {
|
||||||
|
each(mapping.aryMethod[aryKey], function(key) {
|
||||||
|
var func = _[mapping.remap[key] || key];
|
||||||
|
if (func) {
|
||||||
|
pairs.push([key, wrap(key, func)]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Assign to `_` leaving `_.prototype` unchanged to allow chaining.
|
||||||
|
each(pairs, function(pair) {
|
||||||
|
_[pair[0]] = pair[1];
|
||||||
|
});
|
||||||
|
|
||||||
|
if (setPlaceholder) {
|
||||||
|
_.placeholder = placeholder;
|
||||||
|
}
|
||||||
|
// Wrap the lodash method and its aliases.
|
||||||
|
each(keys(_), function(key) {
|
||||||
|
each(mapping.realToAlias[key] || [], function(alias) {
|
||||||
|
_[alias] = _[key];
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return _;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseConvert;
|
||||||
|
|
||||||
|
|
||||||
|
/***/ },
|
||||||
|
/* 2 */
|
||||||
|
/***/ function(module, exports) {
|
||||||
|
|
||||||
|
/** Used to map aliases to their real names. */
|
||||||
|
exports.aliasToReal = {
|
||||||
|
'__': 'placeholder',
|
||||||
|
'all': 'some',
|
||||||
|
'allPass': 'overEvery',
|
||||||
|
'apply': 'spread',
|
||||||
|
'assoc': 'set',
|
||||||
|
'assocPath': 'set',
|
||||||
|
'compose': 'flowRight',
|
||||||
|
'contains': 'includes',
|
||||||
|
'dissoc': 'unset',
|
||||||
|
'dissocPath': 'unset',
|
||||||
|
'each': 'forEach',
|
||||||
|
'eachRight': 'forEachRight',
|
||||||
|
'equals': 'isEqual',
|
||||||
|
'extend': 'assignIn',
|
||||||
|
'extendWith': 'assignInWith',
|
||||||
|
'first': 'head',
|
||||||
|
'init': 'initial',
|
||||||
|
'mapObj': 'mapValues',
|
||||||
|
'omitAll': 'omit',
|
||||||
|
'nAry': 'ary',
|
||||||
|
'path': 'get',
|
||||||
|
'pathEq': 'matchesProperty',
|
||||||
|
'pathOr': 'getOr',
|
||||||
|
'pickAll': 'pick',
|
||||||
|
'pipe': 'flow',
|
||||||
|
'prop': 'get',
|
||||||
|
'propOf': 'propertyOf',
|
||||||
|
'propOr': 'getOr',
|
||||||
|
'somePass': 'overSome',
|
||||||
|
'unapply': 'rest',
|
||||||
|
'unnest': 'flatten',
|
||||||
|
'useWith': 'overArgs',
|
||||||
|
'whereEq': 'filter',
|
||||||
|
'zipObj': 'zipObject'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map ary to method names. */
|
||||||
|
exports.aryMethod = {
|
||||||
|
'1': [
|
||||||
|
'attempt', 'castArray', 'ceil', 'create', 'curry', 'curryRight', 'floor',
|
||||||
|
'fromPairs', 'invert', 'iteratee', 'memoize', 'method', 'methodOf', 'mixin',
|
||||||
|
'over', 'overEvery', 'overSome', 'rest', 'reverse', 'round', 'runInContext',
|
||||||
|
'spread', 'template', 'trim', 'trimEnd', 'trimStart', 'uniqueId', 'words'
|
||||||
|
],
|
||||||
|
'2': [
|
||||||
|
'add', 'after', 'ary', 'assign', 'assignIn', 'at', 'before', 'bind', 'bindKey',
|
||||||
|
'chunk', 'cloneDeepWith', 'cloneWith', 'concat', 'countBy', 'curryN',
|
||||||
|
'curryRightN', 'debounce', 'defaults', 'defaultsDeep', 'delay', 'difference',
|
||||||
|
'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith', 'eq', 'every',
|
||||||
|
'filter', 'find', 'find', 'findIndex', 'findKey', 'findLast', 'findLastIndex',
|
||||||
|
'findLastKey', 'flatMap', 'flattenDepth', 'forEach', 'forEachRight', 'forIn',
|
||||||
|
'forInRight', 'forOwn', 'forOwnRight', 'get', 'groupBy', 'gt', 'gte', 'has',
|
||||||
|
'hasIn', 'includes', 'indexOf', 'intersection', 'invertBy', 'invoke', 'invokeMap',
|
||||||
|
'isEqual', 'isMatch', 'join', 'keyBy', 'lastIndexOf', 'lt', 'lte', 'map',
|
||||||
|
'mapKeys', 'mapValues', 'matchesProperty', 'maxBy', 'merge', 'minBy', 'omit',
|
||||||
|
'omitBy', 'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt',
|
||||||
|
'partial', 'partialRight', 'partition', 'pick', 'pickBy', 'pull', 'pullAll',
|
||||||
|
'pullAt', 'random', 'range', 'rangeRight', 'rearg', 'reject', 'remove',
|
||||||
|
'repeat', 'result', 'sampleSize', 'some', 'sortBy', 'sortedIndex',
|
||||||
|
'sortedIndexOf', 'sortedLastIndex', 'sortedLastIndexOf', 'sortedUniqBy',
|
||||||
|
'split', 'startsWith', 'subtract', 'sumBy', 'take', 'takeRight', 'takeRightWhile',
|
||||||
|
'takeWhile', 'tap', 'throttle', 'thru', 'times', 'trimChars', 'trimCharsEnd',
|
||||||
|
'trimCharsStart', 'truncate', 'union', 'uniqBy', 'uniqWith', 'unset',
|
||||||
|
'unzipWith', 'without', 'wrap', 'xor', 'zip', 'zipObject', 'zipObjectDeep'
|
||||||
|
],
|
||||||
|
'3': [
|
||||||
|
'assignInWith', 'assignWith', 'clamp', 'differenceBy', 'differenceWith',
|
||||||
|
'getOr', 'inRange', 'intersectionBy', 'intersectionWith', 'isEqualWith',
|
||||||
|
'isMatchWith', 'mergeWith', 'orderBy', 'pullAllBy', 'reduce', 'reduceRight',
|
||||||
|
'replace', 'set', 'slice', 'sortedIndexBy', 'sortedLastIndexBy', 'transform',
|
||||||
|
'unionBy', 'unionWith', 'xorBy', 'xorWith', 'zipWith'
|
||||||
|
],
|
||||||
|
'4': [
|
||||||
|
'fill', 'setWith'
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map ary to rearg configs. */
|
||||||
|
exports.aryRearg = {
|
||||||
|
'2': [1, 0],
|
||||||
|
'3': [2, 0, 1],
|
||||||
|
'4': [3, 2, 0, 1]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to their iteratee ary. */
|
||||||
|
exports.iterateeAry = {
|
||||||
|
'assignWith': 2,
|
||||||
|
'assignInWith': 2,
|
||||||
|
'cloneDeepWith': 1,
|
||||||
|
'cloneWith': 1,
|
||||||
|
'dropRightWhile': 1,
|
||||||
|
'dropWhile': 1,
|
||||||
|
'every': 1,
|
||||||
|
'filter': 1,
|
||||||
|
'find': 1,
|
||||||
|
'findIndex': 1,
|
||||||
|
'findKey': 1,
|
||||||
|
'findLast': 1,
|
||||||
|
'findLastIndex': 1,
|
||||||
|
'findLastKey': 1,
|
||||||
|
'flatMap': 1,
|
||||||
|
'forEach': 1,
|
||||||
|
'forEachRight': 1,
|
||||||
|
'forIn': 1,
|
||||||
|
'forInRight': 1,
|
||||||
|
'forOwn': 1,
|
||||||
|
'forOwnRight': 1,
|
||||||
|
'isEqualWith': 2,
|
||||||
|
'isMatchWith': 2,
|
||||||
|
'map': 1,
|
||||||
|
'mapKeys': 1,
|
||||||
|
'mapValues': 1,
|
||||||
|
'partition': 1,
|
||||||
|
'reduce': 2,
|
||||||
|
'reduceRight': 2,
|
||||||
|
'reject': 1,
|
||||||
|
'remove': 1,
|
||||||
|
'some': 1,
|
||||||
|
'takeRightWhile': 1,
|
||||||
|
'takeWhile': 1,
|
||||||
|
'times': 1,
|
||||||
|
'transform': 2
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to iteratee rearg configs. */
|
||||||
|
exports.iterateeRearg = {
|
||||||
|
'mapKeys': [1]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to rearg configs. */
|
||||||
|
exports.methodRearg = {
|
||||||
|
'assignInWith': [1, 2, 0],
|
||||||
|
'assignWith': [1, 2, 0],
|
||||||
|
'getOr': [2, 1, 0],
|
||||||
|
'isMatchWith': [2, 1, 0],
|
||||||
|
'mergeWith': [1, 2, 0],
|
||||||
|
'pullAllBy': [2, 1, 0],
|
||||||
|
'setWith': [3, 1, 2, 0],
|
||||||
|
'sortedIndexBy': [2, 1, 0],
|
||||||
|
'sortedLastIndexBy': [2, 1, 0],
|
||||||
|
'zipWith': [1, 2, 0]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to spread configs. */
|
||||||
|
exports.methodSpread = {
|
||||||
|
'partial': 1,
|
||||||
|
'partialRight': 1
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to identify methods which mutate arrays or objects. */
|
||||||
|
exports.mutate = {
|
||||||
|
'array': {
|
||||||
|
'fill': true,
|
||||||
|
'pull': true,
|
||||||
|
'pullAll': true,
|
||||||
|
'pullAllBy': true,
|
||||||
|
'pullAt': true,
|
||||||
|
'remove': true,
|
||||||
|
'reverse': true
|
||||||
|
},
|
||||||
|
'object': {
|
||||||
|
'assign': true,
|
||||||
|
'assignIn': true,
|
||||||
|
'assignInWith': true,
|
||||||
|
'assignWith': true,
|
||||||
|
'defaults': true,
|
||||||
|
'defaultsDeep': true,
|
||||||
|
'merge': true,
|
||||||
|
'mergeWith': true
|
||||||
|
},
|
||||||
|
'set': {
|
||||||
|
'set': true,
|
||||||
|
'setWith': true,
|
||||||
|
'unset': true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to track methods with placeholder support */
|
||||||
|
exports.placeholder = {
|
||||||
|
'bind': true,
|
||||||
|
'bindKey': true,
|
||||||
|
'curry': true,
|
||||||
|
'curryRight': true,
|
||||||
|
'partial': true,
|
||||||
|
'partialRight': true
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map real names to their aliases. */
|
||||||
|
exports.realToAlias = (function() {
|
||||||
|
var hasOwnProperty = Object.prototype.hasOwnProperty,
|
||||||
|
object = exports.aliasToReal,
|
||||||
|
result = {};
|
||||||
|
|
||||||
|
for (var key in object) {
|
||||||
|
var value = object[key];
|
||||||
|
if (hasOwnProperty.call(result, value)) {
|
||||||
|
result[value].push(key);
|
||||||
|
} else {
|
||||||
|
result[value] = [key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}());
|
||||||
|
|
||||||
|
/** Used to map method names to other names. */
|
||||||
|
exports.remap = {
|
||||||
|
'curryN': 'curry',
|
||||||
|
'curryRightN': 'curryRight',
|
||||||
|
'getOr': 'get',
|
||||||
|
'trimChars': 'trim',
|
||||||
|
'trimCharsEnd': 'trimEnd',
|
||||||
|
'trimCharsStart': 'trimStart'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to track methods that skip `_.rearg`. */
|
||||||
|
exports.skipRearg = {
|
||||||
|
'add': true,
|
||||||
|
'assign': true,
|
||||||
|
'assignIn': true,
|
||||||
|
'concat': true,
|
||||||
|
'difference': true,
|
||||||
|
'gt': true,
|
||||||
|
'gte': true,
|
||||||
|
'lt': true,
|
||||||
|
'lte': true,
|
||||||
|
'matchesProperty': true,
|
||||||
|
'merge': true,
|
||||||
|
'partial': true,
|
||||||
|
'partialRight': true,
|
||||||
|
'random': true,
|
||||||
|
'range': true,
|
||||||
|
'rangeRight': true,
|
||||||
|
'subtract': true,
|
||||||
|
'zip': true,
|
||||||
|
'zipObject': true
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }
|
||||||
|
/******/ ])
|
||||||
|
});
|
||||||
|
;
|
||||||
13
dist/lodash.fp.min.js
vendored
Normal file
13
dist/lodash.fp.min.js
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.fp=e():t.fp=e()}(this,function(){return function(t){function e(n){if(r[n])return r[n].exports;var i=r[n]={exports:{},id:n,loaded:!1};return t[n].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){function n(t,e){return i(t,t,e)}var i=r(1);"function"==typeof _&&(_=n(_.runInContext())),
|
||||||
|
t.exports=n},function(t,e,r){function n(t,e,r,s){var u,c="function"==typeof e,p=e===Object(e);if(p&&(s=r,r=e,e=void 0),null==r)throw new TypeError;s||(s={});var l={cap:"cap"in s?s.cap:!0,curry:"curry"in s?s.curry:!0,fixed:"fixed"in s?s.fixed:!0,immutable:"immutable"in s?s.immutable:!0,rearg:"rearg"in s?s.rearg:!0},f="rearg"in s&&s.rearg,h=c?r:{ary:t.ary,clone:t.clone,curry:t.curry,forEach:t.forEach,isArray:t.isArray,isFunction:t.isFunction,iteratee:t.iteratee,keys:t.keys,rearg:t.rearg,spread:t.spread,
|
||||||
|
toPath:t.toPath},d=h.ary,y=h.clone,g=h.curry,m=h.forEach,v=h.isArray,W=h.isFunction,x=h.keys,R=h.rearg,I=h.spread,O=h.toPath,b=x(i.aryMethod),A=function(t,e){return 2==e?function(e,r){return t.apply(void 0,arguments)}:function(e){return t.apply(void 0,arguments)}},B=function(t,e){return 2==e?function(e,r){return t(e,r)}:function(e){return t(e)}},E=function(t){for(var e=t?t.length:0,r=Array(e);e--;)r[e]=t[e];return r},j=function(t,e){e=O(e);for(var r=-1,n=e.length,i=y(Object(t)),a=i;null!=a&&++r<n;){
|
||||||
|
var o=e[r],s=a[o];null!=s&&(a[o]=y(Object(s))),a=a[o]}return i},k=function(t){return function(e){return t({},e)}},w=function(t,e){return function(){var r=arguments.length;if(!r)return i;for(var n=Array(r);r--;)n[r]=arguments[r];var i=n[0]=e.apply(void 0,n);return t.apply(void 0,n),i}},q=function(t,e){return P(t,function(t){return"function"==typeof t?B(t,e):t})},z=function(t,e){return P(t,function(t){var r=e.length;return A(R(B(t,r),e),r)})},P=function(t,e,r){return function(){var r=arguments.length;
|
||||||
|
if(!r)return t();for(var n=Array(r);r--;)n[r]=arguments[r];var i=l.rearg?0:r-1;return n[i]=e(n[i]),t.apply(void 0,n)}},M={castArray:function(t){return function(){var e=arguments[0];return v(e)?t(E(e)):t.apply(void 0,arguments)}},iteratee:function(t){return function(){var e=arguments[0],r=arguments[1],n=t(e,r),i=n.length;return l.cap&&"number"==typeof r?(r=r>2?r-2:1,i&&r>=i?n:B(n,r)):n}},mixin:function(t){return function(e){var r=this;if(!W(r))return t(r,Object(e));var n=[],i=[];return m(x(e),function(t){
|
||||||
|
var a=e[t];W(a)&&(i.push(t),n.push(r.prototype[t]))}),t(r,Object(e)),m(i,function(t,e){var i=n[e];W(i)?r.prototype[t]=i:delete r.prototype[t]}),r}},runInContext:function(e){return function(r){return n(t,e(r),s)}}},L=function(t,e){t=i.aliasToReal[t]||t;var r=M[t];if(r)return r(e);var n=e;l.immutable&&(a.array[t]?n=w(e,E):a.object[t]?n=w(e,k(e)):a.set[t]&&(n=w(e,j)));var s;return m(b,function(e){return m(i.aryMethod[e],function(r){if(t==r){var a=!c&&i.iterateeAry[t],o=i.iterateeRearg[t],u=i.methodSpread[t];
|
||||||
|
return s=n,l.fixed&&(s=void 0===u?d(s,e):I(s,u)),l.rearg&&e>1&&(f||!i.skipRearg[t])&&(s=R(s,i.methodRearg[t]||i.aryRearg[e])),l.cap&&(o?s=z(s,o):a&&(s=q(s,a))),l.curry&&e>1&&(s=g(s,e)),!1}}),!s}),s||(s=n),i.placeholder[t]&&(u=!0,e.placeholder=s.placeholder=o),s};if(!p)return L(e,r);var S=r,C=[];return m(b,function(t){m(i.aryMethod[t],function(t){var e=S[i.remap[t]||t];e&&C.push([t,L(t,e)])})}),m(C,function(t){S[t[0]]=t[1]}),u&&(S.placeholder=o),m(x(S),function(t){m(i.realToAlias[t]||[],function(e){
|
||||||
|
S[e]=S[t]})}),S}var i=r(2),a=i.mutate,o={};t.exports=n},function(t,e){e.aliasToReal={__:"placeholder",all:"some",allPass:"overEvery",apply:"spread",assoc:"set",assocPath:"set",compose:"flowRight",contains:"includes",dissoc:"unset",dissocPath:"unset",each:"forEach",eachRight:"forEachRight",equals:"isEqual",extend:"assignIn",extendWith:"assignInWith",first:"head",init:"initial",mapObj:"mapValues",omitAll:"omit",nAry:"ary",path:"get",pathEq:"matchesProperty",pathOr:"getOr",pickAll:"pick",pipe:"flow",
|
||||||
|
prop:"get",propOf:"propertyOf",propOr:"getOr",somePass:"overSome",unapply:"rest",unnest:"flatten",useWith:"overArgs",whereEq:"filter",zipObj:"zipObject"},e.aryMethod={1:["attempt","castArray","ceil","create","curry","curryRight","floor","fromPairs","invert","iteratee","memoize","method","methodOf","mixin","over","overEvery","overSome","rest","reverse","round","runInContext","spread","template","trim","trimEnd","trimStart","uniqueId","words"],2:["add","after","ary","assign","assignIn","at","before","bind","bindKey","chunk","cloneDeepWith","cloneWith","concat","countBy","curryN","curryRightN","debounce","defaults","defaultsDeep","delay","difference","drop","dropRight","dropRightWhile","dropWhile","endsWith","eq","every","filter","find","find","findIndex","findKey","findLast","findLastIndex","findLastKey","flatMap","flattenDepth","forEach","forEachRight","forIn","forInRight","forOwn","forOwnRight","get","groupBy","gt","gte","has","hasIn","includes","indexOf","intersection","invertBy","invoke","invokeMap","isEqual","isMatch","join","keyBy","lastIndexOf","lt","lte","map","mapKeys","mapValues","matchesProperty","maxBy","merge","minBy","omit","omitBy","overArgs","pad","padEnd","padStart","parseInt","partial","partialRight","partition","pick","pickBy","pull","pullAll","pullAt","random","range","rangeRight","rearg","reject","remove","repeat","result","sampleSize","some","sortBy","sortedIndex","sortedIndexOf","sortedLastIndex","sortedLastIndexOf","sortedUniqBy","split","startsWith","subtract","sumBy","take","takeRight","takeRightWhile","takeWhile","tap","throttle","thru","times","trimChars","trimCharsEnd","trimCharsStart","truncate","union","uniqBy","uniqWith","unset","unzipWith","without","wrap","xor","zip","zipObject","zipObjectDeep"],
|
||||||
|
3:["assignInWith","assignWith","clamp","differenceBy","differenceWith","getOr","inRange","intersectionBy","intersectionWith","isEqualWith","isMatchWith","mergeWith","orderBy","pullAllBy","reduce","reduceRight","replace","set","slice","sortedIndexBy","sortedLastIndexBy","transform","unionBy","unionWith","xorBy","xorWith","zipWith"],4:["fill","setWith"]},e.aryRearg={2:[1,0],3:[2,0,1],4:[3,2,0,1]},e.iterateeAry={assignWith:2,assignInWith:2,cloneDeepWith:1,cloneWith:1,dropRightWhile:1,dropWhile:1,every:1,
|
||||||
|
filter:1,find:1,findIndex:1,findKey:1,findLast:1,findLastIndex:1,findLastKey:1,flatMap:1,forEach:1,forEachRight:1,forIn:1,forInRight:1,forOwn:1,forOwnRight:1,isEqualWith:2,isMatchWith:2,map:1,mapKeys:1,mapValues:1,partition:1,reduce:2,reduceRight:2,reject:1,remove:1,some:1,takeRightWhile:1,takeWhile:1,times:1,transform:2},e.iterateeRearg={mapKeys:[1]},e.methodRearg={assignInWith:[1,2,0],assignWith:[1,2,0],getOr:[2,1,0],isMatchWith:[2,1,0],mergeWith:[1,2,0],pullAllBy:[2,1,0],setWith:[3,1,2,0],sortedIndexBy:[2,1,0],
|
||||||
|
sortedLastIndexBy:[2,1,0],zipWith:[1,2,0]},e.methodSpread={partial:1,partialRight:1},e.mutate={array:{fill:!0,pull:!0,pullAll:!0,pullAllBy:!0,pullAt:!0,remove:!0,reverse:!0},object:{assign:!0,assignIn:!0,assignInWith:!0,assignWith:!0,defaults:!0,defaultsDeep:!0,merge:!0,mergeWith:!0},set:{set:!0,setWith:!0,unset:!0}},e.placeholder={bind:!0,bindKey:!0,curry:!0,curryRight:!0,partial:!0,partialRight:!0},e.realToAlias=function(){var t=Object.prototype.hasOwnProperty,r=e.aliasToReal,n={};for(var i in r){
|
||||||
|
var a=r[i];t.call(n,a)?n[a].push(i):n[a]=[i]}return n}(),e.remap={curryN:"curry",curryRightN:"curryRight",getOr:"get",trimChars:"trim",trimCharsEnd:"trimEnd",trimCharsStart:"trimStart"},e.skipRearg={add:!0,assign:!0,assignIn:!0,concat:!0,difference:!0,gt:!0,gte:!0,lt:!0,lte:!0,matchesProperty:!0,merge:!0,partial:!0,partialRight:!0,random:!0,range:!0,rangeRight:!0,subtract:!0,zip:!0,zipObject:!0}}])});
|
||||||
14933
dist/lodash.js
vendored
Normal file
14933
dist/lodash.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
120
dist/lodash.min.js
vendored
Normal file
120
dist/lodash.min.js
vendored
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* lodash 4.5.1 (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
|
||||||
|
* Build: `lodash -o ./dist/lodash.js`
|
||||||
|
*/
|
||||||
|
;(function(){function n(n,t){return n.set(t[0],t[1]),n}function t(n,t){return n.add(t),n}function r(n,t,r){switch(r.length){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function e(n,t,r,e){for(var u=-1,o=n.length;++u<o;){var i=n[u];t(e,i,r(i),n)}return e}function u(n,t){for(var r=-1,e=n.length;++r<e&&false!==t(n[r],r,n););return n}function o(n,t){for(var r=-1,e=n.length;++r<e;)if(!t(n[r],r,n))return false;
|
||||||
|
return true}function i(n,t){for(var r=-1,e=n.length,u=-1,o=[];++r<e;){var i=n[r];t(i,r,n)&&(o[++u]=i)}return o}function f(n,t){return!!n.length&&-1<d(n,t,0)}function c(n,t,r){for(var e=-1,u=n.length;++e<u;)if(r(t,n[e]))return true;return false}function a(n,t){for(var r=-1,e=n.length,u=Array(e);++r<e;)u[r]=t(n[r],r,n);return u}function l(n,t){for(var r=-1,e=t.length,u=n.length;++r<e;)n[u+r]=t[r];return n}function s(n,t,r,e){var u=-1,o=n.length;for(e&&o&&(r=n[++u]);++u<o;)r=t(r,n[u],u,n);return r}function h(n,t,r,e){
|
||||||
|
var u=n.length;for(e&&u&&(r=n[--u]);u--;)r=t(r,n[u],u,n);return r}function p(n,t){for(var r=-1,e=n.length;++r<e;)if(t(n[r],r,n))return true;return false}function _(n,t,r){for(var e=-1,u=n.length;++e<u;){var o=n[e],i=t(o);if(null!=i&&(f===Z?i===i:r(i,f)))var f=i,c=o}return c}function g(n,t,r,e){var u;return r(n,function(n,r,o){return t(n,r,o)?(u=e?r:n,false):void 0}),u}function v(n,t,r){for(var e=n.length,u=r?e:-1;r?u--:++u<e;)if(t(n[u],u,n))return u;return-1}function d(n,t,r){if(t!==t)return B(n,r);--r;for(var e=n.length;++r<e;)if(n[r]===t)return r;
|
||||||
|
return-1}function y(n,t,r,e,u){return u(n,function(n,u,o){r=e?(e=false,n):t(r,n,u,o)}),r}function b(n,t){var r=n.length;for(n.sort(t);r--;)n[r]=n[r].c;return n}function x(n,t){for(var r,e=-1,u=n.length;++e<u;){var o=t(n[e]);o!==Z&&(r=r===Z?o:r+o)}return r}function m(n,t){for(var r=-1,e=Array(n);++r<n;)e[r]=t(r);return e}function j(n,t){return a(t,function(t){return[t,n[t]]})}function w(n){return function(t){return n(t)}}function A(n,t){return a(t,function(t){return n[t]})}function O(n,t){for(var r=-1,e=n.length;++r<e&&-1<d(t,n[r],0););
|
||||||
|
return r}function k(n,t){for(var r=n.length;r--&&-1<d(t,n[r],0););return r}function E(n){return n&&n.Object===Object?n:null}function I(n,t){if(n!==t){var r=null===n,e=n===Z,u=n===n,o=null===t,i=t===Z,f=t===t;if(n>t&&!o||!u||r&&!i&&f||e&&f)return 1;if(t>n&&!r||!f||o&&!e&&u||i&&u)return-1}return 0}function S(n){return Un[n]}function R(n){return zn[n]}function W(n){return"\\"+$n[n]}function B(n,t,r){var e=n.length;for(t+=r?0:-1;r?t--:++t<e;){var u=n[t];if(u!==u)return t}return-1}function C(n){var t=false;
|
||||||
|
if(null!=n&&typeof n.toString!="function")try{t=!!(n+"")}catch(r){}return t}function U(n,t){return n=typeof n=="number"||yn.test(n)?+n:-1,n>-1&&0==n%1&&(null==t?9007199254740991:t)>n}function z(n){for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r}function M(n){var t=-1,r=Array(n.size);return n.forEach(function(n,e){r[++t]=[e,n]}),r}function L(n,t){for(var r=-1,e=n.length,u=-1,o=[];++r<e;){var i=n[r];(i===t||"__lodash_placeholder__"===i)&&(n[r]="__lodash_placeholder__",o[++u]=r)}return o;
|
||||||
|
}function $(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=n}),r}function F(n){if(!n||!En.test(n))return n.length;for(var t=kn.lastIndex=0;kn.test(n);)t++;return t}function N(n){return Mn[n]}function D(E){function yn(n){if(we(n)&&!Zo(n)&&!(n instanceof An)){if(n instanceof wn)return n;if(lu.call(n,"__wrapped__"))return Pr(n)}return new wn(n)}function jn(){}function wn(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=Z}function An(n){
|
||||||
|
this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=false,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Un(){}function zn(n){var t=-1,r=n?n.length:0;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Mn(n){var t=-1,r=n?n.length:0;for(this.__data__=new zn;++t<r;)this.push(n[t])}function Ln(n,t){var r=n.__data__;return $r(t)?(r=r.__data__,"__lodash_hash_undefined__"===(typeof t=="string"?r.string:r.hash)[t]):r.has(t)}function $n(n){var t=-1,r=n?n.length:0;
|
||||||
|
for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Dn(n,t){var r=Pn(n,t);return 0>r?false:(r==n.length-1?n.pop():Iu.call(n,r,1),true)}function Zn(n,t){var r=Pn(n,t);return 0>r?Z:n[r][1]}function Pn(n,t){for(var r=n.length;r--;)if(pe(n[r][0],t))return r;return-1}function Tn(n,t,r){var e=Pn(n,t);0>e?n.push([t,r]):n[e][1]=r}function Kn(n,t,r,e){return n===Z||pe(n,cu[r])&&!lu.call(e,r)?t:n}function Gn(n,t,r){(r!==Z&&!pe(n[t],r)||typeof t=="number"&&r===Z&&!(t in n))&&(n[t]=r)}function Yn(n,t,r){
|
||||||
|
var e=n[t];lu.call(n,t)&&pe(e,r)&&(r!==Z||t in n)||(n[t]=r)}function Hn(n,t,r,e){return Hu(n,function(n,u,o){t(e,n,r(n),o)}),e}function Qn(n,t){return n&&nr(t,De(t),n)}function Xn(n,t){for(var r=-1,e=null==n,u=t.length,o=Array(u);++r<u;)o[r]=e?Z:$e(n,t[r]);return o}function nt(n){return de(n)?n:[]}function tt(n){return typeof n=="function"?n:Ye}function rt(n){return Zo(n)?n:qr(n)}function et(n,t,r){return n===n&&(r!==Z&&(n=n>r?r:n),t!==Z&&(n=t>n?t:n)),n}function ut(n,t,r,e,o,i){var f;if(r&&(f=o?r(n,e,o,i):r(n)),
|
||||||
|
f!==Z)return f;if(!je(n))return n;if(e=Zo(n)){if(f=Br(n),!t)return Xt(n,f)}else{var c=Rr(n),a="[object Function]"==c||"[object GeneratorFunction]"==c;if(qo(n))return Jt(n,t);if("[object Object]"==c||"[object Arguments]"==c||a&&!o){if(C(n))return o?n:{};if(f=Cr(a?{}:n),!t)return rr(n,Qn(f,n))}else{if(!Cn[c])return o?n:{};f=Ur(n,c,t)}}return i||(i=new $n),(o=i.get(n))?o:(i.set(n,f),(e?u:pt)(n,function(e,u){Yn(f,u,ut(e,t,r,u,n,i))}),e?f:rr(n,f))}function ot(n){var t=De(n),r=t.length;return function(e){
|
||||||
|
if(null==e)return!r;for(var u=r;u--;){var o=t[u],i=n[o],f=e[o];if(f===Z&&!(o in Object(e))||!i(f))return false}return true}}function it(n){return je(n)?Ou(n):{}}function ft(n,t,r){if(typeof n!="function")throw new iu("Expected a function");return Eu(function(){n.apply(Z,r)},t)}function ct(n,t,r,e){var u=-1,o=f,i=true,l=n.length,s=[],h=t.length;if(!l)return s;r&&(t=a(t,w(r))),e?(o=c,i=false):t.length>=200&&(o=Ln,i=false,t=new Mn(t));n:for(;++u<l;){var p=n[u],_=r?r(p):p;if(i&&_===_){for(var g=h;g--;)if(t[g]===_)continue n;
|
||||||
|
s.push(p)}else o(t,_,e)||s.push(p)}return s}function at(n,t){var r=true;return Hu(n,function(n,e,u){return r=!!t(n,e,u)}),r}function lt(n,t){var r=[];return Hu(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function st(n,t,r,e){e||(e=[]);for(var u=-1,o=n.length;++u<o;){var i=n[u];t>0&&de(i)&&(r||Zo(i)||ge(i))?t>1?st(i,t-1,r,e):l(e,i):r||(e[e.length]=i)}return e}function ht(n,t){return null==n?n:Xu(n,t,Ze)}function pt(n,t){return n&&Xu(n,t,De)}function _t(n,t){return n&&no(n,t,De)}function gt(n,t){return i(t,function(t){
|
||||||
|
return be(n[t])})}function vt(n,t){t=Lr(t,n)?[t+""]:rt(t);for(var r=0,e=t.length;null!=n&&e>r;)n=n[t[r++]];return r&&r==e?n:Z}function dt(n,t){return lu.call(n,t)||typeof n=="object"&&t in n&&null===ju(n)}function yt(n,t){return t in Object(n)}function bt(n,t,r){for(var e=r?c:f,u=n.length,o=u,i=Array(u),l=[];o--;){var s=n[o];o&&t&&(s=a(s,w(t))),i[o]=r||!t&&120>s.length?Z:new Mn(o&&s)}var s=n[0],h=-1,p=s.length,_=i[0];n:for(;++h<p;){var g=s[h],v=t?t(g):g;if(_?!Ln(_,v):!e(l,v,r)){for(o=u;--o;){var d=i[o];
|
||||||
|
if(d?!Ln(d,v):!e(n[o],v,r))continue n}_&&_.push(v),l.push(g)}}return l}function xt(n,t,r,e){return pt(n,function(n,u,o){t(e,r(n),u,o)}),e}function mt(n,t,e){return Lr(t,n)||(t=rt(t),n=Zr(n,t),t=Vr(t)),t=null==n?n:n[t],null==t?Z:r(t,n,e)}function jt(n,t,r,e,u){if(n===t)return true;if(null==n||null==t||!je(n)&&!we(t))return n!==n&&t!==t;n:{var o=Zo(n),i=Zo(t),f="[object Array]",c="[object Array]";o||(f=Rr(n),"[object Arguments]"==f?f="[object Object]":"[object Object]"!=f&&(o=Re(n))),i||(c=Rr(t),"[object Arguments]"==c?c="[object Object]":"[object Object]"!=c&&Re(t));
|
||||||
|
var a="[object Object]"==f&&!C(n),i="[object Object]"==c&&!C(t),c=f==c;if(!c||o||a){if(!(2&e)&&(f=a&&lu.call(n,"__wrapped__"),i=i&&lu.call(t,"__wrapped__"),f||i)){n=jt(f?n.value():n,i?t.value():t,r,e,u);break n}c?(u||(u=new $n),n=(o?jr:Ar)(n,t,jt,r,e,u)):n=false}else n=wr(n,t,f,jt,r,e)}return n}function wt(n,t,r,e){var u=r.length,o=u,i=!e;if(null==n)return!o;for(n=Object(n);u--;){var f=r[u];if(i&&f[2]?f[1]!==n[f[0]]:!(f[0]in n))return false}for(;++u<o;){var f=r[u],c=f[0],a=n[c],l=f[1];if(i&&f[2]){if(a===Z&&!(c in n))return false;
|
||||||
|
}else if(f=new $n,c=e?e(a,l,c,n,t,f):Z,c===Z?!jt(l,a,e,3,f):!c)return false}return true}function At(n){var t=typeof n;return"function"==t?n:null==n?Ye:"object"==t?Zo(n)?It(n[0],n[1]):Et(n):nu(n)}function Ot(n){n=null==n?n:Object(n);var t,r=[];for(t in n)r.push(t);return r}function kt(n,t){var r=-1,e=ve(n)?Array(n.length):[];return Hu(n,function(n,u,o){e[++r]=t(n,u,o)}),e}function Et(n){var t=Er(n);if(1==t.length&&t[0][2]){var r=t[0][0],e=t[0][1];return function(n){return null==n?false:n[r]===e&&(e!==Z||r in Object(n));
|
||||||
|
}}return function(r){return r===n||wt(r,n,t)}}function It(n,t){return function(r){var e=$e(r,n);return e===Z&&e===t?Ne(r,n):jt(t,e,Z,3)}}function St(n,t,r,e,o){if(n!==t){var i=Zo(t)||Re(t)?Z:Ze(t);u(i||t,function(u,f){if(i&&(f=u,u=t[f]),je(u)){o||(o=new $n);var c=f,a=o,l=n[c],s=t[c],h=a.get(s);if(!h){var h=e?e(l,s,c+"",n,t,a):Z,p=h===Z;p&&(h=s,Zo(s)||Re(s)?Zo(l)?h=l:de(l)?h=Xt(l):(p=false,h=ut(s,true)):ke(s)||ge(s)?ge(l)?h=Me(l):!je(l)||r&&be(l)?(p=false,h=ut(s,true)):h=l:p=false),a.set(s,h),p&&St(h,s,r,e,a)}
|
||||||
|
Gn(n,c,h)}else c=e?e(n[f],u,f+"",n,t,o):Z,c===Z&&(c=u),Gn(n,f,c)})}}function Rt(n,t,r){var e=-1,u=kr();return t=a(t.length?t:Array(1),function(n){return u(n)}),n=kt(n,function(n,r,u){return{a:a(t,function(t){return t(n)}),b:++e,c:n}}),b(n,function(n,t){var e;n:{e=-1;for(var u=n.a,o=t.a,i=u.length,f=r.length;++e<i;){var c=I(u[e],o[e]);if(c){if(e>=f){e=c;break n}e=c*("desc"==r[e]?-1:1);break n}}e=n.b-t.b}return e})}function Wt(n,t){return n=Object(n),s(t,function(t,r){return r in n&&(t[r]=n[r]),t},{});
|
||||||
|
}function Bt(n,t){var r={};return ht(n,function(n,e){t(n,e)&&(r[e]=n)}),r}function Ct(n){return function(t){return null==t?Z:t[n]}}function Ut(n){return function(t){return vt(t,n)}}function zt(n,t,r){var e=-1,u=t.length,o=n;for(r&&(o=a(n,function(n){return r(n)}));++e<u;)for(var i=0,f=t[e],f=r?r(f):f;-1<(i=d(o,f,i));)o!==n&&Iu.call(o,i,1),Iu.call(n,i,1);return n}function Mt(n,t){for(var r=n?t.length:0,e=r-1;r--;){var u=t[r];if(e==r||u!=o){var o=u;if(U(u))Iu.call(n,u,1);else if(Lr(u,n))delete n[u];else{
|
||||||
|
var u=rt(u),i=Zr(n,u);null!=i&&delete i[Vr(u)]}}}return n}function Lt(n,t){return n+Ru(Lu()*(t-n+1))}function $t(n,t,r,e){t=Lr(t,n)?[t+""]:rt(t);for(var u=-1,o=t.length,i=o-1,f=n;null!=f&&++u<o;){var c=t[u];if(je(f)){var a=r;if(u!=i){var l=f[c],a=e?e(l,c,f):Z;a===Z&&(a=null==l?U(t[u+1])?[]:{}:l)}Yn(f,c,a)}f=f[c]}return n}function Ft(n,t,r){var e=-1,u=n.length;for(0>t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Array(u);++e<u;)r[e]=n[e+t];return r}function Nt(n,t){var r;return Hu(n,function(n,e,u){
|
||||||
|
return r=t(n,e,u),!r}),!!r}function Dt(n,t,r){var e=0,u=n?n.length:e;if(typeof t=="number"&&t===t&&2147483647>=u){for(;u>e;){var o=e+u>>>1,i=n[o];(r?t>=i:t>i)&&null!==i?e=o+1:u=o}return u}return Zt(n,t,Ye,r)}function Zt(n,t,r,e){t=r(t);for(var u=0,o=n?n.length:0,i=t!==t,f=null===t,c=t===Z;o>u;){var a=Ru((u+o)/2),l=r(n[a]),s=l!==Z,h=l===l;(i?h||e:f?h&&s&&(e||null!=l):c?h&&(e||s):null==l?0:e?t>=l:t>l)?u=a+1:o=a}return zu(o,4294967294)}function qt(n,t){for(var r=0,e=n.length,u=n[0],o=t?t(u):u,i=o,f=0,c=[u];++r<e;)u=n[r],
|
||||||
|
o=t?t(u):u,pe(o,i)||(i=o,c[++f]=u);return c}function Pt(n,t,r){var e=-1,u=f,o=n.length,i=true,a=[],l=a;if(r)i=false,u=c;else if(o<200)l=t?[]:a;else{if(u=t?null:ro(n))return $(u);i=false,u=Ln,l=new Mn}n:for(;++e<o;){var s=n[e],h=t?t(s):s;if(i&&h===h){for(var p=l.length;p--;)if(l[p]===h)continue n;t&&l.push(h),a.push(s)}else u(l,h,r)||(l!==a&&l.push(h),a.push(s))}return a}function Tt(n,t,r,e){for(var u=n.length,o=e?u:-1;(e?o--:++o<u)&&t(n[o],o,n););return r?Ft(n,e?0:o,e?o+1:u):Ft(n,e?o+1:0,e?u:o)}function Kt(n,t){
|
||||||
|
var r=n;return r instanceof An&&(r=r.value()),s(t,function(n,t){return t.func.apply(t.thisArg,l([n],t.args))},r)}function Gt(n,t,r){for(var e=-1,u=n.length;++e<u;)var o=o?l(ct(o,n[e],t,r),ct(n[e],o,t,r)):n[e];return o&&o.length?Pt(o,t,r):[]}function Vt(n,t,r){for(var e=-1,u=n.length,o=t.length,i={};++e<u;)r(i,n[e],o>e?t[e]:Z);return i}function Jt(n,t){if(t)return n.slice();var r=new n.constructor(n.length);return n.copy(r),r}function Yt(n){var t=new n.constructor(n.byteLength);return new bu(t).set(new bu(n)),
|
||||||
|
t}function Ht(n,t,r,e){var u=-1,o=n.length,i=r.length,f=-1,c=t.length,a=Uu(o-i,0),l=Array(c+a);for(e=!e;++f<c;)l[f]=t[f];for(;++u<i;)(e||o>u)&&(l[r[u]]=n[u]);for(;a--;)l[f++]=n[u++];return l}function Qt(n,t,r,e){var u=-1,o=n.length,i=-1,f=r.length,c=-1,a=t.length,l=Uu(o-f,0),s=Array(l+a);for(e=!e;++u<l;)s[u]=n[u];for(l=u;++c<a;)s[l+c]=t[c];for(;++i<f;)(e||o>u)&&(s[l+r[i]]=n[u++]);return s}function Xt(n,t){var r=-1,e=n.length;for(t||(t=Array(e));++r<e;)t[r]=n[r];return t}function nr(n,t,r){return tr(n,t,r);
|
||||||
|
}function tr(n,t,r,e){r||(r={});for(var u=-1,o=t.length;++u<o;){var i=t[u],f=e?e(r[i],n[i],i,r,n):n[i];Yn(r,i,f)}return r}function rr(n,t){return nr(n,oo(n),t)}function er(n,t){return function(r,u){var o=Zo(r)?e:Hn,i=t?t():{};return o(r,n,kr(u),i)}}function ur(n){return he(function(t,r){var e=-1,u=r.length,o=u>1?r[u-1]:Z,i=u>2?r[2]:Z,o=typeof o=="function"?(u--,o):Z;for(i&&Mr(r[0],r[1],i)&&(o=3>u?Z:o,u=1),t=Object(t);++e<u;)(i=r[e])&&n(t,i,e,o);return t})}function or(n,t){return function(r,e){if(null==r)return r;
|
||||||
|
if(!ve(r))return n(r,e);for(var u=r.length,o=t?u:-1,i=Object(r);(t?o--:++o<u)&&false!==e(i[o],o,i););return r}}function ir(n){return function(t,r,e){var u=-1,o=Object(t);e=e(t);for(var i=e.length;i--;){var f=e[n?i:++u];if(false===r(o[f],f,o))break}return t}}function fr(n,t,r){function e(){return(this&&this!==Vn&&this instanceof e?o:n).apply(u?r:this,arguments)}var u=1&t,o=lr(n);return e}function cr(n){return function(t){t=Le(t);var r=En.test(t)?t.match(kn):Z,e=r?r[0]:t.charAt(0);return t=r?r.slice(1).join(""):t.slice(1),
|
||||||
|
e[n]()+t}}function ar(n){return function(t){return s(Ve(Ke(t)),n,"")}}function lr(n){return function(){var t=arguments;switch(t.length){case 0:return new n;case 1:return new n(t[0]);case 2:return new n(t[0],t[1]);case 3:return new n(t[0],t[1],t[2]);case 4:return new n(t[0],t[1],t[2],t[3]);case 5:return new n(t[0],t[1],t[2],t[3],t[4]);case 6:return new n(t[0],t[1],t[2],t[3],t[4],t[5]);case 7:return new n(t[0],t[1],t[2],t[3],t[4],t[5],t[6])}var r=it(n.prototype),t=n.apply(r,t);return je(t)?t:r}}function sr(n,t,e){
|
||||||
|
function u(){for(var i=arguments.length,f=Array(i),c=i,a=Sr(u);c--;)f[c]=arguments[c];return c=3>i&&f[0]!==a&&f[i-1]!==a?[]:L(f,a),i-=c.length,e>i?br(n,t,pr,u.placeholder,Z,f,c,Z,Z,e-i):r(this&&this!==Vn&&this instanceof u?o:n,this,f)}var o=lr(n);return u}function hr(n){return he(function(t){t=st(t,1);var r=t.length,e=r,u=wn.prototype.thru;for(n&&t.reverse();e--;){var o=t[e];if(typeof o!="function")throw new iu("Expected a function");if(u&&!i&&"wrapper"==Or(o))var i=new wn([],true)}for(e=i?e:r;++e<r;)var o=t[e],u=Or(o),f="wrapper"==u?eo(o):Z,i=f&&Fr(f[0])&&424==f[1]&&!f[4].length&&1==f[9]?i[Or(f[0])].apply(i,f[3]):1==o.length&&Fr(o)?i[u]():i.thru(o);
|
||||||
|
return function(){var n=arguments,e=n[0];if(i&&1==n.length&&Zo(e)&&e.length>=200)return i.plant(e).value();for(var u=0,n=r?t[u].apply(this,n):e;++u<r;)n=t[u].call(this,n);return n}})}function pr(n,t,r,e,u,o,i,f,c,a){function l(){for(var d=arguments.length,y=d,b=Array(d);y--;)b[y]=arguments[y];if(_){var x,m=Sr(l),y=b.length;for(x=0;y--;)b[y]===m&&x++}if(e&&(b=Ht(b,e,u,_)),o&&(b=Qt(b,o,i,_)),d-=x,_&&a>d)return m=L(b,m),br(n,t,pr,l.placeholder,r,b,m,f,c,a-d);if(m=h?r:this,y=p?m[n]:n,d=b.length,f){x=b.length;
|
||||||
|
for(var j=zu(f.length,x),w=Xt(b);j--;){var A=f[j];b[j]=U(A,x)?w[A]:Z}}else g&&d>1&&b.reverse();return s&&d>c&&(b.length=c),this&&this!==Vn&&this instanceof l&&(y=v||lr(y)),y.apply(m,b)}var s=128&t,h=1&t,p=2&t,_=24&t,g=512&t,v=p?Z:lr(n);return l}function _r(n,t){return function(r,e){return xt(r,n,t(e),{})}}function gr(n){return he(function(t){return t=a(st(t,1),kr()),he(function(e){var u=this;return n(t,function(n){return r(n,u,e)})})})}function vr(n,t,r){return t=Ce(t),n=F(n),t&&t>n?(t-=n,r=r===Z?" ":r+"",
|
||||||
|
n=Ge(r,Su(t/F(r))),En.test(r)?n.match(kn).slice(0,t).join(""):n.slice(0,t)):""}function dr(n,t,e,u){function o(){for(var t=-1,c=arguments.length,a=-1,l=u.length,s=Array(l+c),h=this&&this!==Vn&&this instanceof o?f:n;++a<l;)s[a]=u[a];for(;c--;)s[a++]=arguments[++t];return r(h,i?e:this,s)}var i=1&t,f=lr(n);return o}function yr(n){return function(t,r,e){e&&typeof e!="number"&&Mr(t,r,e)&&(r=e=Z),t=ze(t),t=t===t?t:0,r===Z?(r=t,t=0):r=ze(r)||0,e=e===Z?r>t?1:-1:ze(e)||0;var u=-1;r=Uu(Su((r-t)/(e||1)),0);for(var o=Array(r);r--;)o[n?r:++u]=t,
|
||||||
|
t+=e;return o}}function br(n,t,r,e,u,o,i,f,c,a){var l=8&t;f=f?Xt(f):Z;var s=l?i:Z;i=l?Z:i;var h=l?o:Z;return o=l?Z:o,t=(t|(l?32:64))&~(l?64:32),4&t||(t&=-4),t=[n,t,u,h,s,o,i,f,c,a],r=r.apply(Z,t),Fr(n)&&io(r,t),r.placeholder=e,r}function xr(n){var t=uu[n];return function(n,r){if(n=ze(n),r=Ce(r)){var e=(Le(n)+"e").split("e"),e=t(e[0]+"e"+(+e[1]+r)),e=(Le(e)+"e").split("e");return+(e[0]+"e"+(+e[1]-r))}return t(n)}}function mr(n,t,r,e,u,o,i,f){var c=2&t;if(!c&&typeof n!="function")throw new iu("Expected a function");
|
||||||
|
var a=e?e.length:0;if(a||(t&=-97,e=u=Z),i=i===Z?i:Uu(Ce(i),0),f=f===Z?f:Ce(f),a-=u?u.length:0,64&t){var l=e,s=u;e=u=Z}var h=c?Z:eo(n);return o=[n,t,r,e,u,l,s,o,i,f],h&&(r=o[1],n=h[1],t=r|n,e=128==n&&8==r||128==n&&256==r&&h[8]>=o[7].length||384==n&&h[8]>=h[7].length&&8==r,131>t||e)&&(1&n&&(o[2]=h[2],t|=1&r?0:4),(r=h[3])&&(e=o[3],o[3]=e?Ht(e,r,h[4]):Xt(r),o[4]=e?L(o[3],"__lodash_placeholder__"):Xt(h[4])),(r=h[5])&&(e=o[5],o[5]=e?Qt(e,r,h[6]):Xt(r),o[6]=e?L(o[5],"__lodash_placeholder__"):Xt(h[6])),(r=h[7])&&(o[7]=Xt(r)),
|
||||||
|
128&n&&(o[8]=null==o[8]?h[8]:zu(o[8],h[8])),null==o[9]&&(o[9]=h[9]),o[0]=h[0],o[1]=t),n=o[0],t=o[1],r=o[2],e=o[3],u=o[4],f=o[9]=null==o[9]?c?0:n.length:Uu(o[9]-a,0),!f&&24&t&&(t&=-25),c=t&&1!=t?8==t||16==t?sr(n,t,f):32!=t&&33!=t||u.length?pr.apply(Z,o):dr(n,t,r,e):fr(n,t,r),(h?to:io)(c,o)}function jr(n,t,r,e,u,o){var i=-1,f=2&u,c=1&u,a=n.length,l=t.length;if(!(a==l||f&&l>a))return false;if(l=o.get(n))return l==t;for(l=true,o.set(n,t);++i<a;){var s=n[i],h=t[i];if(e)var _=f?e(h,s,i,t,n,o):e(s,h,i,n,t,o);if(_!==Z){
|
||||||
|
if(_)continue;l=false;break}if(c){if(!p(t,function(n){return s===n||r(s,n,e,u,o)})){l=false;break}}else if(s!==h&&!r(s,h,e,u,o)){l=false;break}}return o["delete"](n),l}function wr(n,t,r,e,u,o){switch(r){case"[object ArrayBuffer]":if(n.byteLength!=t.byteLength||!e(new bu(n),new bu(t)))break;return true;case"[object Boolean]":case"[object Date]":return+n==+t;case"[object Error]":return n.name==t.name&&n.message==t.message;case"[object Number]":return n!=+n?t!=+t:n==+t;case"[object RegExp]":case"[object String]":
|
||||||
|
return n==t+"";case"[object Map]":var i=M;case"[object Set]":return i||(i=$),(2&o||n.size==t.size)&&e(i(n),i(t),u,1|o);case"[object Symbol]":return!!yu&&Vu.call(n)==Vu.call(t)}return false}function Ar(n,t,r,e,u,o){var i=2&u,f=De(n),c=f.length,a=De(t).length;if(c!=a&&!i)return false;for(var l=c;l--;){var s=f[l];if(!(i?s in t:dt(t,s)))return false}if(a=o.get(n))return a==t;a=true,o.set(n,t);for(var h=i;++l<c;){var s=f[l],p=n[s],_=t[s];if(e)var g=i?e(_,p,s,t,n,o):e(p,_,s,n,t,o);if(g===Z?p!==_&&!r(p,_,e,u,o):!g){a=false;
|
||||||
|
break}h||(h="constructor"==s)}return a&&!h&&(r=n.constructor,e=t.constructor,r!=e&&"constructor"in n&&"constructor"in t&&!(typeof r=="function"&&r instanceof r&&typeof e=="function"&&e instanceof e)&&(a=false)),o["delete"](n),a}function Or(n){for(var t=n.name+"",r=Yu[t],e=lu.call(Yu,t)?r.length:0;e--;){var u=r[e],o=u.func;if(null==o||o==n)return u.name}return t}function kr(){var n=yn.iteratee||He,n=n===He?At:n;return arguments.length?n(arguments[0],arguments[1]):n}function Er(n){n=qe(n);for(var t=n.length;t--;){
|
||||||
|
var r,e=n[t];r=n[t][1],r=r===r&&!je(r),e[2]=r}return n}function Ir(n,t){var r=null==n?Z:n[t];return Ae(r)?r:Z}function Sr(n){return(lu.call(yn,"placeholder")?yn:n).placeholder}function Rr(n){return pu.call(n)}function Wr(n,t,r){if(null==n)return false;var e=r(n,t);return e||Lr(t)||(t=rt(t),n=Zr(n,t),null!=n&&(t=Vr(t),e=r(n,t))),r=n?n.length:Z,e||!!r&&me(r)&&U(t,r)&&(Zo(n)||Ie(n)||ge(n))}function Br(n){var t=n.length,r=n.constructor(t);return t&&"string"==typeof n[0]&&lu.call(n,"index")&&(r.index=n.index,
|
||||||
|
r.input=n.input),r}function Cr(n){return be(n.constructor)&&!Nr(n)?it(ju(n)):{}}function Ur(r,e,u){var o=r.constructor;switch(e){case"[object ArrayBuffer]":return Yt(r);case"[object Boolean]":case"[object Date]":return new o(+r);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return e=r.buffer,u=u?Yt(e):e,
|
||||||
|
new r.constructor(u,r.byteOffset,r.length);case"[object Map]":return u=r.constructor,s(M(r),n,new u);case"[object Number]":case"[object String]":return new o(r);case"[object RegExp]":return u=new r.constructor(r.source,hn.exec(r)),u.lastIndex=r.lastIndex,u;case"[object Set]":return u=r.constructor,s($(r),t,new u);case"[object Symbol]":return yu?Object(Vu.call(r)):{}}}function zr(n){var t=n?n.length:Z;return me(t)&&(Zo(n)||Ie(n)||ge(n))?m(t,String):null}function Mr(n,t,r){if(!je(r))return false;var e=typeof t;
|
||||||
|
return("number"==e?ve(r)&&U(t,r.length):"string"==e&&t in r)?pe(r[t],n):false}function Lr(n,t){return typeof n=="number"?true:!Zo(n)&&(rn.test(n)||!tn.test(n)||null!=t&&n in Object(t))}function $r(n){var t=typeof n;return"number"==t||"boolean"==t||"string"==t&&"__proto__"!=n||null==n}function Fr(n){var t=Or(n),r=yn[t];return typeof r=="function"&&t in An.prototype?n===r?true:(t=eo(r),!!t&&n===t[0]):false}function Nr(n){var t=n&&n.constructor,t=be(t)&&t.prototype||cu;return n===t}function Dr(n,t,r,e,u,o){return je(n)&&je(t)&&(o.set(t,n),
|
||||||
|
St(n,t,Z,Dr,o)),n}function Zr(n,t){return 1==t.length?n:$e(n,Ft(t,0,-1))}function qr(n){var t=[];return Le(n).replace(en,function(n,r,e,u){t.push(e?u.replace(ln,"$1"):r||n)}),t}function Pr(n){if(n instanceof An)return n.clone();var t=new wn(n.__wrapped__,n.__chain__);return t.__actions__=Xt(n.__actions__),t.__index__=n.__index__,t.__values__=n.__values__,t}function Tr(n,t,r){var e=n?n.length:0;return e?(t=r||t===Z?1:Ce(t),Ft(n,0>t?0:t,e)):[]}function Kr(n,t,r){var e=n?n.length:0;return e?(t=r||t===Z?1:Ce(t),
|
||||||
|
t=e-t,Ft(n,0,0>t?0:t)):[]}function Gr(n){return n?n[0]:Z}function Vr(n){var t=n?n.length:0;return t?n[t-1]:Z}function Jr(n,t){return n&&n.length&&t&&t.length?zt(n,t):n}function Yr(n){return n?$u.call(n):n}function Hr(n){if(!n||!n.length)return[];var t=0;return n=i(n,function(n){return de(n)?(t=Uu(n.length,t),true):void 0}),m(t,function(t){return a(n,Ct(t))})}function Qr(n,t){if(!n||!n.length)return[];var e=Hr(n);return null==t?e:a(e,function(n){return r(t,Z,n)})}function Xr(n){return n=yn(n),n.__chain__=true,
|
||||||
|
n}function ne(n,t){return t(n)}function te(){return this}function re(n,t){return typeof t=="function"&&Zo(n)?u(n,t):Hu(n,tt(t))}function ee(n,t){var r;if(typeof t=="function"&&Zo(n)){for(r=n.length;r--&&false!==t(n[r],r,n););r=n}else r=Qu(n,tt(t));return r}function ue(n,t){return(Zo(n)?a:kt)(n,kr(t,3))}function oe(n,t){var r=-1,e=Be(n),u=e.length,o=u-1;for(t=et(Ce(t),0,u);++r<t;){var u=Lt(r,o),i=e[u];e[u]=e[r],e[r]=i}return e.length=t,e}function ie(n,t,r){return t=r?Z:t,t=n&&null==t?n.length:t,mr(n,128,Z,Z,Z,Z,t);
|
||||||
|
}function fe(n,t){var r;if(typeof t!="function")throw new iu("Expected a function");return n=Ce(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=Z),r}}function ce(n,t,r){return t=r?Z:t,n=mr(n,8,Z,Z,Z,Z,Z,t),n.placeholder=ce.placeholder,n}function ae(n,t,r){return t=r?Z:t,n=mr(n,16,Z,Z,Z,Z,Z,t),n.placeholder=ae.placeholder,n}function le(n,t,r){function e(){p&&xu(p),a&&xu(a),g=0,c=a=h=p=_=Z}function u(t,r){r&&xu(r),a=p=_=Z,t&&(g=Co(),l=n.apply(h,c),p||a||(c=h=Z))}function o(){var n=t-(Co()-s);
|
||||||
|
0>=n||n>t?u(_,a):p=Eu(o,n)}function i(){u(y,p)}function f(){if(c=arguments,s=Co(),h=this,_=y&&(p||!v),false===d)var r=v&&!p;else{g||a||v||(g=s);var e=d-(s-g),u=(0>=e||e>d)&&(v||a);u?(a&&(a=xu(a)),g=s,l=n.apply(h,c)):a||(a=Eu(i,e))}return u&&p?p=xu(p):p||t===d||(p=Eu(o,t)),r&&(u=true,l=n.apply(h,c)),!u||p||a||(c=h=Z),l}var c,a,l,s,h,p,_,g=0,v=false,d=false,y=true;if(typeof n!="function")throw new iu("Expected a function");return t=ze(t)||0,je(r)&&(v=!!r.leading,d="maxWait"in r&&Uu(ze(r.maxWait)||0,t),y="trailing"in r?!!r.trailing:y),
|
||||||
|
f.cancel=e,f.flush=function(){return(p&&_||a&&y)&&(l=n.apply(h,c)),e(),l},f}function se(n,t){if(typeof n!="function"||t&&typeof t!="function")throw new iu("Expected a function");var r=function(){var e=arguments,u=t?t.apply(this,e):e[0],o=r.cache;return o.has(u)?o.get(u):(e=n.apply(this,e),r.cache=o.set(u,e),e)};return r.cache=new se.Cache,r}function he(n,t){if(typeof n!="function")throw new iu("Expected a function");return t=Uu(t===Z?n.length-1:Ce(t),0),function(){for(var e=arguments,u=-1,o=Uu(e.length-t,0),i=Array(o);++u<o;)i[u]=e[t+u];
|
||||||
|
switch(t){case 0:return n.call(this,i);case 1:return n.call(this,e[0],i);case 2:return n.call(this,e[0],e[1],i)}for(o=Array(t+1),u=-1;++u<t;)o[u]=e[u];return o[t]=i,r(n,this,o)}}function pe(n,t){return n===t||n!==n&&t!==t}function _e(n,t){return n>t}function ge(n){return de(n)&&lu.call(n,"callee")&&(!ku.call(n,"callee")||"[object Arguments]"==pu.call(n))}function ve(n){return null!=n&&!(typeof n=="function"&&be(n))&&me(uo(n))}function de(n){return we(n)&&ve(n)}function ye(n){return we(n)?"[object Error]"==pu.call(n)||typeof n.message=="string"&&typeof n.name=="string":false;
|
||||||
|
}function be(n){return n=je(n)?pu.call(n):"","[object Function]"==n||"[object GeneratorFunction]"==n}function xe(n){return typeof n=="number"&&n==Ce(n)}function me(n){return typeof n=="number"&&n>-1&&0==n%1&&9007199254740991>=n}function je(n){var t=typeof n;return!!n&&("object"==t||"function"==t)}function we(n){return!!n&&typeof n=="object"}function Ae(n){return null==n?false:be(n)?gu.test(au.call(n)):we(n)&&(C(n)?gu:vn).test(n)}function Oe(n){return typeof n=="number"||we(n)&&"[object Number]"==pu.call(n);
|
||||||
|
}function ke(n){return!we(n)||"[object Object]"!=pu.call(n)||C(n)?false:(n=ju(n),null===n?true:(n=n.constructor,typeof n=="function"&&n instanceof n&&au.call(n)==hu))}function Ee(n){return je(n)&&"[object RegExp]"==pu.call(n)}function Ie(n){return typeof n=="string"||!Zo(n)&&we(n)&&"[object String]"==pu.call(n)}function Se(n){return typeof n=="symbol"||we(n)&&"[object Symbol]"==pu.call(n)}function Re(n){return we(n)&&me(n.length)&&!!Bn[pu.call(n)]}function We(n,t){return t>n}function Be(n){if(!n)return[];
|
||||||
|
if(ve(n))return Ie(n)?n.match(kn):Xt(n);if(Au&&n[Au])return z(n[Au]());var t=Rr(n);return("[object Map]"==t?M:"[object Set]"==t?$:Pe)(n)}function Ce(n){if(!n)return 0===n?n:0;if(n=ze(n),n===q||n===-q)return 1.7976931348623157e308*(0>n?-1:1);var t=n%1;return n===n?t?n-t:n:0}function Ue(n){return n?et(Ce(n),0,4294967295):0}function ze(n){if(je(n)&&(n=be(n.valueOf)?n.valueOf():n,n=je(n)?n+"":n),typeof n!="string")return 0===n?n:+n;n=n.replace(fn,"");var t=gn.test(n);return t||dn.test(n)?Nn(n.slice(2),t?2:8):_n.test(n)?P:+n;
|
||||||
|
}function Me(n){return nr(n,Ze(n))}function Le(n){if(typeof n=="string")return n;if(null==n)return"";if(Se(n))return yu?Ju.call(n):"";var t=n+"";return"0"==t&&1/n==-q?"-0":t}function $e(n,t,r){return n=null==n?Z:vt(n,t),n===Z?r:n}function Fe(n,t){return Wr(n,t,dt)}function Ne(n,t){return Wr(n,t,yt)}function De(n){var t=Nr(n);if(!t&&!ve(n))return Cu(Object(n));var r,e=zr(n),u=!!e,e=e||[],o=e.length;for(r in n)!dt(n,r)||u&&("length"==r||U(r,o))||t&&"constructor"==r||e.push(r);return e}function Ze(n){
|
||||||
|
for(var t=-1,r=Nr(n),e=Ot(n),u=e.length,o=zr(n),i=!!o,o=o||[],f=o.length;++t<u;){var c=e[t];i&&("length"==c||U(c,f))||"constructor"==c&&(r||!lu.call(n,c))||o.push(c)}return o}function qe(n){return j(n,De(n))}function Pe(n){return n?A(n,De(n)):[]}function Te(n){return ci(Le(n).toLowerCase())}function Ke(n){return(n=Le(n))&&n.replace(bn,S).replace(On,"")}function Ge(n,t){n=Le(n),t=Ce(t);var r="";if(!n||1>t||t>9007199254740991)return r;do t%2&&(r+=n),t=Ru(t/2),n+=n;while(t);return r}function Ve(n,t,r){
|
||||||
|
return n=Le(n),t=r?Z:t,t===Z&&(t=Rn.test(n)?Sn:In),n.match(t)||[]}function Je(n){return function(){return n}}function Ye(n){return n}function He(n){return At(typeof n=="function"?n:ut(n,true))}function Qe(n,t,r){var e=De(t),o=gt(t,e);null!=r||je(t)&&(o.length||!e.length)||(r=t,t=n,n=this,o=gt(t,De(t)));var i=je(r)&&"chain"in r?r.chain:true,f=be(n);return u(o,function(r){var e=t[r];n[r]=e,f&&(n.prototype[r]=function(){var t=this.__chain__;if(i||t){var r=n(this.__wrapped__);return(r.__actions__=Xt(this.__actions__)).push({
|
||||||
|
func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,l([this.value()],arguments))})}),n}function Xe(){}function nu(n){return Lr(n)?Ct(n):Ut(n)}function tu(n){return n&&n.length?x(n,Ye):0}E=E?Jn.defaults({},E,Jn.pick(Vn,Wn)):Vn;var ru=E.Date,eu=E.Error,uu=E.Math,ou=E.RegExp,iu=E.TypeError,fu=E.Array.prototype,cu=E.Object.prototype,au=E.Function.prototype.toString,lu=cu.hasOwnProperty,su=0,hu=au.call(Object),pu=cu.toString,_u=Vn._,gu=ou("^"+au.call(lu).replace(un,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),vu=qn?E.Buffer:Z,du=E.Reflect,yu=E.Symbol,bu=E.Uint8Array,xu=E.clearTimeout,mu=du?du.enumerate:Z,ju=Object.getPrototypeOf,wu=Object.getOwnPropertySymbols,Au=typeof(Au=yu&&yu.iterator)=="symbol"?Au:Z,Ou=Object.create,ku=cu.propertyIsEnumerable,Eu=E.setTimeout,Iu=fu.splice,Su=uu.ceil,Ru=uu.floor,Wu=E.isFinite,Bu=fu.join,Cu=Object.keys,Uu=uu.max,zu=uu.min,Mu=E.parseInt,Lu=uu.random,$u=fu.reverse,Fu=Ir(E,"Map"),Nu=Ir(E,"Set"),Du=Ir(E,"WeakMap"),Zu=Ir(Object,"create"),qu=Du&&new Du,Pu=Fu?au.call(Fu):"",Tu=Nu?au.call(Nu):"",Ku=Du?au.call(Du):"",Gu=yu?yu.prototype:Z,Vu=yu?Gu.valueOf:Z,Ju=yu?Gu.toString:Z,Yu={};
|
||||||
|
yn.templateSettings={escape:Q,evaluate:X,interpolate:nn,variable:"",imports:{_:yn}};var Hu=or(pt),Qu=or(_t,true),Xu=ir(),no=ir(true);mu&&!ku.call({valueOf:1},"valueOf")&&(Ot=function(n){return z(mu(n))});var to=qu?function(n,t){return qu.set(n,t),n}:Ye,ro=Nu&&2===new Nu([1,2]).size?function(n){return new Nu(n)}:Xe,eo=qu?function(n){return qu.get(n)}:Xe,uo=Ct("length"),oo=wu||function(){return[]};(Fu&&"[object Map]"!=Rr(new Fu)||Nu&&"[object Set]"!=Rr(new Nu)||Du&&"[object WeakMap]"!=Rr(new Du))&&(Rr=function(n){
|
||||||
|
var t=pu.call(n);if(n="[object Object]"==t?n.constructor:null,n=typeof n=="function"?au.call(n):"")switch(n){case Pu:return"[object Map]";case Tu:return"[object Set]";case Ku:return"[object WeakMap]"}return t});var io=function(){var n=0,t=0;return function(r,e){var u=Co(),o=16-(u-t);if(t=u,o>0){if(150<=++n)return r}else n=0;return to(r,e)}}(),fo=he(function(n,t){Zo(n)||(n=null==n?[]:[Object(n)]),t=st(t,1);for(var r=n,e=t,u=-1,o=r.length,i=-1,f=e.length,c=Array(o+f);++u<o;)c[u]=r[u];for(;++i<f;)c[u++]=e[i];
|
||||||
|
return c}),co=he(function(n,t){return de(n)?ct(n,st(t,1,true)):[]}),ao=he(function(n,t){var r=Vr(t);return de(r)&&(r=Z),de(n)?ct(n,st(t,1,true),kr(r)):[]}),lo=he(function(n,t){var r=Vr(t);return de(r)&&(r=Z),de(n)?ct(n,st(t,1,true),Z,r):[]}),so=he(function(n){var t=a(n,nt);return t.length&&t[0]===n[0]?bt(t):[]}),ho=he(function(n){var t=Vr(n),r=a(n,nt);return t===Vr(r)?t=Z:r.pop(),r.length&&r[0]===n[0]?bt(r,kr(t)):[]}),po=he(function(n){var t=Vr(n),r=a(n,nt);return t===Vr(r)?t=Z:r.pop(),r.length&&r[0]===n[0]?bt(r,Z,t):[];
|
||||||
|
}),_o=he(Jr),go=he(function(n,t){t=a(st(t,1),String);var r=Xn(n,t);return Mt(n,t.sort(I)),r}),vo=he(function(n){return Pt(st(n,1,true))}),yo=he(function(n){var t=Vr(n);return de(t)&&(t=Z),Pt(st(n,1,true),kr(t))}),bo=he(function(n){var t=Vr(n);return de(t)&&(t=Z),Pt(st(n,1,true),Z,t)}),xo=he(function(n,t){return de(n)?ct(n,t):[]}),mo=he(function(n){return Gt(i(n,de))}),jo=he(function(n){var t=Vr(n);return de(t)&&(t=Z),Gt(i(n,de),kr(t))}),wo=he(function(n){var t=Vr(n);return de(t)&&(t=Z),Gt(i(n,de),Z,t)}),Ao=he(Hr),Oo=he(function(n){
|
||||||
|
var t=n.length,t=t>1?n[t-1]:Z,t=typeof t=="function"?(n.pop(),t):Z;return Qr(n,t)}),ko=he(function(n){n=st(n,1);var t=n.length,r=t?n[0]:0,e=this.__wrapped__,u=function(t){return Xn(t,n)};return 1>=t&&!this.__actions__.length&&e instanceof An&&U(r)?(e=e.slice(r,+r+(t?1:0)),e.__actions__.push({func:ne,args:[u],thisArg:Z}),new wn(e,this.__chain__).thru(function(n){return t&&!n.length&&n.push(Z),n})):this.thru(u)}),Eo=er(function(n,t,r){lu.call(n,r)?++n[r]:n[r]=1}),Io=er(function(n,t,r){lu.call(n,r)?n[r].push(t):n[r]=[t];
|
||||||
|
}),So=he(function(n,t,e){var u=-1,o=typeof t=="function",i=Lr(t),f=ve(n)?Array(n.length):[];return Hu(n,function(n){var c=o?t:i&&null!=n?n[t]:Z;f[++u]=c?r(c,n,e):mt(n,t,e)}),f}),Ro=er(function(n,t,r){n[r]=t}),Wo=er(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]}),Bo=he(function(n,t){if(null==n)return[];var r=t.length;return r>1&&Mr(n,t[0],t[1])?t=[]:r>2&&Mr(t[0],t[1],t[2])&&(t.length=1),Rt(n,st(t,1),[])}),Co=ru.now,Uo=he(function(n,t,r){var e=1;if(r.length)var u=L(r,Sr(Uo)),e=32|e;return mr(n,e,t,r,u);
|
||||||
|
}),zo=he(function(n,t,r){var e=3;if(r.length)var u=L(r,Sr(zo)),e=32|e;return mr(t,e,n,r,u)}),Mo=he(function(n,t){return ft(n,1,t)}),Lo=he(function(n,t,r){return ft(n,ze(t)||0,r)}),$o=he(function(n,t){t=a(st(t,1),kr());var e=t.length;return he(function(u){for(var o=-1,i=zu(u.length,e);++o<i;)u[o]=t[o].call(this,u[o]);return r(n,this,u)})}),Fo=he(function(n,t){var r=L(t,Sr(Fo));return mr(n,32,Z,t,r)}),No=he(function(n,t){var r=L(t,Sr(No));return mr(n,64,Z,t,r)}),Do=he(function(n,t){return mr(n,256,Z,Z,Z,st(t,1));
|
||||||
|
}),Zo=Array.isArray,qo=vu?function(n){return n instanceof vu}:Je(false),Po=ur(function(n,t){nr(t,De(t),n)}),To=ur(function(n,t){nr(t,Ze(t),n)}),Ko=ur(function(n,t,r,e){tr(t,Ze(t),n,e)}),Go=ur(function(n,t,r,e){tr(t,De(t),n,e)}),Vo=he(function(n,t){return Xn(n,st(t,1))}),Jo=he(function(n){return n.push(Z,Kn),r(Ko,Z,n)}),Yo=he(function(n){return n.push(Z,Dr),r(ti,Z,n)}),Ho=_r(function(n,t,r){n[t]=r},Je(Ye)),Qo=_r(function(n,t,r){lu.call(n,t)?n[t].push(r):n[t]=[r]},kr),Xo=he(mt),ni=ur(function(n,t,r){St(n,t,r);
|
||||||
|
}),ti=ur(function(n,t,r,e){St(n,t,r,e)}),ri=he(function(n,t){return null==n?{}:(t=a(st(t,1),String),Wt(n,ct(Ze(n),t)))}),ei=he(function(n,t){return null==n?{}:Wt(n,st(t,1))}),ui=ar(function(n,t,r){return t=t.toLowerCase(),n+(r?Te(t):t)}),oi=ar(function(n,t,r){return n+(r?"-":"")+t.toLowerCase()}),ii=ar(function(n,t,r){return n+(r?" ":"")+t.toLowerCase()}),fi=cr("toLowerCase"),ci=cr("toUpperCase"),ai=ar(function(n,t,r){return n+(r?"_":"")+t.toLowerCase()}),li=ar(function(n,t,r){return n+(r?" ":"")+Te(t);
|
||||||
|
}),si=ar(function(n,t,r){return n+(r?" ":"")+t.toUpperCase()}),hi=he(function(n,t){try{return r(n,Z,t)}catch(e){return ye(e)?e:new eu(e)}}),pi=he(function(n,t){return u(st(t,1),function(t){n[t]=Uo(n[t],n)}),n}),_i=hr(),gi=hr(true),vi=he(function(n,t){return function(r){return mt(r,n,t)}}),di=he(function(n,t){return function(r){return mt(n,r,t)}}),yi=gr(a),bi=gr(o),xi=gr(p),mi=yr(),ji=yr(true),wi=xr("ceil"),Ai=xr("floor"),Oi=xr("round");return yn.prototype=jn.prototype,wn.prototype=it(jn.prototype),wn.prototype.constructor=wn,
|
||||||
|
An.prototype=it(jn.prototype),An.prototype.constructor=An,Un.prototype=Zu?Zu(null):cu,zn.prototype.clear=function(){this.__data__={hash:new Un,map:Fu?new Fu:[],string:new Un}},zn.prototype["delete"]=function(n){var t=this.__data__;return $r(n)?(t=typeof n=="string"?t.string:t.hash,(Zu?t[n]!==Z:lu.call(t,n))&&delete t[n]):Fu?t.map["delete"](n):Dn(t.map,n)},zn.prototype.get=function(n){var t=this.__data__;return $r(n)?(t=typeof n=="string"?t.string:t.hash,Zu?(n=t[n],n="__lodash_hash_undefined__"===n?Z:n):n=lu.call(t,n)?t[n]:Z,
|
||||||
|
n):Fu?t.map.get(n):Zn(t.map,n)},zn.prototype.has=function(n){var t=this.__data__;return $r(n)?(t=typeof n=="string"?t.string:t.hash,n=Zu?t[n]!==Z:lu.call(t,n)):n=Fu?t.map.has(n):-1<Pn(t.map,n),n},zn.prototype.set=function(n,t){var r=this.__data__;return $r(n)?(typeof n=="string"?r.string:r.hash)[n]=Zu&&t===Z?"__lodash_hash_undefined__":t:Fu?r.map.set(n,t):Tn(r.map,n,t),this},Mn.prototype.push=function(n){var t=this.__data__;$r(n)?(t=t.__data__,(typeof n=="string"?t.string:t.hash)[n]="__lodash_hash_undefined__"):t.set(n,"__lodash_hash_undefined__");
|
||||||
|
},$n.prototype.clear=function(){this.__data__={array:[],map:null}},$n.prototype["delete"]=function(n){var t=this.__data__,r=t.array;return r?Dn(r,n):t.map["delete"](n)},$n.prototype.get=function(n){var t=this.__data__,r=t.array;return r?Zn(r,n):t.map.get(n)},$n.prototype.has=function(n){var t=this.__data__,r=t.array;return r?-1<Pn(r,n):t.map.has(n)},$n.prototype.set=function(n,t){var r=this.__data__,e=r.array;return e&&(199>e.length?Tn(e,n,t):(r.array=null,r.map=new zn(e))),(r=r.map)&&r.set(n,t),
|
||||||
|
this},se.Cache=zn,yn.after=function(n,t){if(typeof t!="function")throw new iu("Expected a function");return n=Ce(n),function(){return 1>--n?t.apply(this,arguments):void 0}},yn.ary=ie,yn.assign=Po,yn.assignIn=To,yn.assignInWith=Ko,yn.assignWith=Go,yn.at=Vo,yn.before=fe,yn.bind=Uo,yn.bindAll=pi,yn.bindKey=zo,yn.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return Zo(n)?n:[n]},yn.chain=Xr,yn.chunk=function(n,t){t=Uu(Ce(t),0);var r=n?n.length:0;if(!r||1>t)return[];for(var e=0,u=-1,o=Array(Su(r/t));r>e;)o[++u]=Ft(n,e,e+=t);
|
||||||
|
return o},yn.compact=function(n){for(var t=-1,r=n?n.length:0,e=-1,u=[];++t<r;){var o=n[t];o&&(u[++e]=o)}return u},yn.concat=fo,yn.cond=function(n){var t=n?n.length:0,e=kr();return n=t?a(n,function(n){if("function"!=typeof n[1])throw new iu("Expected a function");return[e(n[0]),n[1]]}):[],he(function(e){for(var u=-1;++u<t;){var o=n[u];if(r(o[0],this,e))return r(o[1],this,e)}})},yn.conforms=function(n){return ot(ut(n,true))},yn.constant=Je,yn.countBy=Eo,yn.create=function(n,t){var r=it(n);return t?Qn(r,t):r;
|
||||||
|
},yn.curry=ce,yn.curryRight=ae,yn.debounce=le,yn.defaults=Jo,yn.defaultsDeep=Yo,yn.defer=Mo,yn.delay=Lo,yn.difference=co,yn.differenceBy=ao,yn.differenceWith=lo,yn.drop=Tr,yn.dropRight=Kr,yn.dropRightWhile=function(n,t){return n&&n.length?Tt(n,kr(t,3),true,true):[]},yn.dropWhile=function(n,t){return n&&n.length?Tt(n,kr(t,3),true):[]},yn.fill=function(n,t,r,e){var u=n?n.length:0;if(!u)return[];for(r&&typeof r!="number"&&Mr(n,t,r)&&(r=0,e=u),u=n.length,r=Ce(r),0>r&&(r=-r>u?0:u+r),e=e===Z||e>u?u:Ce(e),0>e&&(e+=u),
|
||||||
|
e=r>e?0:Ue(e);e>r;)n[r++]=t;return n},yn.filter=function(n,t){return(Zo(n)?i:lt)(n,kr(t,3))},yn.flatMap=function(n,t){return st(ue(n,t),1)},yn.flatten=function(n){return n&&n.length?st(n,1):[]},yn.flattenDeep=function(n){return n&&n.length?st(n,q):[]},yn.flattenDepth=function(n,t){return n&&n.length?(t=t===Z?1:Ce(t),st(n,t)):[]},yn.flip=function(n){return mr(n,512)},yn.flow=_i,yn.flowRight=gi,yn.fromPairs=function(n){for(var t=-1,r=n?n.length:0,e={};++t<r;){var u=n[t];e[u[0]]=u[1]}return e},yn.functions=function(n){
|
||||||
|
return null==n?[]:gt(n,De(n))},yn.functionsIn=function(n){return null==n?[]:gt(n,Ze(n))},yn.groupBy=Io,yn.initial=function(n){return Kr(n,1)},yn.intersection=so,yn.intersectionBy=ho,yn.intersectionWith=po,yn.invert=Ho,yn.invertBy=Qo,yn.invokeMap=So,yn.iteratee=He,yn.keyBy=Ro,yn.keys=De,yn.keysIn=Ze,yn.map=ue,yn.mapKeys=function(n,t){var r={};return t=kr(t,3),pt(n,function(n,e,u){r[t(n,e,u)]=n}),r},yn.mapValues=function(n,t){var r={};return t=kr(t,3),pt(n,function(n,e,u){r[e]=t(n,e,u)}),r},yn.matches=function(n){
|
||||||
|
return Et(ut(n,true))},yn.matchesProperty=function(n,t){return It(n,ut(t,true))},yn.memoize=se,yn.merge=ni,yn.mergeWith=ti,yn.method=vi,yn.methodOf=di,yn.mixin=Qe,yn.negate=function(n){if(typeof n!="function")throw new iu("Expected a function");return function(){return!n.apply(this,arguments)}},yn.nthArg=function(n){return n=Ce(n),function(){return arguments[n]}},yn.omit=ri,yn.omitBy=function(n,t){return t=kr(t),Bt(n,function(n,r){return!t(n,r)})},yn.once=function(n){return fe(2,n)},yn.orderBy=function(n,t,r,e){
|
||||||
|
return null==n?[]:(Zo(t)||(t=null==t?[]:[t]),r=e?Z:r,Zo(r)||(r=null==r?[]:[r]),Rt(n,t,r))},yn.over=yi,yn.overArgs=$o,yn.overEvery=bi,yn.overSome=xi,yn.partial=Fo,yn.partialRight=No,yn.partition=Wo,yn.pick=ei,yn.pickBy=function(n,t){return null==n?{}:Bt(n,kr(t))},yn.property=nu,yn.propertyOf=function(n){return function(t){return null==n?Z:vt(n,t)}},yn.pull=_o,yn.pullAll=Jr,yn.pullAllBy=function(n,t,r){return n&&n.length&&t&&t.length?zt(n,t,kr(r)):n},yn.pullAt=go,yn.range=mi,yn.rangeRight=ji,yn.rearg=Do,
|
||||||
|
yn.reject=function(n,t){var r=Zo(n)?i:lt;return t=kr(t,3),r(n,function(n,r,e){return!t(n,r,e)})},yn.remove=function(n,t){var r=[];if(!n||!n.length)return r;var e=-1,u=[],o=n.length;for(t=kr(t,3);++e<o;){var i=n[e];t(i,e,n)&&(r.push(i),u.push(e))}return Mt(n,u),r},yn.rest=he,yn.reverse=Yr,yn.sampleSize=oe,yn.set=function(n,t,r){return null==n?n:$t(n,t,r)},yn.setWith=function(n,t,r,e){return e=typeof e=="function"?e:Z,null==n?n:$t(n,t,r,e)},yn.shuffle=function(n){return oe(n,4294967295)},yn.slice=function(n,t,r){
|
||||||
|
var e=n?n.length:0;return e?(r&&typeof r!="number"&&Mr(n,t,r)?(t=0,r=e):(t=null==t?0:Ce(t),r=r===Z?e:Ce(r)),Ft(n,t,r)):[]},yn.sortBy=Bo,yn.sortedUniq=function(n){return n&&n.length?qt(n):[]},yn.sortedUniqBy=function(n,t){return n&&n.length?qt(n,kr(t)):[]},yn.split=function(n,t,r){return Le(n).split(t,r)},yn.spread=function(n,t){if(typeof n!="function")throw new iu("Expected a function");return t=t===Z?0:Uu(Ce(t),0),he(function(e){var u=e[t];return e=e.slice(0,t),u&&l(e,u),r(n,this,e)})},yn.tail=function(n){
|
||||||
|
return Tr(n,1)},yn.take=function(n,t,r){return n&&n.length?(t=r||t===Z?1:Ce(t),Ft(n,0,0>t?0:t)):[]},yn.takeRight=function(n,t,r){var e=n?n.length:0;return e?(t=r||t===Z?1:Ce(t),t=e-t,Ft(n,0>t?0:t,e)):[]},yn.takeRightWhile=function(n,t){return n&&n.length?Tt(n,kr(t,3),false,true):[]},yn.takeWhile=function(n,t){return n&&n.length?Tt(n,kr(t,3)):[]},yn.tap=function(n,t){return t(n),n},yn.throttle=function(n,t,r){var e=true,u=true;if(typeof n!="function")throw new iu("Expected a function");return je(r)&&(e="leading"in r?!!r.leading:e,
|
||||||
|
u="trailing"in r?!!r.trailing:u),le(n,t,{leading:e,maxWait:t,trailing:u})},yn.thru=ne,yn.toArray=Be,yn.toPairs=qe,yn.toPairsIn=function(n){return j(n,Ze(n))},yn.toPath=function(n){return Zo(n)?a(n,String):qr(n)},yn.toPlainObject=Me,yn.transform=function(n,t,r){var e=Zo(n)||Re(n);if(t=kr(t,4),null==r)if(e||je(n)){var o=n.constructor;r=e?Zo(n)?new o:[]:be(o)?it(ju(n)):{}}else r={};return(e?u:pt)(n,function(n,e,u){return t(r,n,e,u)}),r},yn.unary=function(n){return ie(n,1)},yn.union=vo,yn.unionBy=yo,
|
||||||
|
yn.unionWith=bo,yn.uniq=function(n){return n&&n.length?Pt(n):[]},yn.uniqBy=function(n,t){return n&&n.length?Pt(n,kr(t)):[]},yn.uniqWith=function(n,t){return n&&n.length?Pt(n,Z,t):[]},yn.unset=function(n,t){var r;if(null==n)r=true;else{r=n;var e=t,e=Lr(e,r)?[e+""]:rt(e);r=Zr(r,e),e=Vr(e),r=null!=r&&Fe(r,e)?delete r[e]:true}return r},yn.unzip=Hr,yn.unzipWith=Qr,yn.values=Pe,yn.valuesIn=function(n){return null==n?[]:A(n,Ze(n))},yn.without=xo,yn.words=Ve,yn.wrap=function(n,t){return t=null==t?Ye:t,Fo(t,n);
|
||||||
|
},yn.xor=mo,yn.xorBy=jo,yn.xorWith=wo,yn.zip=Ao,yn.zipObject=function(n,t){return Vt(n||[],t||[],Yn)},yn.zipObjectDeep=function(n,t){return Vt(n||[],t||[],$t)},yn.zipWith=Oo,yn.extend=To,yn.extendWith=Ko,Qe(yn,yn),yn.add=function(n,t){var r;return n===Z&&t===Z?0:(n!==Z&&(r=n),t!==Z&&(r=r===Z?t:r+t),r)},yn.attempt=hi,yn.camelCase=ui,yn.capitalize=Te,yn.ceil=wi,yn.clamp=function(n,t,r){return r===Z&&(r=t,t=Z),r!==Z&&(r=ze(r),r=r===r?r:0),t!==Z&&(t=ze(t),t=t===t?t:0),et(ze(n),t,r)},yn.clone=function(n){
|
||||||
|
return ut(n)},yn.cloneDeep=function(n){return ut(n,true)},yn.cloneDeepWith=function(n,t){return ut(n,true,t)},yn.cloneWith=function(n,t){return ut(n,false,t)},yn.deburr=Ke,yn.endsWith=function(n,t,r){n=Le(n),t=typeof t=="string"?t:t+"";var e=n.length;return r=r===Z?e:et(Ce(r),0,e),r-=t.length,r>=0&&n.indexOf(t,r)==r},yn.eq=pe,yn.escape=function(n){return(n=Le(n))&&H.test(n)?n.replace(J,R):n},yn.escapeRegExp=function(n){return(n=Le(n))&&on.test(n)?n.replace(un,"\\$&"):n},yn.every=function(n,t,r){var e=Zo(n)?o:at;
|
||||||
|
return r&&Mr(n,t,r)&&(t=Z),e(n,kr(t,3))},yn.find=function(n,t){if(t=kr(t,3),Zo(n)){var r=v(n,t);return r>-1?n[r]:Z}return g(n,t,Hu)},yn.findIndex=function(n,t){return n&&n.length?v(n,kr(t,3)):-1},yn.findKey=function(n,t){return g(n,kr(t,3),pt,true)},yn.findLast=function(n,t){if(t=kr(t,3),Zo(n)){var r=v(n,t,true);return r>-1?n[r]:Z}return g(n,t,Qu)},yn.findLastIndex=function(n,t){return n&&n.length?v(n,kr(t,3),true):-1},yn.findLastKey=function(n,t){return g(n,kr(t,3),_t,true)},yn.floor=Ai,yn.forEach=re,yn.forEachRight=ee,
|
||||||
|
yn.forIn=function(n,t){return null==n?n:Xu(n,tt(t),Ze)},yn.forInRight=function(n,t){return null==n?n:no(n,tt(t),Ze)},yn.forOwn=function(n,t){return n&&pt(n,tt(t))},yn.forOwnRight=function(n,t){return n&&_t(n,tt(t))},yn.get=$e,yn.gt=_e,yn.gte=function(n,t){return n>=t},yn.has=Fe,yn.hasIn=Ne,yn.head=Gr,yn.identity=Ye,yn.includes=function(n,t,r,e){return n=ve(n)?n:Pe(n),r=r&&!e?Ce(r):0,e=n.length,0>r&&(r=Uu(e+r,0)),Ie(n)?e>=r&&-1<n.indexOf(t,r):!!e&&-1<d(n,t,r)},yn.indexOf=function(n,t,r){var e=n?n.length:0;
|
||||||
|
return e?(r=Ce(r),0>r&&(r=Uu(e+r,0)),d(n,t,r)):-1},yn.inRange=function(n,t,r){return t=ze(t)||0,r===Z?(r=t,t=0):r=ze(r)||0,n=ze(n),n>=zu(t,r)&&n<Uu(t,r)},yn.invoke=Xo,yn.isArguments=ge,yn.isArray=Zo,yn.isArrayBuffer=function(n){return we(n)&&"[object ArrayBuffer]"==pu.call(n)},yn.isArrayLike=ve,yn.isArrayLikeObject=de,yn.isBoolean=function(n){return true===n||false===n||we(n)&&"[object Boolean]"==pu.call(n)},yn.isBuffer=qo,yn.isDate=function(n){return we(n)&&"[object Date]"==pu.call(n)},yn.isElement=function(n){
|
||||||
|
return!!n&&1===n.nodeType&&we(n)&&!ke(n)},yn.isEmpty=function(n){if(ve(n)&&(Zo(n)||Ie(n)||be(n.splice)||ge(n)))return!n.length;for(var t in n)if(lu.call(n,t))return false;return true},yn.isEqual=function(n,t){return jt(n,t)},yn.isEqualWith=function(n,t,r){var e=(r=typeof r=="function"?r:Z)?r(n,t):Z;return e===Z?jt(n,t,r):!!e},yn.isError=ye,yn.isFinite=function(n){return typeof n=="number"&&Wu(n)},yn.isFunction=be,yn.isInteger=xe,yn.isLength=me,yn.isMap=function(n){return we(n)&&"[object Map]"==Rr(n)},yn.isMatch=function(n,t){
|
||||||
|
return n===t||wt(n,t,Er(t))},yn.isMatchWith=function(n,t,r){return r=typeof r=="function"?r:Z,wt(n,t,Er(t),r)},yn.isNaN=function(n){return Oe(n)&&n!=+n},yn.isNative=Ae,yn.isNil=function(n){return null==n},yn.isNull=function(n){return null===n},yn.isNumber=Oe,yn.isObject=je,yn.isObjectLike=we,yn.isPlainObject=ke,yn.isRegExp=Ee,yn.isSafeInteger=function(n){return xe(n)&&n>=-9007199254740991&&9007199254740991>=n},yn.isSet=function(n){return we(n)&&"[object Set]"==Rr(n)},yn.isString=Ie,yn.isSymbol=Se,
|
||||||
|
yn.isTypedArray=Re,yn.isUndefined=function(n){return n===Z},yn.isWeakMap=function(n){return we(n)&&"[object WeakMap]"==Rr(n)},yn.isWeakSet=function(n){return we(n)&&"[object WeakSet]"==pu.call(n)},yn.join=function(n,t){return n?Bu.call(n,t):""},yn.kebabCase=oi,yn.last=Vr,yn.lastIndexOf=function(n,t,r){var e=n?n.length:0;if(!e)return-1;var u=e;if(r!==Z&&(u=Ce(r),u=(0>u?Uu(e+u,0):zu(u,e-1))+1),t!==t)return B(n,u,true);for(;u--;)if(n[u]===t)return u;return-1},yn.lowerCase=ii,yn.lowerFirst=fi,yn.lt=We,
|
||||||
|
yn.lte=function(n,t){return t>=n},yn.max=function(n){return n&&n.length?_(n,Ye,_e):Z},yn.maxBy=function(n,t){return n&&n.length?_(n,kr(t),_e):Z},yn.mean=function(n){return tu(n)/(n?n.length:0)},yn.min=function(n){return n&&n.length?_(n,Ye,We):Z},yn.minBy=function(n,t){return n&&n.length?_(n,kr(t),We):Z},yn.noConflict=function(){return Vn._===this&&(Vn._=_u),this},yn.noop=Xe,yn.now=Co,yn.pad=function(n,t,r){n=Le(n),t=Ce(t);var e=F(n);return t&&t>e?(e=(t-e)/2,t=Ru(e),e=Su(e),vr("",t,r)+n+vr("",e,r)):n;
|
||||||
|
},yn.padEnd=function(n,t,r){return n=Le(n),n+vr(n,t,r)},yn.padStart=function(n,t,r){return n=Le(n),vr(n,t,r)+n},yn.parseInt=function(n,t,r){return r||null==t?t=0:t&&(t=+t),n=Le(n).replace(fn,""),Mu(n,t||(pn.test(n)?16:10))},yn.random=function(n,t,r){if(r&&typeof r!="boolean"&&Mr(n,t,r)&&(t=r=Z),r===Z&&(typeof t=="boolean"?(r=t,t=Z):typeof n=="boolean"&&(r=n,n=Z)),n===Z&&t===Z?(n=0,t=1):(n=ze(n)||0,t===Z?(t=n,n=0):t=ze(t)||0),n>t){var e=n;n=t,t=e}return r||n%1||t%1?(r=Lu(),zu(n+r*(t-n+Fn("1e-"+((r+"").length-1))),t)):Lt(n,t);
|
||||||
|
},yn.reduce=function(n,t,r){var e=Zo(n)?s:y,u=3>arguments.length;return e(n,kr(t,4),r,u,Hu)},yn.reduceRight=function(n,t,r){var e=Zo(n)?h:y,u=3>arguments.length;return e(n,kr(t,4),r,u,Qu)},yn.repeat=Ge,yn.replace=function(){var n=arguments,t=Le(n[0]);return 3>n.length?t:t.replace(n[1],n[2])},yn.result=function(n,t,r){if(Lr(t,n))e=null==n?Z:n[t];else{t=rt(t);var e=$e(n,t);n=Zr(n,t)}return e===Z&&(e=r),be(e)?e.call(n):e},yn.round=Oi,yn.runInContext=D,yn.sample=function(n){n=ve(n)?n:Pe(n);var t=n.length;
|
||||||
|
return t>0?n[Lt(0,t-1)]:Z},yn.size=function(n){if(null==n)return 0;if(ve(n)){var t=n.length;return t&&Ie(n)?F(n):t}return De(n).length},yn.snakeCase=ai,yn.some=function(n,t,r){var e=Zo(n)?p:Nt;return r&&Mr(n,t,r)&&(t=Z),e(n,kr(t,3))},yn.sortedIndex=function(n,t){return Dt(n,t)},yn.sortedIndexBy=function(n,t,r){return Zt(n,t,kr(r))},yn.sortedIndexOf=function(n,t){var r=n?n.length:0;if(r){var e=Dt(n,t);if(r>e&&pe(n[e],t))return e}return-1},yn.sortedLastIndex=function(n,t){return Dt(n,t,true)},yn.sortedLastIndexBy=function(n,t,r){
|
||||||
|
return Zt(n,t,kr(r),true)},yn.sortedLastIndexOf=function(n,t){if(n&&n.length){var r=Dt(n,t,true)-1;if(pe(n[r],t))return r}return-1},yn.startCase=li,yn.startsWith=function(n,t,r){return n=Le(n),r=et(Ce(r),0,n.length),n.lastIndexOf(t,r)==r},yn.subtract=function(n,t){var r;return n===Z&&t===Z?0:(n!==Z&&(r=n),t!==Z&&(r=r===Z?t:r-t),r)},yn.sum=tu,yn.sumBy=function(n,t){return n&&n.length?x(n,kr(t)):0},yn.template=function(n,t,r){var e=yn.templateSettings;r&&Mr(n,t,r)&&(t=Z),n=Le(n),t=Ko({},t,e,Kn),r=Ko({},t.imports,e.imports,Kn);
|
||||||
|
var u,o,i=De(r),f=A(r,i),c=0;r=t.interpolate||xn;var a="__p+='";r=ou((t.escape||xn).source+"|"+r.source+"|"+(r===nn?sn:xn).source+"|"+(t.evaluate||xn).source+"|$","g");var l="sourceURL"in t?"//# sourceURL="+t.sourceURL+"\n":"";if(n.replace(r,function(t,r,e,i,f,l){return e||(e=i),a+=n.slice(c,l).replace(mn,W),r&&(u=true,a+="'+__e("+r+")+'"),f&&(o=true,a+="';"+f+";\n__p+='"),e&&(a+="'+((__t=("+e+"))==null?'':__t)+'"),c=l+t.length,t}),a+="';",(t=t.variable)||(a="with(obj){"+a+"}"),a=(o?a.replace(T,""):a).replace(K,"$1").replace(G,"$1;"),
|
||||||
|
a="function("+(t||"obj")+"){"+(t?"":"obj||(obj={});")+"var __t,__p=''"+(u?",__e=_.escape":"")+(o?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+a+"return __p}",t=hi(function(){return Function(i,l+"return "+a).apply(Z,f)}),t.source=a,ye(t))throw t;return t},yn.times=function(n,t){if(n=Ce(n),1>n||n>9007199254740991)return[];var r=4294967295,e=zu(n,4294967295);for(t=tt(t),n-=4294967295,e=m(e,t);++r<n;)t(r);return e},yn.toInteger=Ce,yn.toLength=Ue,yn.toLower=function(n){
|
||||||
|
return Le(n).toLowerCase()},yn.toNumber=ze,yn.toSafeInteger=function(n){return et(Ce(n),-9007199254740991,9007199254740991)},yn.toString=Le,yn.toUpper=function(n){return Le(n).toUpperCase()},yn.trim=function(n,t,r){return(n=Le(n))?r||t===Z?n.replace(fn,""):(t+="")?(n=n.match(kn),t=t.match(kn),n.slice(O(n,t),k(n,t)+1).join("")):n:n},yn.trimEnd=function(n,t,r){return(n=Le(n))?r||t===Z?n.replace(an,""):(t+="")?(n=n.match(kn),n.slice(0,k(n,t.match(kn))+1).join("")):n:n},yn.trimStart=function(n,t,r){return(n=Le(n))?r||t===Z?n.replace(cn,""):(t+="")?(n=n.match(kn),
|
||||||
|
n.slice(O(n,t.match(kn))).join("")):n:n},yn.truncate=function(n,t){var r=30,e="...";if(je(t))var u="separator"in t?t.separator:u,r="length"in t?Ce(t.length):r,e="omission"in t?Le(t.omission):e;n=Le(n);var o=n.length;if(En.test(n))var i=n.match(kn),o=i.length;if(r>=o)return n;if(o=r-F(e),1>o)return e;if(r=i?i.slice(0,o).join(""):n.slice(0,o),u===Z)return r+e;if(i&&(o+=r.length-o),Ee(u)){if(n.slice(o).search(u)){var f=r;for(u.global||(u=ou(u.source,Le(hn.exec(u))+"g")),u.lastIndex=0;i=u.exec(f);)var c=i.index;
|
||||||
|
r=r.slice(0,c===Z?o:c)}}else n.indexOf(u,o)!=o&&(u=r.lastIndexOf(u),u>-1&&(r=r.slice(0,u)));return r+e},yn.unescape=function(n){return(n=Le(n))&&Y.test(n)?n.replace(V,N):n},yn.uniqueId=function(n){var t=++su;return Le(n)+t},yn.upperCase=si,yn.upperFirst=ci,yn.each=re,yn.eachRight=ee,yn.first=Gr,Qe(yn,function(){var n={};return pt(yn,function(t,r){lu.call(yn.prototype,r)||(n[r]=t)}),n}(),{chain:false}),yn.VERSION="4.5.1",u("bind bindKey curry curryRight partial partialRight".split(" "),function(n){yn[n].placeholder=yn;
|
||||||
|
}),u(["drop","take"],function(n,t){An.prototype[n]=function(r){var e=this.__filtered__;if(e&&!t)return new An(this);r=r===Z?1:Uu(Ce(r),0);var u=this.clone();return e?u.__takeCount__=zu(r,u.__takeCount__):u.__views__.push({size:zu(r,4294967295),type:n+(0>u.__dir__?"Right":"")}),u},An.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}}),u(["filter","map","takeWhile"],function(n,t){var r=t+1,e=1==r||3==r;An.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({
|
||||||
|
iteratee:kr(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),u(["head","last"],function(n,t){var r="take"+(t?"Right":"");An.prototype[n]=function(){return this[r](1).value()[0]}}),u(["initial","tail"],function(n,t){var r="drop"+(t?"":"Right");An.prototype[n]=function(){return this.__filtered__?new An(this):this[r](1)}}),An.prototype.compact=function(){return this.filter(Ye)},An.prototype.find=function(n){return this.filter(n).head()},An.prototype.findLast=function(n){return this.reverse().find(n);
|
||||||
|
},An.prototype.invokeMap=he(function(n,t){return typeof n=="function"?new An(this):this.map(function(r){return mt(r,n,t)})}),An.prototype.reject=function(n){return n=kr(n,3),this.filter(function(t){return!n(t)})},An.prototype.slice=function(n,t){n=Ce(n);var r=this;return r.__filtered__&&(n>0||0>t)?new An(r):(0>n?r=r.takeRight(-n):n&&(r=r.drop(n)),t!==Z&&(t=Ce(t),r=0>t?r.dropRight(-t):r.take(t-n)),r)},An.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},An.prototype.toArray=function(){
|
||||||
|
return this.take(4294967295)},pt(An.prototype,function(n,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),e=/^(?:head|last)$/.test(t),u=yn[e?"take"+("last"==t?"Right":""):t],o=e||/^find/.test(t);u&&(yn.prototype[t]=function(){var t=this.__wrapped__,i=e?[1]:arguments,f=t instanceof An,c=i[0],a=f||Zo(t),s=function(n){return n=u.apply(yn,l([n],i)),e&&h?n[0]:n};a&&r&&typeof c=="function"&&1!=c.length&&(f=a=false);var h=this.__chain__,p=!!this.__actions__.length,c=o&&!h,f=f&&!p;return!o&&a?(t=f?t:new An(this),
|
||||||
|
t=n.apply(t,i),t.__actions__.push({func:ne,args:[s],thisArg:Z}),new wn(t,h)):c&&f?n.apply(this,i):(t=this.thru(s),c?e?t.value()[0]:t.value():t)})}),u("pop push shift sort splice unshift".split(" "),function(n){var t=fu[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|shift)$/.test(n);yn.prototype[n]=function(){var n=arguments;return e&&!this.__chain__?t.apply(this.value(),n):this[r](function(r){return t.apply(r,n)})}}),pt(An.prototype,function(n,t){var r=yn[t];if(r){var e=r.name+"";(Yu[e]||(Yu[e]=[])).push({
|
||||||
|
name:t,func:r})}}),Yu[pr(Z,2).name]=[{name:"wrapper",func:Z}],An.prototype.clone=function(){var n=new An(this.__wrapped__);return n.__actions__=Xt(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Xt(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Xt(this.__views__),n},An.prototype.reverse=function(){if(this.__filtered__){var n=new An(this);n.__dir__=-1,n.__filtered__=true}else n=this.clone(),n.__dir__*=-1;return n},An.prototype.value=function(){
|
||||||
|
var n,t=this.__wrapped__.value(),r=this.__dir__,e=Zo(t),u=0>r,o=e?t.length:0;n=0;for(var i=o,f=this.__views__,c=-1,a=f.length;++c<a;){var l=f[c],s=l.size;switch(l.type){case"drop":n+=s;break;case"dropRight":i-=s;break;case"take":i=zu(i,n+s);break;case"takeRight":n=Uu(n,i-s)}}if(n={start:n,end:i},i=n.start,f=n.end,n=f-i,u=u?f:i-1,i=this.__iteratees__,f=i.length,c=0,a=zu(n,this.__takeCount__),!e||200>o||o==n&&a==n)return Kt(t,this.__actions__);e=[];n:for(;n--&&a>c;){for(u+=r,o=-1,l=t[u];++o<f;){var h=i[o],s=h.type,h=(0,
|
||||||
|
h.iteratee)(l);if(2==s)l=h;else if(!h){if(1==s)continue n;break n}}e[c++]=l}return e},yn.prototype.at=ko,yn.prototype.chain=function(){return Xr(this)},yn.prototype.commit=function(){return new wn(this.value(),this.__chain__)},yn.prototype.flatMap=function(n){return this.map(n).flatten()},yn.prototype.next=function(){this.__values__===Z&&(this.__values__=Be(this.value()));var n=this.__index__>=this.__values__.length,t=n?Z:this.__values__[this.__index__++];return{done:n,value:t}},yn.prototype.plant=function(n){
|
||||||
|
for(var t,r=this;r instanceof jn;){var e=Pr(r);e.__index__=0,e.__values__=Z,t?u.__wrapped__=e:t=e;var u=e,r=r.__wrapped__}return u.__wrapped__=n,t},yn.prototype.reverse=function(){var n=this.__wrapped__;return n instanceof An?(this.__actions__.length&&(n=new An(this)),n=n.reverse(),n.__actions__.push({func:ne,args:[Yr],thisArg:Z}),new wn(n,this.__chain__)):this.thru(Yr)},yn.prototype.toJSON=yn.prototype.valueOf=yn.prototype.value=function(){return Kt(this.__wrapped__,this.__actions__)},Au&&(yn.prototype[Au]=te),
|
||||||
|
yn}var Z,q=1/0,P=NaN,T=/\b__p\+='';/g,K=/\b(__p\+=)''\+/g,G=/(__e\(.*?\)|\b__t\))\+'';/g,V=/&(?:amp|lt|gt|quot|#39|#96);/g,J=/[&<>"'`]/g,Y=RegExp(V.source),H=RegExp(J.source),Q=/<%-([\s\S]+?)%>/g,X=/<%([\s\S]+?)%>/g,nn=/<%=([\s\S]+?)%>/g,tn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,rn=/^\w*$/,en=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]/g,un=/[\\^$.*+?()[\]{}|]/g,on=RegExp(un.source),fn=/^\s+|\s+$/g,cn=/^\s+/,an=/\s+$/,ln=/\\(\\)?/g,sn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,hn=/\w*$/,pn=/^0x/i,_n=/^[-+]0x[0-9a-f]+$/i,gn=/^0b[01]+$/i,vn=/^\[object .+?Constructor\]$/,dn=/^0o[0-7]+$/i,yn=/^(?:0|[1-9]\d*)$/,bn=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,xn=/($^)/,mn=/['\n\r\u2028\u2029\\]/g,jn="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?)*",wn="(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])"+jn,An="(?:[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]?|[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff])",On=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]","g"),kn=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+An+jn,"g"),En=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0\\ufe0e\\ufe0f]"),In=/[a-zA-Z0-9]+/g,Sn=RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2018\\u2019\\u201c\\u201d \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde]|$)|(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2018\\u2019\\u201c\\u201d \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2018\\u2019\\u201c\\u201d \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2018\\u2019\\u201c\\u201d \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])|$)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2018\\u2019\\u201c\\u201d \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+|[A-Z\\xc0-\\xd6\\xd8-\\xde]+|\\d+",wn].join("|"),"g"),Rn=/[a-z][A-Z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Wn="Array Buffer Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Map Math Object Reflect RegExp Set String Symbol TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap _ clearTimeout isFinite parseInt setTimeout".split(" "),Bn={};
|
||||||
|
Bn["[object Float32Array]"]=Bn["[object Float64Array]"]=Bn["[object Int8Array]"]=Bn["[object Int16Array]"]=Bn["[object Int32Array]"]=Bn["[object Uint8Array]"]=Bn["[object Uint8ClampedArray]"]=Bn["[object Uint16Array]"]=Bn["[object Uint32Array]"]=true,Bn["[object Arguments]"]=Bn["[object Array]"]=Bn["[object ArrayBuffer]"]=Bn["[object Boolean]"]=Bn["[object Date]"]=Bn["[object Error]"]=Bn["[object Function]"]=Bn["[object Map]"]=Bn["[object Number]"]=Bn["[object Object]"]=Bn["[object RegExp]"]=Bn["[object Set]"]=Bn["[object String]"]=Bn["[object WeakMap]"]=false;
|
||||||
|
var Cn={};Cn["[object Arguments]"]=Cn["[object Array]"]=Cn["[object ArrayBuffer]"]=Cn["[object Boolean]"]=Cn["[object Date]"]=Cn["[object Float32Array]"]=Cn["[object Float64Array]"]=Cn["[object Int8Array]"]=Cn["[object Int16Array]"]=Cn["[object Int32Array]"]=Cn["[object Map]"]=Cn["[object Number]"]=Cn["[object Object]"]=Cn["[object RegExp]"]=Cn["[object Set]"]=Cn["[object String]"]=Cn["[object Symbol]"]=Cn["[object Uint8Array]"]=Cn["[object Uint8ClampedArray]"]=Cn["[object Uint16Array]"]=Cn["[object Uint32Array]"]=true,
|
||||||
|
Cn["[object Error]"]=Cn["[object Function]"]=Cn["[object WeakMap]"]=false;var Un={"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O",
|
||||||
|
"\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss"},zn={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},Mn={"&":"&","<":"<",">":">",""":'"',"'":"'","`":"`"},Ln={"function":true,object:true},$n={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"
|
||||||
|
},Fn=parseFloat,Nn=parseInt,Dn=Ln[typeof exports]&&exports&&!exports.nodeType?exports:Z,Zn=Ln[typeof module]&&module&&!module.nodeType?module:Z,qn=Zn&&Zn.exports===Dn?Dn:Z,Pn=E(Dn&&Zn&&typeof global=="object"&&global),Tn=E(Ln[typeof self]&&self),Kn=E(Ln[typeof window]&&window),Gn=E(Ln[typeof this]&&this),Vn=Pn||Kn!==(Gn&&Gn.window)&&Kn||Tn||Gn||Function("return this")(),Jn=D();(Kn||Tn||{})._=Jn,typeof define=="function"&&typeof define.amd=="object"&&define.amd? define(function(){return Jn}):Dn&&Zn?(qn&&((Zn.exports=Jn)._=Jn),
|
||||||
|
Dn._=Jn):Vn._=Jn}).call(this);
|
||||||
300
dist/mapping.fp.js
vendored
Normal file
300
dist/mapping.fp.js
vendored
Normal file
@@ -0,0 +1,300 @@
|
|||||||
|
(function webpackUniversalModuleDefinition(root, factory) {
|
||||||
|
if(typeof exports === 'object' && typeof module === 'object')
|
||||||
|
module.exports = factory();
|
||||||
|
else if(typeof define === 'function' && define.amd)
|
||||||
|
define([], factory);
|
||||||
|
else if(typeof exports === 'object')
|
||||||
|
exports["mapping"] = factory();
|
||||||
|
else
|
||||||
|
root["mapping"] = factory();
|
||||||
|
})(this, function() {
|
||||||
|
return /******/ (function(modules) { // webpackBootstrap
|
||||||
|
/******/ // The module cache
|
||||||
|
/******/ var installedModules = {};
|
||||||
|
|
||||||
|
/******/ // The require function
|
||||||
|
/******/ function __webpack_require__(moduleId) {
|
||||||
|
|
||||||
|
/******/ // Check if module is in cache
|
||||||
|
/******/ if(installedModules[moduleId])
|
||||||
|
/******/ return installedModules[moduleId].exports;
|
||||||
|
|
||||||
|
/******/ // Create a new module (and put it into the cache)
|
||||||
|
/******/ var module = installedModules[moduleId] = {
|
||||||
|
/******/ exports: {},
|
||||||
|
/******/ id: moduleId,
|
||||||
|
/******/ loaded: false
|
||||||
|
/******/ };
|
||||||
|
|
||||||
|
/******/ // Execute the module function
|
||||||
|
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
||||||
|
|
||||||
|
/******/ // Flag the module as loaded
|
||||||
|
/******/ module.loaded = true;
|
||||||
|
|
||||||
|
/******/ // Return the exports of the module
|
||||||
|
/******/ return module.exports;
|
||||||
|
/******/ }
|
||||||
|
|
||||||
|
|
||||||
|
/******/ // expose the modules object (__webpack_modules__)
|
||||||
|
/******/ __webpack_require__.m = modules;
|
||||||
|
|
||||||
|
/******/ // expose the module cache
|
||||||
|
/******/ __webpack_require__.c = installedModules;
|
||||||
|
|
||||||
|
/******/ // __webpack_public_path__
|
||||||
|
/******/ __webpack_require__.p = "";
|
||||||
|
|
||||||
|
/******/ // Load entry module and return exports
|
||||||
|
/******/ return __webpack_require__(0);
|
||||||
|
/******/ })
|
||||||
|
/************************************************************************/
|
||||||
|
/******/ ([
|
||||||
|
/* 0 */
|
||||||
|
/***/ function(module, exports) {
|
||||||
|
|
||||||
|
/** Used to map aliases to their real names. */
|
||||||
|
exports.aliasToReal = {
|
||||||
|
'__': 'placeholder',
|
||||||
|
'all': 'some',
|
||||||
|
'allPass': 'overEvery',
|
||||||
|
'apply': 'spread',
|
||||||
|
'assoc': 'set',
|
||||||
|
'assocPath': 'set',
|
||||||
|
'compose': 'flowRight',
|
||||||
|
'contains': 'includes',
|
||||||
|
'dissoc': 'unset',
|
||||||
|
'dissocPath': 'unset',
|
||||||
|
'each': 'forEach',
|
||||||
|
'eachRight': 'forEachRight',
|
||||||
|
'equals': 'isEqual',
|
||||||
|
'extend': 'assignIn',
|
||||||
|
'extendWith': 'assignInWith',
|
||||||
|
'first': 'head',
|
||||||
|
'init': 'initial',
|
||||||
|
'mapObj': 'mapValues',
|
||||||
|
'omitAll': 'omit',
|
||||||
|
'nAry': 'ary',
|
||||||
|
'path': 'get',
|
||||||
|
'pathEq': 'matchesProperty',
|
||||||
|
'pathOr': 'getOr',
|
||||||
|
'pickAll': 'pick',
|
||||||
|
'pipe': 'flow',
|
||||||
|
'prop': 'get',
|
||||||
|
'propOf': 'propertyOf',
|
||||||
|
'propOr': 'getOr',
|
||||||
|
'somePass': 'overSome',
|
||||||
|
'unapply': 'rest',
|
||||||
|
'unnest': 'flatten',
|
||||||
|
'useWith': 'overArgs',
|
||||||
|
'whereEq': 'filter',
|
||||||
|
'zipObj': 'zipObject'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map ary to method names. */
|
||||||
|
exports.aryMethod = {
|
||||||
|
'1': [
|
||||||
|
'attempt', 'castArray', 'ceil', 'create', 'curry', 'curryRight', 'floor',
|
||||||
|
'fromPairs', 'invert', 'iteratee', 'memoize', 'method', 'methodOf', 'mixin',
|
||||||
|
'over', 'overEvery', 'overSome', 'rest', 'reverse', 'round', 'runInContext',
|
||||||
|
'spread', 'template', 'trim', 'trimEnd', 'trimStart', 'uniqueId', 'words'
|
||||||
|
],
|
||||||
|
'2': [
|
||||||
|
'add', 'after', 'ary', 'assign', 'assignIn', 'at', 'before', 'bind', 'bindKey',
|
||||||
|
'chunk', 'cloneDeepWith', 'cloneWith', 'concat', 'countBy', 'curryN',
|
||||||
|
'curryRightN', 'debounce', 'defaults', 'defaultsDeep', 'delay', 'difference',
|
||||||
|
'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith', 'eq', 'every',
|
||||||
|
'filter', 'find', 'find', 'findIndex', 'findKey', 'findLast', 'findLastIndex',
|
||||||
|
'findLastKey', 'flatMap', 'flattenDepth', 'forEach', 'forEachRight', 'forIn',
|
||||||
|
'forInRight', 'forOwn', 'forOwnRight', 'get', 'groupBy', 'gt', 'gte', 'has',
|
||||||
|
'hasIn', 'includes', 'indexOf', 'intersection', 'invertBy', 'invoke', 'invokeMap',
|
||||||
|
'isEqual', 'isMatch', 'join', 'keyBy', 'lastIndexOf', 'lt', 'lte', 'map',
|
||||||
|
'mapKeys', 'mapValues', 'matchesProperty', 'maxBy', 'merge', 'minBy', 'omit',
|
||||||
|
'omitBy', 'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt',
|
||||||
|
'partial', 'partialRight', 'partition', 'pick', 'pickBy', 'pull', 'pullAll',
|
||||||
|
'pullAt', 'random', 'range', 'rangeRight', 'rearg', 'reject', 'remove',
|
||||||
|
'repeat', 'result', 'sampleSize', 'some', 'sortBy', 'sortedIndex',
|
||||||
|
'sortedIndexOf', 'sortedLastIndex', 'sortedLastIndexOf', 'sortedUniqBy',
|
||||||
|
'split', 'startsWith', 'subtract', 'sumBy', 'take', 'takeRight', 'takeRightWhile',
|
||||||
|
'takeWhile', 'tap', 'throttle', 'thru', 'times', 'trimChars', 'trimCharsEnd',
|
||||||
|
'trimCharsStart', 'truncate', 'union', 'uniqBy', 'uniqWith', 'unset',
|
||||||
|
'unzipWith', 'without', 'wrap', 'xor', 'zip', 'zipObject', 'zipObjectDeep'
|
||||||
|
],
|
||||||
|
'3': [
|
||||||
|
'assignInWith', 'assignWith', 'clamp', 'differenceBy', 'differenceWith',
|
||||||
|
'getOr', 'inRange', 'intersectionBy', 'intersectionWith', 'isEqualWith',
|
||||||
|
'isMatchWith', 'mergeWith', 'orderBy', 'pullAllBy', 'reduce', 'reduceRight',
|
||||||
|
'replace', 'set', 'slice', 'sortedIndexBy', 'sortedLastIndexBy', 'transform',
|
||||||
|
'unionBy', 'unionWith', 'xorBy', 'xorWith', 'zipWith'
|
||||||
|
],
|
||||||
|
'4': [
|
||||||
|
'fill', 'setWith'
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map ary to rearg configs. */
|
||||||
|
exports.aryRearg = {
|
||||||
|
'2': [1, 0],
|
||||||
|
'3': [2, 0, 1],
|
||||||
|
'4': [3, 2, 0, 1]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to their iteratee ary. */
|
||||||
|
exports.iterateeAry = {
|
||||||
|
'assignWith': 2,
|
||||||
|
'assignInWith': 2,
|
||||||
|
'cloneDeepWith': 1,
|
||||||
|
'cloneWith': 1,
|
||||||
|
'dropRightWhile': 1,
|
||||||
|
'dropWhile': 1,
|
||||||
|
'every': 1,
|
||||||
|
'filter': 1,
|
||||||
|
'find': 1,
|
||||||
|
'findIndex': 1,
|
||||||
|
'findKey': 1,
|
||||||
|
'findLast': 1,
|
||||||
|
'findLastIndex': 1,
|
||||||
|
'findLastKey': 1,
|
||||||
|
'flatMap': 1,
|
||||||
|
'forEach': 1,
|
||||||
|
'forEachRight': 1,
|
||||||
|
'forIn': 1,
|
||||||
|
'forInRight': 1,
|
||||||
|
'forOwn': 1,
|
||||||
|
'forOwnRight': 1,
|
||||||
|
'isEqualWith': 2,
|
||||||
|
'isMatchWith': 2,
|
||||||
|
'map': 1,
|
||||||
|
'mapKeys': 1,
|
||||||
|
'mapValues': 1,
|
||||||
|
'partition': 1,
|
||||||
|
'reduce': 2,
|
||||||
|
'reduceRight': 2,
|
||||||
|
'reject': 1,
|
||||||
|
'remove': 1,
|
||||||
|
'some': 1,
|
||||||
|
'takeRightWhile': 1,
|
||||||
|
'takeWhile': 1,
|
||||||
|
'times': 1,
|
||||||
|
'transform': 2
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to iteratee rearg configs. */
|
||||||
|
exports.iterateeRearg = {
|
||||||
|
'mapKeys': [1]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to rearg configs. */
|
||||||
|
exports.methodRearg = {
|
||||||
|
'assignInWith': [1, 2, 0],
|
||||||
|
'assignWith': [1, 2, 0],
|
||||||
|
'getOr': [2, 1, 0],
|
||||||
|
'isMatchWith': [2, 1, 0],
|
||||||
|
'mergeWith': [1, 2, 0],
|
||||||
|
'pullAllBy': [2, 1, 0],
|
||||||
|
'setWith': [3, 1, 2, 0],
|
||||||
|
'sortedIndexBy': [2, 1, 0],
|
||||||
|
'sortedLastIndexBy': [2, 1, 0],
|
||||||
|
'zipWith': [1, 2, 0]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to spread configs. */
|
||||||
|
exports.methodSpread = {
|
||||||
|
'partial': 1,
|
||||||
|
'partialRight': 1
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to identify methods which mutate arrays or objects. */
|
||||||
|
exports.mutate = {
|
||||||
|
'array': {
|
||||||
|
'fill': true,
|
||||||
|
'pull': true,
|
||||||
|
'pullAll': true,
|
||||||
|
'pullAllBy': true,
|
||||||
|
'pullAt': true,
|
||||||
|
'remove': true,
|
||||||
|
'reverse': true
|
||||||
|
},
|
||||||
|
'object': {
|
||||||
|
'assign': true,
|
||||||
|
'assignIn': true,
|
||||||
|
'assignInWith': true,
|
||||||
|
'assignWith': true,
|
||||||
|
'defaults': true,
|
||||||
|
'defaultsDeep': true,
|
||||||
|
'merge': true,
|
||||||
|
'mergeWith': true
|
||||||
|
},
|
||||||
|
'set': {
|
||||||
|
'set': true,
|
||||||
|
'setWith': true,
|
||||||
|
'unset': true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to track methods with placeholder support */
|
||||||
|
exports.placeholder = {
|
||||||
|
'bind': true,
|
||||||
|
'bindKey': true,
|
||||||
|
'curry': true,
|
||||||
|
'curryRight': true,
|
||||||
|
'partial': true,
|
||||||
|
'partialRight': true
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map real names to their aliases. */
|
||||||
|
exports.realToAlias = (function() {
|
||||||
|
var hasOwnProperty = Object.prototype.hasOwnProperty,
|
||||||
|
object = exports.aliasToReal,
|
||||||
|
result = {};
|
||||||
|
|
||||||
|
for (var key in object) {
|
||||||
|
var value = object[key];
|
||||||
|
if (hasOwnProperty.call(result, value)) {
|
||||||
|
result[value].push(key);
|
||||||
|
} else {
|
||||||
|
result[value] = [key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}());
|
||||||
|
|
||||||
|
/** Used to map method names to other names. */
|
||||||
|
exports.remap = {
|
||||||
|
'curryN': 'curry',
|
||||||
|
'curryRightN': 'curryRight',
|
||||||
|
'getOr': 'get',
|
||||||
|
'trimChars': 'trim',
|
||||||
|
'trimCharsEnd': 'trimEnd',
|
||||||
|
'trimCharsStart': 'trimStart'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to track methods that skip `_.rearg`. */
|
||||||
|
exports.skipRearg = {
|
||||||
|
'add': true,
|
||||||
|
'assign': true,
|
||||||
|
'assignIn': true,
|
||||||
|
'concat': true,
|
||||||
|
'difference': true,
|
||||||
|
'gt': true,
|
||||||
|
'gte': true,
|
||||||
|
'lt': true,
|
||||||
|
'lte': true,
|
||||||
|
'matchesProperty': true,
|
||||||
|
'merge': true,
|
||||||
|
'partial': true,
|
||||||
|
'partialRight': true,
|
||||||
|
'random': true,
|
||||||
|
'range': true,
|
||||||
|
'rangeRight': true,
|
||||||
|
'subtract': true,
|
||||||
|
'zip': true,
|
||||||
|
'zipObject': true
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }
|
||||||
|
/******/ ])
|
||||||
|
});
|
||||||
|
;
|
||||||
10649
doc/README.md
10649
doc/README.md
File diff suppressed because it is too large
Load Diff
@@ -1,35 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
// cleanup requested filepath
|
|
||||||
$file = isset($_GET['f']) ? $_GET['f'] : 'lodash';
|
|
||||||
$file = preg_replace('#(\.*[\/])+#', '', $file);
|
|
||||||
$file .= preg_match('/\.[a-z]+$/', $file) ? '' : '.js';
|
|
||||||
|
|
||||||
// output filename
|
|
||||||
if (isset($_GET['o'])) {
|
|
||||||
$output = $_GET['o'];
|
|
||||||
} else if (isset($_SERVER['argv'][1])) {
|
|
||||||
$output = $_SERVER['argv'][1];
|
|
||||||
} else {
|
|
||||||
$output = basename($file);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
require('../vendor/docdown/docdown.php');
|
|
||||||
|
|
||||||
// generate Markdown
|
|
||||||
$markdown = docdown(array(
|
|
||||||
'path' => '../' . $file,
|
|
||||||
'title' => 'Lo-Dash <sup>v0.5.2</sup>',
|
|
||||||
'url' => 'https://github.com/bestiejs/lodash/blob/master/lodash.js'
|
|
||||||
));
|
|
||||||
|
|
||||||
// save to a .md file
|
|
||||||
file_put_contents($output . '.md', $markdown);
|
|
||||||
|
|
||||||
// print
|
|
||||||
header('Content-Type: text/plain;charset=utf-8');
|
|
||||||
echo $markdown . PHP_EOL;
|
|
||||||
|
|
||||||
?>
|
|
||||||
318
fp/_baseConvert.js
Normal file
318
fp/_baseConvert.js
Normal file
@@ -0,0 +1,318 @@
|
|||||||
|
var mapping = require('./_mapping'),
|
||||||
|
mutateMap = mapping.mutate,
|
||||||
|
placeholder = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `convert` which accepts a `util` object of methods
|
||||||
|
* required to perform conversions.
|
||||||
|
*
|
||||||
|
* @param {Object} util The util object.
|
||||||
|
* @param {string} name The name of the function to wrap.
|
||||||
|
* @param {Function} func The function to wrap.
|
||||||
|
* @param {Object} [options] The options object.
|
||||||
|
* @param {boolean} [options.cap=true] Specify capping iteratee arguments.
|
||||||
|
* @param {boolean} [options.curry=true] Specify currying.
|
||||||
|
* @param {boolean} [options.fixed=true] Specify fixed arity.
|
||||||
|
* @param {boolean} [options.immutable=true] Specify immutable operations.
|
||||||
|
* @param {boolean} [options.rearg=true] Specify rearranging arguments.
|
||||||
|
* @returns {Function|Object} Returns the converted function or object.
|
||||||
|
*/
|
||||||
|
function baseConvert(util, name, func, options) {
|
||||||
|
var setPlaceholder,
|
||||||
|
isLib = typeof name == 'function',
|
||||||
|
isObj = name === Object(name);
|
||||||
|
|
||||||
|
if (isObj) {
|
||||||
|
options = func;
|
||||||
|
func = name;
|
||||||
|
name = undefined;
|
||||||
|
}
|
||||||
|
if (func == null) {
|
||||||
|
throw new TypeError;
|
||||||
|
}
|
||||||
|
options || (options = {});
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
'cap': 'cap' in options ? options.cap : true,
|
||||||
|
'curry': 'curry' in options ? options.curry : true,
|
||||||
|
'fixed': 'fixed' in options ? options.fixed : true,
|
||||||
|
'immutable': 'immutable' in options ? options.immutable : true,
|
||||||
|
'rearg': 'rearg' in options ? options.rearg : true
|
||||||
|
};
|
||||||
|
|
||||||
|
var forceRearg = ('rearg' in options) && options.rearg;
|
||||||
|
|
||||||
|
var helpers = isLib ? func : {
|
||||||
|
'ary': util.ary,
|
||||||
|
'clone': util.clone,
|
||||||
|
'curry': util.curry,
|
||||||
|
'forEach': util.forEach,
|
||||||
|
'isArray': util.isArray,
|
||||||
|
'isFunction': util.isFunction,
|
||||||
|
'iteratee': util.iteratee,
|
||||||
|
'keys': util.keys,
|
||||||
|
'rearg': util.rearg,
|
||||||
|
'spread': util.spread,
|
||||||
|
'toPath': util.toPath
|
||||||
|
};
|
||||||
|
|
||||||
|
var ary = helpers.ary,
|
||||||
|
clone = helpers.clone,
|
||||||
|
curry = helpers.curry,
|
||||||
|
each = helpers.forEach,
|
||||||
|
isArray = helpers.isArray,
|
||||||
|
isFunction = helpers.isFunction,
|
||||||
|
keys = helpers.keys,
|
||||||
|
rearg = helpers.rearg,
|
||||||
|
spread = helpers.spread,
|
||||||
|
toPath = helpers.toPath;
|
||||||
|
|
||||||
|
var aryMethodKeys = keys(mapping.aryMethod);
|
||||||
|
|
||||||
|
var baseArity = function(func, n) {
|
||||||
|
return n == 2
|
||||||
|
? function(a, b) { return func.apply(undefined, arguments); }
|
||||||
|
: function(a) { return func.apply(undefined, arguments); };
|
||||||
|
};
|
||||||
|
|
||||||
|
var baseAry = function(func, n) {
|
||||||
|
return n == 2
|
||||||
|
? function(a, b) { return func(a, b); }
|
||||||
|
: function(a) { return func(a); };
|
||||||
|
};
|
||||||
|
|
||||||
|
var cloneArray = function(array) {
|
||||||
|
var length = array ? array.length : 0,
|
||||||
|
result = Array(length);
|
||||||
|
|
||||||
|
while (length--) {
|
||||||
|
result[length] = array[length];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
var cloneByPath = function(object, path) {
|
||||||
|
path = toPath(path);
|
||||||
|
|
||||||
|
var index = -1,
|
||||||
|
length = path.length,
|
||||||
|
result = clone(Object(object)),
|
||||||
|
nested = result;
|
||||||
|
|
||||||
|
while (nested != null && ++index < length) {
|
||||||
|
var key = path[index],
|
||||||
|
value = nested[key];
|
||||||
|
|
||||||
|
if (value != null) {
|
||||||
|
nested[key] = clone(Object(value));
|
||||||
|
}
|
||||||
|
nested = nested[key];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
var createCloner = function(func) {
|
||||||
|
return function(object) {
|
||||||
|
return func({}, object);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var immutWrap = function(func, cloner) {
|
||||||
|
return function() {
|
||||||
|
var length = arguments.length;
|
||||||
|
if (!length) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
var args = Array(length);
|
||||||
|
while (length--) {
|
||||||
|
args[length] = arguments[length];
|
||||||
|
}
|
||||||
|
var result = args[0] = cloner.apply(undefined, args);
|
||||||
|
func.apply(undefined, args);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var iterateeAry = function(func, n) {
|
||||||
|
return overArg(func, function(func) {
|
||||||
|
return typeof func == 'function' ? baseAry(func, n) : func;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
var iterateeRearg = function(func, indexes) {
|
||||||
|
return overArg(func, function(func) {
|
||||||
|
var n = indexes.length;
|
||||||
|
return baseArity(rearg(baseAry(func, n), indexes), n);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
var overArg = function(func, iteratee, retArg) {
|
||||||
|
return function() {
|
||||||
|
var length = arguments.length;
|
||||||
|
if (!length) {
|
||||||
|
return func();
|
||||||
|
}
|
||||||
|
var args = Array(length);
|
||||||
|
while (length--) {
|
||||||
|
args[length] = arguments[length];
|
||||||
|
}
|
||||||
|
var index = config.rearg ? 0 : (length - 1);
|
||||||
|
args[index] = iteratee(args[index]);
|
||||||
|
return func.apply(undefined, args);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var wrappers = {
|
||||||
|
'castArray': function(castArray) {
|
||||||
|
return function() {
|
||||||
|
var value = arguments[0];
|
||||||
|
return isArray(value)
|
||||||
|
? castArray(cloneArray(value))
|
||||||
|
: castArray.apply(undefined, arguments);
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'iteratee': function(iteratee) {
|
||||||
|
return function() {
|
||||||
|
var func = arguments[0],
|
||||||
|
arity = arguments[1],
|
||||||
|
result = iteratee(func, arity),
|
||||||
|
length = result.length;
|
||||||
|
|
||||||
|
if (config.cap && typeof arity == 'number') {
|
||||||
|
arity = arity > 2 ? (arity - 2) : 1;
|
||||||
|
return (length && length <= arity) ? result : baseAry(result, arity);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'mixin': function(mixin) {
|
||||||
|
return function(source) {
|
||||||
|
var func = this;
|
||||||
|
if (!isFunction(func)) {
|
||||||
|
return mixin(func, Object(source));
|
||||||
|
}
|
||||||
|
var methods = [],
|
||||||
|
methodNames = [];
|
||||||
|
|
||||||
|
each(keys(source), function(key) {
|
||||||
|
var value = source[key];
|
||||||
|
if (isFunction(value)) {
|
||||||
|
methodNames.push(key);
|
||||||
|
methods.push(func.prototype[key]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
mixin(func, Object(source));
|
||||||
|
|
||||||
|
each(methodNames, function(methodName, index) {
|
||||||
|
var method = methods[index];
|
||||||
|
if (isFunction(method)) {
|
||||||
|
func.prototype[methodName] = method;
|
||||||
|
} else {
|
||||||
|
delete func.prototype[methodName];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return func;
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'runInContext': function(runInContext) {
|
||||||
|
return function(context) {
|
||||||
|
return baseConvert(util, runInContext(context), options);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var wrap = function(name, func) {
|
||||||
|
name = mapping.aliasToReal[name] || name;
|
||||||
|
var wrapper = wrappers[name];
|
||||||
|
if (wrapper) {
|
||||||
|
return wrapper(func);
|
||||||
|
}
|
||||||
|
var wrapped = func;
|
||||||
|
if (config.immutable) {
|
||||||
|
if (mutateMap.array[name]) {
|
||||||
|
wrapped = immutWrap(func, cloneArray);
|
||||||
|
}
|
||||||
|
else if (mutateMap.object[name]) {
|
||||||
|
wrapped = immutWrap(func, createCloner(func));
|
||||||
|
}
|
||||||
|
else if (mutateMap.set[name]) {
|
||||||
|
wrapped = immutWrap(func, cloneByPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var result;
|
||||||
|
each(aryMethodKeys, function(aryKey) {
|
||||||
|
each(mapping.aryMethod[aryKey], function(otherName) {
|
||||||
|
if (name == otherName) {
|
||||||
|
var aryN = !isLib && mapping.iterateeAry[name],
|
||||||
|
reargIndexes = mapping.iterateeRearg[name],
|
||||||
|
spreadStart = mapping.methodSpread[name];
|
||||||
|
|
||||||
|
result = wrapped;
|
||||||
|
if (config.fixed) {
|
||||||
|
result = spreadStart === undefined
|
||||||
|
? ary(result, aryKey)
|
||||||
|
: spread(result, spreadStart);
|
||||||
|
}
|
||||||
|
if (config.rearg && aryKey > 1 && (forceRearg || !mapping.skipRearg[name])) {
|
||||||
|
result = rearg(result, mapping.methodRearg[name] || mapping.aryRearg[aryKey]);
|
||||||
|
}
|
||||||
|
if (config.cap) {
|
||||||
|
if (reargIndexes) {
|
||||||
|
result = iterateeRearg(result, reargIndexes);
|
||||||
|
} else if (aryN) {
|
||||||
|
result = iterateeAry(result, aryN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (config.curry && aryKey > 1) {
|
||||||
|
result = curry(result, aryKey);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return !result;
|
||||||
|
});
|
||||||
|
|
||||||
|
result || (result = wrapped);
|
||||||
|
if (mapping.placeholder[name]) {
|
||||||
|
setPlaceholder = true;
|
||||||
|
func.placeholder = result.placeholder = placeholder;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!isObj) {
|
||||||
|
return wrap(name, func);
|
||||||
|
}
|
||||||
|
var _ = func;
|
||||||
|
|
||||||
|
// Iterate over methods for the current ary cap.
|
||||||
|
var pairs = [];
|
||||||
|
each(aryMethodKeys, function(aryKey) {
|
||||||
|
each(mapping.aryMethod[aryKey], function(key) {
|
||||||
|
var func = _[mapping.remap[key] || key];
|
||||||
|
if (func) {
|
||||||
|
pairs.push([key, wrap(key, func)]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Assign to `_` leaving `_.prototype` unchanged to allow chaining.
|
||||||
|
each(pairs, function(pair) {
|
||||||
|
_[pair[0]] = pair[1];
|
||||||
|
});
|
||||||
|
|
||||||
|
if (setPlaceholder) {
|
||||||
|
_.placeholder = placeholder;
|
||||||
|
}
|
||||||
|
// Wrap the lodash method and its aliases.
|
||||||
|
each(keys(_), function(key) {
|
||||||
|
each(mapping.realToAlias[key] || [], function(alias) {
|
||||||
|
_[alias] = _[key];
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return _;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseConvert;
|
||||||
17
fp/_convertBrowser.js
Normal file
17
fp/_convertBrowser.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
var baseConvert = require('./_baseConvert');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts `lodash` to an immutable auto-curried iteratee-first data-last version.
|
||||||
|
*
|
||||||
|
* @param {Function} lodash The lodash function.
|
||||||
|
* @param {Object} [options] The options object. See `baseConvert` for more details.
|
||||||
|
* @returns {Function} Returns the converted `lodash`.
|
||||||
|
*/
|
||||||
|
function browserConvert(lodash, options) {
|
||||||
|
return baseConvert(lodash, lodash, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof _ == 'function') {
|
||||||
|
_ = browserConvert(_.runInContext());
|
||||||
|
}
|
||||||
|
module.exports = browserConvert;
|
||||||
238
fp/_mapping.js
Normal file
238
fp/_mapping.js
Normal file
@@ -0,0 +1,238 @@
|
|||||||
|
/** Used to map aliases to their real names. */
|
||||||
|
exports.aliasToReal = {
|
||||||
|
'__': 'placeholder',
|
||||||
|
'all': 'some',
|
||||||
|
'allPass': 'overEvery',
|
||||||
|
'apply': 'spread',
|
||||||
|
'assoc': 'set',
|
||||||
|
'assocPath': 'set',
|
||||||
|
'compose': 'flowRight',
|
||||||
|
'contains': 'includes',
|
||||||
|
'dissoc': 'unset',
|
||||||
|
'dissocPath': 'unset',
|
||||||
|
'each': 'forEach',
|
||||||
|
'eachRight': 'forEachRight',
|
||||||
|
'equals': 'isEqual',
|
||||||
|
'extend': 'assignIn',
|
||||||
|
'extendWith': 'assignInWith',
|
||||||
|
'first': 'head',
|
||||||
|
'init': 'initial',
|
||||||
|
'mapObj': 'mapValues',
|
||||||
|
'omitAll': 'omit',
|
||||||
|
'nAry': 'ary',
|
||||||
|
'path': 'get',
|
||||||
|
'pathEq': 'matchesProperty',
|
||||||
|
'pathOr': 'getOr',
|
||||||
|
'pickAll': 'pick',
|
||||||
|
'pipe': 'flow',
|
||||||
|
'prop': 'get',
|
||||||
|
'propOf': 'propertyOf',
|
||||||
|
'propOr': 'getOr',
|
||||||
|
'somePass': 'overSome',
|
||||||
|
'unapply': 'rest',
|
||||||
|
'unnest': 'flatten',
|
||||||
|
'useWith': 'overArgs',
|
||||||
|
'whereEq': 'filter',
|
||||||
|
'zipObj': 'zipObject'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map ary to method names. */
|
||||||
|
exports.aryMethod = {
|
||||||
|
'1': [
|
||||||
|
'attempt', 'castArray', 'ceil', 'create', 'curry', 'curryRight', 'floor',
|
||||||
|
'fromPairs', 'invert', 'iteratee', 'memoize', 'method', 'methodOf', 'mixin',
|
||||||
|
'over', 'overEvery', 'overSome', 'rest', 'reverse', 'round', 'runInContext',
|
||||||
|
'spread', 'template', 'trim', 'trimEnd', 'trimStart', 'uniqueId', 'words'
|
||||||
|
],
|
||||||
|
'2': [
|
||||||
|
'add', 'after', 'ary', 'assign', 'assignIn', 'at', 'before', 'bind', 'bindKey',
|
||||||
|
'chunk', 'cloneDeepWith', 'cloneWith', 'concat', 'countBy', 'curryN',
|
||||||
|
'curryRightN', 'debounce', 'defaults', 'defaultsDeep', 'delay', 'difference',
|
||||||
|
'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith', 'eq', 'every',
|
||||||
|
'filter', 'find', 'find', 'findIndex', 'findKey', 'findLast', 'findLastIndex',
|
||||||
|
'findLastKey', 'flatMap', 'flattenDepth', 'forEach', 'forEachRight', 'forIn',
|
||||||
|
'forInRight', 'forOwn', 'forOwnRight', 'get', 'groupBy', 'gt', 'gte', 'has',
|
||||||
|
'hasIn', 'includes', 'indexOf', 'intersection', 'invertBy', 'invoke', 'invokeMap',
|
||||||
|
'isEqual', 'isMatch', 'join', 'keyBy', 'lastIndexOf', 'lt', 'lte', 'map',
|
||||||
|
'mapKeys', 'mapValues', 'matchesProperty', 'maxBy', 'merge', 'minBy', 'omit',
|
||||||
|
'omitBy', 'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt',
|
||||||
|
'partial', 'partialRight', 'partition', 'pick', 'pickBy', 'pull', 'pullAll',
|
||||||
|
'pullAt', 'random', 'range', 'rangeRight', 'rearg', 'reject', 'remove',
|
||||||
|
'repeat', 'result', 'sampleSize', 'some', 'sortBy', 'sortedIndex',
|
||||||
|
'sortedIndexOf', 'sortedLastIndex', 'sortedLastIndexOf', 'sortedUniqBy',
|
||||||
|
'split', 'startsWith', 'subtract', 'sumBy', 'take', 'takeRight', 'takeRightWhile',
|
||||||
|
'takeWhile', 'tap', 'throttle', 'thru', 'times', 'trimChars', 'trimCharsEnd',
|
||||||
|
'trimCharsStart', 'truncate', 'union', 'uniqBy', 'uniqWith', 'unset',
|
||||||
|
'unzipWith', 'without', 'wrap', 'xor', 'zip', 'zipObject', 'zipObjectDeep'
|
||||||
|
],
|
||||||
|
'3': [
|
||||||
|
'assignInWith', 'assignWith', 'clamp', 'differenceBy', 'differenceWith',
|
||||||
|
'getOr', 'inRange', 'intersectionBy', 'intersectionWith', 'isEqualWith',
|
||||||
|
'isMatchWith', 'mergeWith', 'orderBy', 'pullAllBy', 'reduce', 'reduceRight',
|
||||||
|
'replace', 'set', 'slice', 'sortedIndexBy', 'sortedLastIndexBy', 'transform',
|
||||||
|
'unionBy', 'unionWith', 'xorBy', 'xorWith', 'zipWith'
|
||||||
|
],
|
||||||
|
'4': [
|
||||||
|
'fill', 'setWith'
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map ary to rearg configs. */
|
||||||
|
exports.aryRearg = {
|
||||||
|
'2': [1, 0],
|
||||||
|
'3': [2, 0, 1],
|
||||||
|
'4': [3, 2, 0, 1]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to their iteratee ary. */
|
||||||
|
exports.iterateeAry = {
|
||||||
|
'assignWith': 2,
|
||||||
|
'assignInWith': 2,
|
||||||
|
'cloneDeepWith': 1,
|
||||||
|
'cloneWith': 1,
|
||||||
|
'dropRightWhile': 1,
|
||||||
|
'dropWhile': 1,
|
||||||
|
'every': 1,
|
||||||
|
'filter': 1,
|
||||||
|
'find': 1,
|
||||||
|
'findIndex': 1,
|
||||||
|
'findKey': 1,
|
||||||
|
'findLast': 1,
|
||||||
|
'findLastIndex': 1,
|
||||||
|
'findLastKey': 1,
|
||||||
|
'flatMap': 1,
|
||||||
|
'forEach': 1,
|
||||||
|
'forEachRight': 1,
|
||||||
|
'forIn': 1,
|
||||||
|
'forInRight': 1,
|
||||||
|
'forOwn': 1,
|
||||||
|
'forOwnRight': 1,
|
||||||
|
'isEqualWith': 2,
|
||||||
|
'isMatchWith': 2,
|
||||||
|
'map': 1,
|
||||||
|
'mapKeys': 1,
|
||||||
|
'mapValues': 1,
|
||||||
|
'partition': 1,
|
||||||
|
'reduce': 2,
|
||||||
|
'reduceRight': 2,
|
||||||
|
'reject': 1,
|
||||||
|
'remove': 1,
|
||||||
|
'some': 1,
|
||||||
|
'takeRightWhile': 1,
|
||||||
|
'takeWhile': 1,
|
||||||
|
'times': 1,
|
||||||
|
'transform': 2
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to iteratee rearg configs. */
|
||||||
|
exports.iterateeRearg = {
|
||||||
|
'mapKeys': [1]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to rearg configs. */
|
||||||
|
exports.methodRearg = {
|
||||||
|
'assignInWith': [1, 2, 0],
|
||||||
|
'assignWith': [1, 2, 0],
|
||||||
|
'getOr': [2, 1, 0],
|
||||||
|
'isMatchWith': [2, 1, 0],
|
||||||
|
'mergeWith': [1, 2, 0],
|
||||||
|
'pullAllBy': [2, 1, 0],
|
||||||
|
'setWith': [3, 1, 2, 0],
|
||||||
|
'sortedIndexBy': [2, 1, 0],
|
||||||
|
'sortedLastIndexBy': [2, 1, 0],
|
||||||
|
'zipWith': [1, 2, 0]
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map method names to spread configs. */
|
||||||
|
exports.methodSpread = {
|
||||||
|
'partial': 1,
|
||||||
|
'partialRight': 1
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to identify methods which mutate arrays or objects. */
|
||||||
|
exports.mutate = {
|
||||||
|
'array': {
|
||||||
|
'fill': true,
|
||||||
|
'pull': true,
|
||||||
|
'pullAll': true,
|
||||||
|
'pullAllBy': true,
|
||||||
|
'pullAt': true,
|
||||||
|
'remove': true,
|
||||||
|
'reverse': true
|
||||||
|
},
|
||||||
|
'object': {
|
||||||
|
'assign': true,
|
||||||
|
'assignIn': true,
|
||||||
|
'assignInWith': true,
|
||||||
|
'assignWith': true,
|
||||||
|
'defaults': true,
|
||||||
|
'defaultsDeep': true,
|
||||||
|
'merge': true,
|
||||||
|
'mergeWith': true
|
||||||
|
},
|
||||||
|
'set': {
|
||||||
|
'set': true,
|
||||||
|
'setWith': true,
|
||||||
|
'unset': true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to track methods with placeholder support */
|
||||||
|
exports.placeholder = {
|
||||||
|
'bind': true,
|
||||||
|
'bindKey': true,
|
||||||
|
'curry': true,
|
||||||
|
'curryRight': true,
|
||||||
|
'partial': true,
|
||||||
|
'partialRight': true
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to map real names to their aliases. */
|
||||||
|
exports.realToAlias = (function() {
|
||||||
|
var hasOwnProperty = Object.prototype.hasOwnProperty,
|
||||||
|
object = exports.aliasToReal,
|
||||||
|
result = {};
|
||||||
|
|
||||||
|
for (var key in object) {
|
||||||
|
var value = object[key];
|
||||||
|
if (hasOwnProperty.call(result, value)) {
|
||||||
|
result[value].push(key);
|
||||||
|
} else {
|
||||||
|
result[value] = [key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}());
|
||||||
|
|
||||||
|
/** Used to map method names to other names. */
|
||||||
|
exports.remap = {
|
||||||
|
'curryN': 'curry',
|
||||||
|
'curryRightN': 'curryRight',
|
||||||
|
'getOr': 'get',
|
||||||
|
'trimChars': 'trim',
|
||||||
|
'trimCharsEnd': 'trimEnd',
|
||||||
|
'trimCharsStart': 'trimStart'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Used to track methods that skip `_.rearg`. */
|
||||||
|
exports.skipRearg = {
|
||||||
|
'add': true,
|
||||||
|
'assign': true,
|
||||||
|
'assignIn': true,
|
||||||
|
'concat': true,
|
||||||
|
'difference': true,
|
||||||
|
'gt': true,
|
||||||
|
'gte': true,
|
||||||
|
'lt': true,
|
||||||
|
'lte': true,
|
||||||
|
'matchesProperty': true,
|
||||||
|
'merge': true,
|
||||||
|
'partial': true,
|
||||||
|
'partialRight': true,
|
||||||
|
'random': true,
|
||||||
|
'range': true,
|
||||||
|
'rangeRight': true,
|
||||||
|
'subtract': true,
|
||||||
|
'zip': true,
|
||||||
|
'zipObject': true
|
||||||
|
};
|
||||||
26
lib/common/minify.js
Normal file
26
lib/common/minify.js
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _ = require('lodash'),
|
||||||
|
fs = require('fs-extra'),
|
||||||
|
uglify = require('uglify-js');
|
||||||
|
|
||||||
|
var uglifyOptions = require('./uglify.options');
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
function minify(srcPath, destPath, callback, options) {
|
||||||
|
if (_.isFunction(destPath)) {
|
||||||
|
if (_.isObject(callback)) {
|
||||||
|
options = callback;
|
||||||
|
}
|
||||||
|
callback = destPath;
|
||||||
|
destPath = undefined;
|
||||||
|
}
|
||||||
|
if (!destPath) {
|
||||||
|
destPath = srcPath.replace(/(?=\.js$)/, '.min');
|
||||||
|
}
|
||||||
|
var output = uglify.minify(srcPath, _.defaults(options || {}, uglifyOptions));
|
||||||
|
fs.writeFile(destPath, output.code, 'utf-8', callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = minify;
|
||||||
16
lib/common/uglify.options.js
Normal file
16
lib/common/uglify.options.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
module.exports = {
|
||||||
|
'compress': {
|
||||||
|
'pure_getters': true,
|
||||||
|
'unsafe': true,
|
||||||
|
'unsafe_comps': true,
|
||||||
|
'warnings': false
|
||||||
|
},
|
||||||
|
'mangle': {
|
||||||
|
'except': ['define']
|
||||||
|
},
|
||||||
|
'output': {
|
||||||
|
'ascii_only': true,
|
||||||
|
'comments': /^!|@cc_on|@license|@preserve/i,
|
||||||
|
'max_line_len': 500
|
||||||
|
}
|
||||||
|
};
|
||||||
36
lib/common/util.js
Normal file
36
lib/common/util.js
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _ = require('lodash'),
|
||||||
|
fs = require('fs-extra'),
|
||||||
|
glob = require('glob'),
|
||||||
|
path = require('path');
|
||||||
|
|
||||||
|
var minify = require('../common/minify.js');
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
function copyFile(srcPath, destPath) {
|
||||||
|
return _.partial(fs.copy, srcPath, destPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
function globTemplate(pattern) {
|
||||||
|
return _.transform(glob.sync(pattern), function(result, filePath) {
|
||||||
|
var key = path.basename(filePath, path.extname(filePath));
|
||||||
|
result[key] = _.template(fs.readFileSync(filePath, 'utf8'));
|
||||||
|
}, {});
|
||||||
|
}
|
||||||
|
|
||||||
|
function minFile(srcPath, destPath) {
|
||||||
|
return _.partial(minify, srcPath, destPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeFile(filePath, data) {
|
||||||
|
return _.partial(fs.writeFile, filePath, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
'copyFile': copyFile,
|
||||||
|
'globTemplate': globTemplate,
|
||||||
|
'minFile': minFile,
|
||||||
|
'writeFile': writeFile
|
||||||
|
};
|
||||||
55
lib/fp/build-dist.js
Normal file
55
lib/fp/build-dist.js
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _ = require('lodash'),
|
||||||
|
async = require('async'),
|
||||||
|
path = require('path'),
|
||||||
|
webpack = require('webpack');
|
||||||
|
|
||||||
|
var util = require('../common/util');
|
||||||
|
|
||||||
|
var basePath = path.join(__dirname, '..', '..'),
|
||||||
|
distPath = path.join(basePath, 'dist'),
|
||||||
|
fpPath = path.join(basePath, 'fp'),
|
||||||
|
filename = 'lodash.fp.js';
|
||||||
|
|
||||||
|
var fpConfig = {
|
||||||
|
'entry': path.join(fpPath, '_convertBrowser.js'),
|
||||||
|
'output': {
|
||||||
|
'path': distPath,
|
||||||
|
'filename': filename,
|
||||||
|
'library': 'fp',
|
||||||
|
'libraryTarget': 'umd'
|
||||||
|
},
|
||||||
|
'plugins': [
|
||||||
|
new webpack.optimize.OccurenceOrderPlugin,
|
||||||
|
new webpack.optimize.DedupePlugin
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
var mappingConfig = {
|
||||||
|
'entry': path.join(fpPath, '_mapping.js'),
|
||||||
|
'output': {
|
||||||
|
'path': distPath,
|
||||||
|
'filename': 'mapping.fp.js',
|
||||||
|
'library': 'mapping',
|
||||||
|
'libraryTarget': 'umd'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
function onComplete(error) {
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function build() {
|
||||||
|
async.series([
|
||||||
|
_.partial(webpack, mappingConfig),
|
||||||
|
_.partial(webpack, fpConfig),
|
||||||
|
util.minFile(path.join(distPath, filename))
|
||||||
|
], onComplete);
|
||||||
|
}
|
||||||
|
|
||||||
|
build();
|
||||||
62
lib/fp/build-doc.js
Normal file
62
lib/fp/build-doc.js
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _ = require('lodash'),
|
||||||
|
fs = require('fs-extra'),
|
||||||
|
path = require('path'),
|
||||||
|
util = require('../common/util');
|
||||||
|
|
||||||
|
var mapping = require('../../fp/_mapping'),
|
||||||
|
templatePath = path.join(__dirname, 'template/doc'),
|
||||||
|
template = util.globTemplate(path.join(templatePath, '*.jst'));
|
||||||
|
|
||||||
|
var argNames = ['a', 'b', 'c', 'd'];
|
||||||
|
|
||||||
|
var templateData = {
|
||||||
|
'mapping': mapping,
|
||||||
|
'toArgOrder': toArgOrder,
|
||||||
|
'toFuncList': toFuncList
|
||||||
|
};
|
||||||
|
|
||||||
|
function toArgOrder(array) {
|
||||||
|
return '`(' + _.map(array, function(value) {
|
||||||
|
return argNames[value];
|
||||||
|
}).join(', ') + ')`';
|
||||||
|
}
|
||||||
|
|
||||||
|
function toFuncList(array) {
|
||||||
|
var chunks = _.chunk(array.slice().sort(), 5),
|
||||||
|
lastChunk = _.last(chunks),
|
||||||
|
last = lastChunk ? lastChunk.pop() : undefined;
|
||||||
|
|
||||||
|
chunks = _.reject(chunks, _.isEmpty);
|
||||||
|
lastChunk = _.last(chunks);
|
||||||
|
|
||||||
|
var result = '`' + _.map(chunks, function(chunk) {
|
||||||
|
return chunk.join('`, `') + '`';
|
||||||
|
}).join(',\n`');
|
||||||
|
|
||||||
|
if (last == null) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
if (_.size(chunks) > 1 || _.size(lastChunk) > 1) {
|
||||||
|
result += ',';
|
||||||
|
}
|
||||||
|
result += ' &';
|
||||||
|
result += _.size(lastChunk) < 5 ? ' ' : '\n';
|
||||||
|
return result + '`' + last + '`';
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
function onComplete(error) {
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function build(target) {
|
||||||
|
target = path.resolve(target);
|
||||||
|
fs.writeFile(target, template.wiki(templateData), onComplete);
|
||||||
|
}
|
||||||
|
|
||||||
|
build(_.last(process.argv));
|
||||||
118
lib/fp/build-modules.js
Normal file
118
lib/fp/build-modules.js
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _ = require('lodash'),
|
||||||
|
async = require('async'),
|
||||||
|
glob = require('glob'),
|
||||||
|
path = require('path');
|
||||||
|
|
||||||
|
var util = require('../common/util');
|
||||||
|
|
||||||
|
var mapping = require('../../fp/_mapping'),
|
||||||
|
templatePath = path.join(__dirname, 'template/modules'),
|
||||||
|
template = util.globTemplate(path.join(templatePath, '*.jst'));
|
||||||
|
|
||||||
|
var aryMethods = _.union(
|
||||||
|
mapping.aryMethod[1],
|
||||||
|
mapping.aryMethod[2],
|
||||||
|
mapping.aryMethod[3],
|
||||||
|
mapping.aryMethod[4]
|
||||||
|
);
|
||||||
|
|
||||||
|
var categories = [
|
||||||
|
'array',
|
||||||
|
'collection',
|
||||||
|
'date',
|
||||||
|
'function',
|
||||||
|
'lang',
|
||||||
|
'math',
|
||||||
|
'number',
|
||||||
|
'object',
|
||||||
|
'seq',
|
||||||
|
'string',
|
||||||
|
'util'
|
||||||
|
];
|
||||||
|
|
||||||
|
var ignored = [
|
||||||
|
'_*.js',
|
||||||
|
'core.js',
|
||||||
|
'fp.js',
|
||||||
|
'index.js',
|
||||||
|
'lodash.js'
|
||||||
|
];
|
||||||
|
|
||||||
|
function isAlias(funcName) {
|
||||||
|
return _.has(mapping.aliasToReal, funcName);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isCategory(funcName) {
|
||||||
|
return _.includes(categories, funcName);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isThru(funcName) {
|
||||||
|
return !_.includes(aryMethods, funcName);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTemplate(moduleName) {
|
||||||
|
var data = {
|
||||||
|
'name': _.result(mapping.aliasToReal, moduleName, moduleName),
|
||||||
|
'mapping': mapping
|
||||||
|
};
|
||||||
|
|
||||||
|
if (isAlias(moduleName)) {
|
||||||
|
return template.alias(data);
|
||||||
|
}
|
||||||
|
if (isCategory(moduleName)) {
|
||||||
|
return template.category(data);
|
||||||
|
}
|
||||||
|
if (isThru(moduleName)) {
|
||||||
|
return template.thru(data);
|
||||||
|
}
|
||||||
|
return template.module(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
function onComplete(error) {
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function build(target) {
|
||||||
|
target = path.resolve(target);
|
||||||
|
|
||||||
|
var fpPath = path.join(target, 'fp');
|
||||||
|
|
||||||
|
// Glob existing lodash module paths.
|
||||||
|
var modulePaths = glob.sync(path.join(target, '*.js'), {
|
||||||
|
'nodir': true,
|
||||||
|
'ignore': ignored.map(function(filename) {
|
||||||
|
return path.join(target, filename);
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add FP alias and remapped module paths.
|
||||||
|
_.each([mapping.aliasToReal, mapping.remap], function(data) {
|
||||||
|
_.forOwn(data, function(realName, alias) {
|
||||||
|
var modulePath = path.join(target, alias + '.js');
|
||||||
|
if (!_.startsWith(alias, '_') &&
|
||||||
|
!_.includes(modulePaths, modulePath)) {
|
||||||
|
modulePaths.push(modulePath);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
var actions = modulePaths.map(function(modulePath) {
|
||||||
|
var moduleName = path.basename(modulePath, '.js');
|
||||||
|
return util.writeFile(path.join(fpPath, moduleName + '.js'), getTemplate(moduleName));
|
||||||
|
});
|
||||||
|
|
||||||
|
actions.unshift(util.copyFile(path.join(__dirname, '../../fp'), fpPath));
|
||||||
|
actions.push(util.writeFile(path.join(target, 'fp.js'), template.fp()));
|
||||||
|
actions.push(util.writeFile(path.join(fpPath, 'convert.js'), template.convert()));
|
||||||
|
actions.push(util.writeFile(path.join(fpPath, '_util.js'), template._util()));
|
||||||
|
|
||||||
|
async.series(actions, onComplete);
|
||||||
|
}
|
||||||
|
|
||||||
|
build(_.last(process.argv));
|
||||||
135
lib/fp/template/doc/wiki.jst
Normal file
135
lib/fp/template/doc/wiki.jst
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
## lodash/fp
|
||||||
|
|
||||||
|
The `lodash/fp` module is an instance of `lodash` with its methods wrapped to
|
||||||
|
produce immutable auto-curried iteratee-first data-last methods.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
In a browser:
|
||||||
|
```html
|
||||||
|
<script src='path/to/lodash.js'></script>
|
||||||
|
<script src='path/to/lodash.fp.js'></script>
|
||||||
|
```
|
||||||
|
|
||||||
|
In Node.js:
|
||||||
|
```js
|
||||||
|
// Load the fp build.
|
||||||
|
var _ = require('lodash/fp');
|
||||||
|
|
||||||
|
// Load a method category.
|
||||||
|
var object = require('lodash/fp/object');
|
||||||
|
|
||||||
|
// Load a single method for smaller builds with browserify/rollup/webpack.
|
||||||
|
var extend = require('lodash/fp/extend');
|
||||||
|
```
|
||||||
|
|
||||||
|
## Convert
|
||||||
|
|
||||||
|
Although `lodash/fp` & its method modules come pre-converted there are times when
|
||||||
|
you may want to convert another lodash package or create a customized conversion.
|
||||||
|
That’s when the `convert` module comes in handy.
|
||||||
|
|
||||||
|
```js
|
||||||
|
var convert = require('lodash/fp/convert');
|
||||||
|
|
||||||
|
// Convert by name.
|
||||||
|
var assign = convert('assign', require('lodash.assign'));
|
||||||
|
|
||||||
|
// Convert by object.
|
||||||
|
var fp = convert({
|
||||||
|
'assign': require('lodash.assign'),
|
||||||
|
'chunk': require('lodash.chunk')
|
||||||
|
});
|
||||||
|
|
||||||
|
// Convert by `lodash` instance.
|
||||||
|
var fp = convert(lodash.runInContext());
|
||||||
|
```
|
||||||
|
|
||||||
|
It’s even customizable.
|
||||||
|
```js
|
||||||
|
// Every option is `true` by default.
|
||||||
|
var filter = convert('filter', _.filter, {
|
||||||
|
// Specify capping iteratee arguments.
|
||||||
|
'cap': true,
|
||||||
|
// Specify currying.
|
||||||
|
'curry': true,
|
||||||
|
// Specify fixed arity.
|
||||||
|
'fixed': true,
|
||||||
|
// Specify immutable operations.
|
||||||
|
'immutable': true,
|
||||||
|
// Specify rearranging arguments.
|
||||||
|
'rearg': true
|
||||||
|
});
|
||||||
|
|
||||||
|
// Specify `cap` of `false` to create a function that doesn’t cap iteratee arguments.
|
||||||
|
var filter = convert('filter', _.filter, { 'cap': false });
|
||||||
|
|
||||||
|
filter(function(value, index) {
|
||||||
|
return index % 2 == 0;
|
||||||
|
})(['a', 'b', 'c']);
|
||||||
|
// => ['a', 'c']
|
||||||
|
```
|
||||||
|
|
||||||
|
## Mapping
|
||||||
|
|
||||||
|
Immutable auto-curried iteratee-first data-last methods sound great, but what’s
|
||||||
|
that really mean for each method? Below is a breakdown of the mapping used to
|
||||||
|
convert each method.
|
||||||
|
|
||||||
|
#### Capped Iteratee Arguments
|
||||||
|
|
||||||
|
Methods that cap iteratees to one argument:<br>
|
||||||
|
<%= toFuncList(_.keys(_.pickBy(mapping.iterateeAry, _.partial(_.eq, _, 1)))) %>
|
||||||
|
|
||||||
|
Methods that cap iteratees to two arguments:<br>
|
||||||
|
<%= toFuncList(_.keys(_.pickBy(mapping.iterateeAry, _.partial(_.eq, _, 2)))) %>
|
||||||
|
|
||||||
|
The iteratee of `mapKeys` is invoked with one argument: (key)
|
||||||
|
|
||||||
|
#### Fixed Arity
|
||||||
|
|
||||||
|
Methods with a fixed arity of one:<br>
|
||||||
|
<%= toFuncList(mapping.aryMethod[1]) %>
|
||||||
|
|
||||||
|
Methods with a fixed arity of two:<br>
|
||||||
|
<%= toFuncList(mapping.aryMethod[2]) %>
|
||||||
|
|
||||||
|
Methods with a fixed arity of three:<br>
|
||||||
|
<%= toFuncList(mapping.aryMethod[3]) %>
|
||||||
|
|
||||||
|
Methods with a fixed arity of four:<br>
|
||||||
|
<%= toFuncList(mapping.aryMethod[4]) %>
|
||||||
|
|
||||||
|
#### Rearranged Arguments
|
||||||
|
|
||||||
|
Methods with a fixed arity of two have an argument order of:<br>
|
||||||
|
<%= toArgOrder(mapping.aryRearg[2]) %>
|
||||||
|
|
||||||
|
Methods with a fixed arity of three have an argument order of:<br>
|
||||||
|
<%= toArgOrder(mapping.aryRearg[3]) %>
|
||||||
|
|
||||||
|
Methods with a fixed arity of four have an argument order of:<br>
|
||||||
|
<%= toArgOrder(mapping.aryRearg[4]) %>
|
||||||
|
|
||||||
|
Methods with custom argument orders:<br>
|
||||||
|
<%= _.map(mapping.methodRearg, function(orders, methodName) {
|
||||||
|
return ' * `_.' + methodName + '` has an order of ' + toArgOrder(orders);
|
||||||
|
}).join('\n') %>
|
||||||
|
|
||||||
|
Methods with unchanged argument orders:<br>
|
||||||
|
<%= toFuncList(_.keys(mapping.skipRearg)) %>
|
||||||
|
|
||||||
|
The methods `partial` & `partialRight` accept an array of arguments to partially
|
||||||
|
apply as their second parameter.
|
||||||
|
|
||||||
|
#### New Methods
|
||||||
|
|
||||||
|
Methods created to accommodate Lodash’s variadic methods:<br>
|
||||||
|
<%= toFuncList(_.keys(mapping.remap)) %>
|
||||||
|
|
||||||
|
#### Aliases
|
||||||
|
|
||||||
|
There are <%= _.size(mapping.aliasToReal) %> method aliases:<br>
|
||||||
|
<%= _.map(mapping.aliasToReal, function(realName, alias) {
|
||||||
|
return ' * Added `_.' + alias + '` as an alias of `_.' + realName + '`';
|
||||||
|
}).join('\n') %>
|
||||||
13
lib/fp/template/modules/_util.jst
Normal file
13
lib/fp/template/modules/_util.jst
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
module.exports = {
|
||||||
|
'ary': require('../ary'),
|
||||||
|
'clone': require('../clone'),
|
||||||
|
'curry': require('../curry'),
|
||||||
|
'forEach': require('../_arrayEach'),
|
||||||
|
'isArray': require('../isArray'),
|
||||||
|
'isFunction': require('../isFunction'),
|
||||||
|
'iteratee': require('../iteratee'),
|
||||||
|
'keys': require('../_baseKeys'),
|
||||||
|
'rearg': require('../rearg'),
|
||||||
|
'spread': require('../spread'),
|
||||||
|
'toPath': require('../toPath')
|
||||||
|
};
|
||||||
1
lib/fp/template/modules/alias.jst
Normal file
1
lib/fp/template/modules/alias.jst
Normal file
@@ -0,0 +1 @@
|
|||||||
|
module.exports = require('./<%= name %>');
|
||||||
2
lib/fp/template/modules/category.jst
Normal file
2
lib/fp/template/modules/category.jst
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
var convert = require('./convert');
|
||||||
|
module.exports = convert(require('../<%= name %>'));
|
||||||
17
lib/fp/template/modules/convert.jst
Normal file
17
lib/fp/template/modules/convert.jst
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
var baseConvert = require('./_baseConvert'),
|
||||||
|
util = require('./_util');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts `func` of `name` to an immutable auto-curried iteratee-first data-last
|
||||||
|
* version. If `name` is an object its methods will be converted.
|
||||||
|
*
|
||||||
|
* @param {string} name The name of the function to wrap.
|
||||||
|
* @param {Function} [func] The function to wrap.
|
||||||
|
* @param {Object} [options] The options object. See `baseConvert` for more details.
|
||||||
|
* @returns {Function|Object} Returns the converted function or object.
|
||||||
|
*/
|
||||||
|
function convert(name, func, options) {
|
||||||
|
return baseConvert(util, name, func, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = convert;
|
||||||
2
lib/fp/template/modules/fp.jst
Normal file
2
lib/fp/template/modules/fp.jst
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
var _ = require('./lodash.min').runInContext();
|
||||||
|
module.exports = require('./fp/_baseConvert')(_, _);
|
||||||
2
lib/fp/template/modules/module.jst
Normal file
2
lib/fp/template/modules/module.jst
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
var convert = require('./convert');
|
||||||
|
module.exports = convert('<%= name %>', require('../<%= _.result(mapping.remap, name, name) %>'));
|
||||||
1
lib/fp/template/modules/thru.jst
Normal file
1
lib/fp/template/modules/thru.jst
Normal file
@@ -0,0 +1 @@
|
|||||||
|
module.exports = require('../<%= name %>');
|
||||||
31
lib/main/build-dist.js
Normal file
31
lib/main/build-dist.js
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _ = require('lodash'),
|
||||||
|
async = require('async'),
|
||||||
|
path = require('path');
|
||||||
|
|
||||||
|
var util = require('../common/util');
|
||||||
|
|
||||||
|
var basePath = path.join(__dirname, '..', '..'),
|
||||||
|
distPath = path.join(basePath, 'dist'),
|
||||||
|
filename = 'lodash.js';
|
||||||
|
|
||||||
|
var baseLodash = path.join(basePath, filename),
|
||||||
|
distLodash = path.join(distPath, filename);
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
function onComplete(error) {
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function build() {
|
||||||
|
async.series([
|
||||||
|
util.copyFile(baseLodash, distLodash),
|
||||||
|
util.minFile(distLodash)
|
||||||
|
], onComplete);
|
||||||
|
}
|
||||||
|
|
||||||
|
build();
|
||||||
55
lib/main/build-doc.js
Normal file
55
lib/main/build-doc.js
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _ = require('lodash'),
|
||||||
|
docdown = require('docdown'),
|
||||||
|
fs = require('fs-extra'),
|
||||||
|
path = require('path');
|
||||||
|
|
||||||
|
var basePath = path.join(__dirname, '..', '..'),
|
||||||
|
docPath = path.join(basePath, 'doc'),
|
||||||
|
readmePath = path.join(docPath, 'README.md');
|
||||||
|
|
||||||
|
var pkg = require('../../package.json'),
|
||||||
|
version = pkg.version;
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
'base': {
|
||||||
|
'entryLinks': [
|
||||||
|
'<% if (name == "templateSettings" || !/^(?:methods|properties|seq)$/i.test(category)) {' +
|
||||||
|
'print("[Ⓝ](https://www.npmjs.com/package/lodash." + name.toLowerCase() + " \\"See the npm package\\")")' +
|
||||||
|
'} %>'
|
||||||
|
],
|
||||||
|
'path': path.join(basePath, 'lodash.js'),
|
||||||
|
'title': '<a href="https://lodash.com/">lodash</a> <span>v' + version + '</span>',
|
||||||
|
'toc': 'categories',
|
||||||
|
'url': 'https://github.com/lodash/lodash/blob/' + version + '/lodash.js'
|
||||||
|
},
|
||||||
|
'github': {
|
||||||
|
'hash': 'github'
|
||||||
|
},
|
||||||
|
'site': {
|
||||||
|
'tocLink': '#docs'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function postprocess(string) {
|
||||||
|
// Fix docdown bug by wrapping symbol property identifiers in brackets.
|
||||||
|
return string.replace(/\.(Symbol\.(?:[a-z]+[A-Z]?)+)/g, '[$1]');
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
function onComplete(error) {
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function build(type) {
|
||||||
|
var options = _.defaults({}, config.base, config[type]),
|
||||||
|
markdown = docdown(options);
|
||||||
|
|
||||||
|
fs.writeFile(readmePath, postprocess(markdown), onComplete);
|
||||||
|
}
|
||||||
|
|
||||||
|
build(_.last(process.argv));
|
||||||
34
lib/main/build-modules.js
Normal file
34
lib/main/build-modules.js
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _ = require('lodash'),
|
||||||
|
async = require('async'),
|
||||||
|
path = require('path');
|
||||||
|
|
||||||
|
var util = require('../common/util');
|
||||||
|
|
||||||
|
var basePath = path.join(__dirname, '..', '..'),
|
||||||
|
distPath = path.join(basePath, 'dist');
|
||||||
|
|
||||||
|
var filePairs = [
|
||||||
|
[path.join(distPath, 'lodash.core.js'), 'core.js'],
|
||||||
|
[path.join(distPath, 'lodash.core.min.js'), 'core.min.js'],
|
||||||
|
[path.join(distPath, 'lodash.min.js'), 'lodash.min.js']
|
||||||
|
];
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
function onComplete(error) {
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function build(target) {
|
||||||
|
var actions = _.map(filePairs, function(pair) {
|
||||||
|
return util.copyFile(pair[0], path.join(target, pair[1]));
|
||||||
|
});
|
||||||
|
|
||||||
|
async.series(actions, onComplete);
|
||||||
|
}
|
||||||
|
|
||||||
|
build(_.last(process.argv));
|
||||||
41
lodash.min.js
vendored
41
lodash.min.js
vendored
@@ -1,41 +0,0 @@
|
|||||||
/*!
|
|
||||||
Lo-Dash 0.5.2 lodash.com/license
|
|
||||||
Underscore.js 1.3.3 github.com/documentcloud/underscore/blob/master/LICENSE
|
|
||||||
*/
|
|
||||||
;(function(e,t){"use strict";function s(e){return new o(e)}function o(e){if(e&&e._wrapped)return e;this._wrapped=e}function u(e,t,n){t||(t=0);var r=e.length,i=r-t>=(n||30),s=i?{}:e;if(i)for(var o=t-1;++o<r;)n=e[o]+"",(ot.call(s,n)?s[n]:s[n]=[]).push(e[o]);return function(e){if(i){var n=e+"";return ot.call(s,n)&&-1<C(s[n],e)}return-1<C(s,e,t)}}function a(){for(var e,t,n,s=-1,o=arguments.length,u={e:"",f:"",j:"",q:"",c:{d:""},m:{d:""}};++s<o;)for(t in e=arguments[s],e)n=(n=e[t])==r?"":n,/d|i/.test(t
|
|
||||||
)?("string"==typeof n&&(n={b:n,l:n}),u.c[t]=n.b,u.m[t]=n.l):u[t]=n;e=u.a,t=/^[^,]+/.exec(e)[0],u.g=t,u.h=Nt,u.k=Pt,u.n=kt,u.p=nt,u.r=u.r!==i,u.s=u.s!==i,"o"in u||(u.o=Ot),u.f||(u.f="if(!"+t+")return s");if("b"!=t||!u.c.i)u.c=r;t="",u.s&&(t+="'use strict';"),t+="var g,y,h="+u.g+",s",u.j&&(t+="="+u.j),t+=";"+u.f+";"+u.q+";",u.c&&(t+="var j=h.length;g=-1;",u.m&&(t+="if(j>-1&&j===j>>>0){"),u.o&&(t+="if(x.call(h)==v){h=h.split('')}"),t+=u.c.d+";while(++g<j){y=h[g];"+u.c.i+"}",u.m&&(t+="}"));if(u.m){u.
|
|
||||||
c?t+="else{":u.n&&(t+="var j=h.length;g=-1;if(j&&P(h)){while(++g<j){y=h[g+=''];"+u.m.i+"}}else{"),u.h||(t+="var t=typeof h=='function'&&p.call(h,'prototype');"),u.k&&u.r?(t+="var m=-1,n=Y[typeof h]?k(h):[],j=n.length;"+u.m.d+";while(++m<j){g=n[m];",u.h||(t+="if(!(t&&g=='prototype')){"),t+="y=h[g];"+u.m.i+"",u.h||(t+="}")):(t+=u.m.d+";for(g in h){",u.h?(u.r&&(t+="if(e.call(h,g)){"),t+="y=h[g];"+u.m.i+";",u.r&&(t+="}")):(t+="if(!(t&&g=='prototype')",u.r&&(t+="&&e.call(h,g)"),t+="){y=h[g];"+u.m.i+"}"
|
|
||||||
)),t+="}";if(u.h){t+="var d=h.constructor;";for(n=0;7>n;n++)t+="g='"+u.p[n]+"';if(","constructor"==u.p[n]&&(t+="!(d&&d.prototype===h)&&"),t+="e.call(h,g)){y=h[g];"+u.m.i+"}"}if(u.c||u.n)t+="}"}return t+=u.e+";return s",Function("D,E,F,I,c,K,e,f,N,P,R,T,U,i,X,Y,k,p,u,v,x","var G=function("+e+"){"+t+"};return G")(Ht,I,M,f,st,Zt,ot,_,C,b,Jt,w,p,d,wt,Ft,dt,at,ft,St,lt)}function f(e,n){var r=e.b,i=n.b,e=e.a,n=n.a;return e===t?1:n===t?-1:e<n?-1:e>n?1:r<i?-1:1}function l(e,t){return it[t]}function c(e){
|
|
||||||
return"\\"+It[e]}function h(e){return jt[e]}function p(e,t){var n=i;if(!e||"object"!=typeof e||!t&&b(e))return n;var r=e.constructor;return(!Mt||"function"==typeof e.toString||"string"!=typeof (e+""))&&(!w(r)||r instanceof r)?Ct?(Zt(e,function(t,r){return n=!ot.call(e,r),i}),n===i):(Zt(e,function(e,t){n=t}),n===i||ot.call(e,n)):n}function d(e,t){return function(n,r,i){return e.call(t,n,r,i)}}function v(){}function m(e,t){if(e&&V.test(t))return"<e%-"+t+"%>";var n=it.length;return it[n]="'+__e("+t+")+'"
|
|
||||||
,rt+n}function g(e,t,n,i){return i?(e=it.length,it[e]="';"+i+";__p+='",rt+e):t?m(r,t):y(r,n)}function y(e,t){if(e&&V.test(t))return"<e%="+t+"%>";var n=it.length;return it[n]="'+((__t=("+t+"))==null?'':__t)+'",rt+n}function b(e){return lt.call(e)==vt}function w(e){return"function"==typeof e}function E(e,t,s,o,u){if(e==r)return e;s&&(t=i),u||(u={d:r}),u.d==r&&(u.d=!(!q.clone&&!U.clone&&!z.clone));if(((s=Ft[typeof e])||u.d)&&e.clone&&w(e.clone))return u.d=r,e.clone(t);if(s){var a=lt.call(e);if(!Bt[a
|
|
||||||
]||Lt&&b(e))return e;var f=a==mt,s=f||(a==wt?p(e,n):s)}if(!s||!t)return s?f?ft.call(e):Yt({},e):e;s=e.constructor;switch(a){case gt:return new s(e==n);case yt:return new s(+e);case bt:case St:return new s(e);case Et:return s(e.source,Q.exec(e))}o||(o=[]);for(a=o.length;a--;)if(o[a].c==e)return o[a].d;var a=e.length,l=f?s(a):{};o.push({d:l,c:e});if(f)for(f=-1;++f<a;)l[f]=E(e[f],t,r,o,u);else en(e,function(e,n){l[n]=E(e,t,r,o,u)});return l}function S(e,t,s,o){if(e==r||t==r)return e===t;o||(o={value
|
|
||||||
:r}),o.value==r&&(o.value=!(!q.isEqual&&!U.isEqual&&!z.isEqual));if(Ft[typeof e]||Ft[typeof t]||o.value){e._chain&&(e=e._wrapped),t._chain&&(t=t._wrapped);if(e.isEqual&&w(e.isEqual))return o.value=r,e.isEqual(t);if(t.isEqual&&w(t.isEqual))return o.value=r,t.isEqual(e)}if(e===t)return 0!==e||1/e==1/t;var u=lt.call(e);if(u!=lt.call(t))return i;switch(u){case gt:case yt:return+e==+t;case bt:return e!=+e?t!=+t:0==e?1/e==1/t:e==+t;case Et:case St:return e==t+""}var a=Ht[u];if(Lt&&!a&&(a=b(e))&&!b(t)||!
|
|
||||||
a&&(u!=wt||Mt&&("function"!=typeof e.toString&&"string"==typeof (e+"")||"function"!=typeof t.toString&&"string"==typeof (t+""))))return i;s||(s=[]);for(u=s.length;u--;)if(s[u]==e)return n;var u=-1,f=n,l=0;s.push(e);if(a){l=e.length;if(f=l==t.length)for(;l--&&(f=S(e[l],t[l],s,o)););return f}a=e.constructor,f=t.constructor;if(a!=f&&(!w(a)||!(a instanceof a&&w(f)&&f instanceof f)))return i;for(var c in e)if(ot.call(e,c)&&(l++,!ot.call(t,c)||!S(e[c],t[c],s,o)))return i;for(c in t)if(ot.call(t,c)&&!(l--
|
|
||||||
))return i;if(Nt)for(;7>++u;)if(c=nt[u],ot.call(e,c)&&(!ot.call(t,c)||!S(e[c],t[c],s,o)))return i;return n}function x(e,t,n,r){if(!e)return n;var i=e.length,s=3>arguments.length;r&&(t=d(t,r));if(-1<i&&i===i>>>0){var o=Ot&<.call(e)==St?e.split(""):e;for(i&&s&&(n=o[--i]);i--;)n=t(n,o[i],i,e);return n}o=rn(e);for((i=o.length)&&s&&(n=e[o[--i]]);i--;)s=o[i],n=t(n,e[s],s,e);return n}function T(e,t,n){if(e)return t==r||n?e[0]:ft.call(e,0,t)}function N(e,t){var n=[];if(!e)return n;for(var r,i=-1,s=e.length
|
|
||||||
;++i<s;)r=e[i],Jt(r)?ut.apply(n,t?r:N(r)):n.push(r);return n}function C(e,t,n){if(!e)return-1;var r=-1,i=e.length;if(n){if("number"!=typeof n)return r=A(e,t),e[r]===t?r:-1;r=(0>n?Math.max(0,i+n):n)-1}for(;++r<i;)if(e[r]===t)return r;return-1}function k(e,t,n){var r=-Infinity,i=r;if(!e)return i;var s=-1,o=e.length;if(!t){for(;++s<o;)e[s]>i&&(i=e[s]);return i}for(n&&(t=d(t,n));++s<o;)n=t(e[s],s,e),n>r&&(r=n,i=e[s]);return i}function L(e,t,n){return e?ft.call(e,t==r||n?1:t):[]}function A(e,t,n,r){if(!
|
|
||||||
e)return 0;var i=0,s=e.length;if(n){r&&(n=M(n,r));for(t=n(t);i<s;)r=i+s>>>1,n(e[r])<t?i=r+1:s=r}else for(;i<s;)r=i+s>>>1,e[r]<t?i=r+1:s=r;return i}function O(e,t,n,r){var s=[];if(!e)return s;var o=-1,u=e.length,a=[];"function"==typeof t&&(r=n,n=t,t=i);for(n?r&&(n=d(n,r)):n=_;++o<u;)if(r=n(e[o],o,e),t?!o||a[a.length-1]!==r:0>C(a,r))a.push(r),s.push(e[o]);return s}function M(e,t){function n(){var o=arguments,u=t;return i||(e=t[r]),s.length&&(o=o.length?s.concat(ft.call(o)):s),this instanceof n?(v.prototype=
|
|
||||||
e.prototype,u=new v,(o=e.apply(u,o))&&Ft[typeof o]?o:u):e.apply(u,o)}var r,i=w(e);if(i){if(Dt||ct&&2<arguments.length)return ct.call.apply(ct,arguments)}else r=t,t=e;var s=ft.call(arguments,2);return n}function _(e){return e}function D(e){hn(tn(e),function(t){var r=s[t]=e[t];o.prototype[t]=function(){var e=[this._wrapped];return arguments.length&&ut.apply(e,arguments),e=r.apply(s,e),this._chain&&(e=new o(e),e._chain=n),e}})}var n=!0,r=null,i=!1,P,H,B,j,F="object"==typeof exports&&exports&&("object"==typeof
|
|
||||||
global&&global&&global==global.global&&(e=global),exports),I=Array.prototype,q=Boolean.prototype,R=Object.prototype,U=Number.prototype,z=String.prototype,W=0,X=e._,V=/[-+=!~*%&^<>|{(\/]|\[\D|\b(?:delete|in|instanceof|new|typeof|void)\b/,$=/\b__p\+='';/g,J=/\b(__p\+=)''\+/g,K=/(__e\(.*?\)|\b__t\))\+'';/g,Q=/\w*$/,G=/(?:__e|__t=)\(\s*(?![\d\s"']|this\.)/g,Y=RegExp("^"+(R.valueOf+"").replace(/[.*+?^=!:${}()|[\]\/\\]/g,"\\$&").replace(/valueOf|for [^\]]+/g,".+?")+"$"),Z=/__token__(\d+)/g,et=/[&<"']/g
|
|
||||||
,tt=/['\n\r\t\u2028\u2029\\]/g,nt="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "),rt="__token__",it=[],st=I.concat,ot=R.hasOwnProperty,ut=I.push,at=R.propertyIsEnumerable,ft=I.slice,lt=R.toString,ct=Y.test(ct=ft.bind)&&ct,ht=Y.test(ht=Array.isArray)&&ht,pt=e.isFinite,dt=Y.test(dt=Object.keys)&&dt,vt="[object Arguments]",mt="[object Array]",gt="[object Boolean]",yt="[object Date]",bt="[object Number]",wt="[object Object]",Et="[object RegExp]"
|
|
||||||
,St="[object String]",xt=e.clearTimeout,Tt=e.setTimeout,Nt,Ct,kt=n;(function(){function e(){this.x=1}var t=[];e.prototype={valueOf:1,y:1};for(var n in new e)t.push(n);for(n in arguments)kt=!n;Nt=4>(t+"").length,Ct="x"!=t[0]})(1);var Lt=!b(arguments),At="x"!=ft.call("x")[0],Ot="xx"!="x"[0]+Object("x")[0];try{var Mt=("[object Object]",lt.call(e.document||0)==wt)}catch(_t){}var Dt=ct&&/\n|Opera/.test(ct+lt.call(e.opera)),Pt=dt&&/^.+$|true/.test(dt+!!e.attachEvent),Ht={"[object Arguments]":n,"[object Array]"
|
|
||||||
:n,"[object Boolean]":i,"[object Date]":i,"[object Function]":i,"[object Number]":i,"[object Object]":i,"[object RegExp]":i,"[object String]":n},Bt={"[object Arguments]":i,"[object Array]":n,"[object Boolean]":n,"[object Date]":n,"[object Function]":i,"[object Number]":n,"[object Object]":n,"[object RegExp]":n,"[object String]":n},jt={"&":"&","<":"<",'"':""","'":"'"},Ft={"boolean":i,"function":n,object:n,number:i,string:i,"undefined":i,unknown:n},It={"\\":"\\","'":"'","\n":"n","\r"
|
|
||||||
:"r"," ":"t","\u2028":"u2028","\u2029":"u2029"};s.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,variable:""};var qt={a:"b,a,w",j:"b",q:"if(!a)a=f;else if(w)a=i(a,w)",i:"if(a(y,g,b)===false)return s"},Rt={j:"{}",q:"var o;if(typeof a!='function'){var ii=a;a=function(y){return y[ii]}}else if(w)a=i(a,w)",i:"o=a(y,g,b);(e.call(s,o)?s[o]++:s[o]=1)"},Ut={j:"true",i:"if(!a(y,g,b))return!s"},zt={r:i,s:i,a:"l",j:"l",q:"for(var B=1,C=arguments.length;B<C;B++){if(h=arguments[B]){"
|
|
||||||
,i:"s[g]=y",e:"}}"},Wt={j:"[]",i:"a(y,g,b)&&s.push(y)"},Xt={q:"if(w)a=i(a,w)"},Vt={i:{l:qt.i}},$t={j:"",f:"if(!b)return[]",d:{b:"s=Array(j)",l:"s="+(Pt?"Array(j)":"[]")},i:{b:"s[g]=a(y,g,b)",l:"s"+(Pt?"[m]=":".push")+"(a(y,g,b))"}};Lt&&(b=function(e){return!!e&&!!ot.call(e,"callee")});var Jt=ht||function(e){return lt.call(e)==mt};w(/x/)&&(w=function(e){return"[object Function]"==lt.call(e)});var Kt=a({a:"l",j:"[]",i:"s.push(g)"}),Qt=a(zt,{i:"if(s[g]==null)"+zt.i}),Gt=a({r:i,a:"l",j:"{}",q:"var r=c.apply(E,arguments)"
|
|
||||||
,i:"if(N(r,g)<0)s[g]=y"}),Yt=a(zt),Zt=a(qt,Xt,Vt,{r:i}),en=a(qt,Xt,Vt),tn=a({r:i,a:"l",j:"[]",i:"if(T(y))s.push(g)",e:"s.sort()"}),nn=a({a:"y",j:"true",q:"var H=x.call(y),j=y.length;if(D[H]"+(Lt?"||P(y)":"")+"||(H==X&&j>-1&&j===j>>>0&&T(y.splice)))return!j",i:{l:"return false"}}),rn=dt?function(e){var t=typeof e;return"function"==t&&at.call(e,"prototype")?Kt(e):e&&Ft[t]?dt(e):[]}:Kt,sn=a(zt,{a:"l,ee,O,ff",q:"var J,L,Q,gg,dd=O==U;if(!dd)ff=[];for(var B=1,C=dd?2:arguments.length;B<C;B++){if(h=arguments[B]){"
|
|
||||||
,i:"if(y&&((Q=R(y))||U(y))){L=false;gg=ff.length;while(gg--)if(L=ff[gg].c==y)break;if(L){s[g]=ff[gg].d}else{J=(J=s[g])&&Q?(R(J)?J:[]):(U(J)?J:{});ff.push({d:J,c:y});s[g]=G(J,y,U,ff)}}else if(y!=null)s[g]=y"}),on=a({a:"l",j:"[]",i:"s.push(y)"}),un=a({a:"b,hh",j:"false",o:i,d:{b:"if(x.call(h)==v)return b.indexOf(hh)>-1"},i:"if(y===hh)return true"}),an=a(qt,Rt),fn=a(qt,Ut),ln=a(qt,Wt),cn=a(qt,Xt,{j:"",i:"if(a(y,g,b))return y"}),hn=a(qt,Xt),pn=a(qt,Rt,{i:"o=a(y,g,b);(e.call(s,o)?s[o]:s[o]=[]).push(y)"
|
|
||||||
}),dn=a($t,{a:"b,V",q:"var A=u.call(arguments,2),S=typeof V=='function'",i:{b:"s[g]=(S?V:y[V]).apply(y,A)",l:"s"+(Pt?"[m]=":".push")+"((S?V:y[V]).apply(y,A))"}}),vn=a(qt,$t),mn=a($t,{a:"b,bb",i:{b:"s[g]=y[bb]",l:"s"+(Pt?"[m]=":".push")+"(y[bb])"}}),gn=a({a:"b,a,z,w",j:"z",q:"var W=arguments.length<3;if(w)a=i(a,w)",d:{b:"if(W)s=b[++g]"},i:{b:"s=a(s,y,g,b)",l:"s=W?(W=false,y):a(s,y,g,b)"}}),yn=a(qt,Wt,{i:"!"+Wt.i}),bn=a(qt,Ut,{j:"false",i:Ut.i.replace("!","")}),wn=a(qt,Rt,$t,{i:{b:"s[g]={a:a(y,g,b),b:g,d:y}"
|
|
||||||
,l:"s"+(Pt?"[m]=":".push")+"({a:a(y,g,b),b:g,d:y})"},e:"s.sort(I);j=s.length;while(j--)s[j]=s[j].d"}),En=a(Wt,{a:"b,aa",q:"var Z,o,q,r=[];K(aa,function(y,o){r.push(o)});var cc=r.length",i:"for(Z=true,q=0;q<cc;q++){o=r[q];if(!(Z=y[o]===aa[o]))break}if(Z)s.push(y)"}),Sn=a({r:i,s:i,a:"l",j:"l",q:"var M=arguments,j=M.length;if(j>1){for(var g=1;g<j;g++)s[M[g]]=F(s[M[g]],s);return s}",i:"if(T(s[g]))s[g]=F(s[g],s)"});s.VERSION="0.5.2",s.after=function(e,t){return 1>e?t():function(){if(1>--e)return t.apply
|
|
||||||
(this,arguments)}},s.bind=M,s.bindAll=Sn,s.chain=function(e){return e=new o(e),e._chain=n,e},s.clone=E,s.compact=function(e){var t=[];if(!e)return t;for(var n=-1,r=e.length;++n<r;)e[n]&&t.push(e[n]);return t},s.compose=function(){var e=arguments;return function(){for(var t=arguments,n=e.length;n--;)t=[e[n].apply(this,t)];return t[0]}},s.contains=un,s.countBy=an,s.debounce=function(e,t,n){function i(){a=r,n||e.apply(u,s)}var s,o,u,a;return function(){var r=n&&!a;return s=arguments,u=this,xt(a),a=Tt
|
|
||||||
(i,t),r&&(o=e.apply(u,s)),o}},s.defaults=Qt,s.defer=function(e){var n=ft.call(arguments,1);return Tt(function(){return e.apply(t,n)},1)},s.delay=function(e,n){var r=ft.call(arguments,2);return Tt(function(){return e.apply(t,r)},n)},s.difference=function(e){var t=[];if(!e)return t;for(var n=-1,r=e.length,i=st.apply(t,arguments),i=u(i,r);++n<r;)i(e[n])||t.push(e[n]);return t},s.drop=Gt,s.escape=function(e){return e==r?"":(e+"").replace(et,h)},s.every=fn,s.extend=Yt,s.filter=ln,s.find=cn,s.first=T,s
|
|
||||||
.flatten=N,s.forEach=hn,s.forIn=Zt,s.forOwn=en,s.functions=tn,s.groupBy=pn,s.has=function(e,t){return e?ot.call(e,t):i},s.identity=_,s.indexOf=C,s.initial=function(e,t,n){return e?ft.call(e,0,-(t==r||n?1:t)):[]},s.intersection=function(e){var t=[];if(!e)return t;for(var n,r=-1,i=e.length,s=ft.call(arguments,1),o=[];++r<i;)n=e[r],0>C(t,n)&&fn(s,function(e,t){return(o[t]||(o[t]=u(e)))(n)})&&t.push(n);return t},s.invoke=dn,s.isArguments=b,s.isArray=Jt,s.isBoolean=function(e){return e===n||e===i||lt.
|
|
||||||
call(e)==gt},s.isElement=function(e){return e?1===e.nodeType:i},s.isEmpty=nn,s.isEqual=S,s.isFinite=function(e){return pt(e)&<.call(e)==bt},s.isFunction=w,s.isNaN=function(e){return lt.call(e)==bt&&e!=+e},s.isNull=function(e){return e===r},s.isObject=function(e){return e?Ft[typeof e]:i},s.isUndefined=function(e){return e===t},s.keys=rn,s.last=function(e,t,n){if(e){var i=e.length;return t==r||n?e[i-1]:ft.call(e,-t||i)}},s.lastIndexOf=function(e,t,n){if(!e)return-1;var r=e.length;for(n&&"number"==typeof
|
|
||||||
n&&(r=(0>n?Math.max(0,r+n):Math.min(n,r-1))+1);r--;)if(e[r]===t)return r;return-1},s.map=vn,s.max=k,s.memoize=function(e,t){var n={};return function(){var r=t?t.apply(this,arguments):arguments[0];return ot.call(n,r)?n[r]:n[r]=e.apply(this,arguments)}},s.merge=sn,s.min=function(e,t,n){var r=Infinity,i=r;if(!e)return i;var s=-1,o=e.length;if(!t){for(;++s<o;)e[s]<i&&(i=e[s]);return i}for(n&&(t=d(t,n));++s<o;)n=t(e[s],s,e),n<r&&(r=n,i=e[s]);return i},s.mixin=D,s.noConflict=function(){return e._=X,this
|
|
||||||
},s.once=function(e){var t,s=i;return function(){return s?t:(s=n,t=e.apply(this,arguments),e=r,t)}},s.partial=function(e){var t=ft.call(arguments,1),n=t.length;return function(){var r;return r=arguments,r.length&&(t.length=n,ut.apply(t,r)),r=1==t.length?e.call(this,t[0]):e.apply(this,t),t.length=n,r}},s.pick=function(e){var t={};if(!e)return t;for(var n,r=0,i=st.apply(I,arguments),s=i.length;++r<s;)n=i[r],n in e&&(t[n]=e[n]);return t},s.pluck=mn,s.range=function(e,t,n){e=+e||0,n=+n||1,t==r&&(t=e,
|
|
||||||
e=0);for(var i=-1,t=Math.max(0,Math.ceil((t-e)/n)),s=Array(t);++i<t;)s[i]=e,e+=n;return s},s.reduce=gn,s.reduceRight=x,s.reject=yn,s.rest=L,s.result=function(e,t){if(!e)return r;var n=e[t];return w(n)?e[t]():n},s.shuffle=function(e){if(!e)return[];for(var t,n=-1,r=e.length,i=Array(r);++n<r;)t=Math.floor(Math.random()*(n+1)),i[n]=i[t],i[t]=e[n];return i},s.size=function(e){if(!e)return 0;var t=lt.call(e),n=e.length;return Ht[t]||Lt&&b(e)||t==wt&&-1<n&&n===n>>>0&&w(e.splice)?n:rn(e).length},s.some=
|
|
||||||
bn,s.sortBy=wn,s.sortedIndex=A,s.tap=function(e,t){return t(e),e},s.template=function(e,t,n){n||(n={});var e=e+"",o,u;o=n.escape;var a=n.evaluate,f=n.interpolate,h=s.templateSettings,p=n=n.variable||h.variable;o==r&&(o=h.escape),a==r&&(a=h.evaluate||i),f==r&&(f=h.interpolate),o&&(e=e.replace(o,m)),f&&(e=e.replace(f,y)),a!=P&&(P=a,j=RegExp("<e%-([\\s\\S]+?)%>|<e%=([\\s\\S]+?)%>"+(a?"|"+a.source:""),"g")),o=it.length,e=e.replace(j,g),o=o!=it.length,e="__p += '"+e.replace(tt,c).replace(Z,l)+"';",it.
|
|
||||||
length=0,p||(n=H||"obj",o?e="with("+n+"){"+e+"}":(n!=H&&(H=n,B=RegExp("(\\(\\s*)"+n+"\\."+n+"\\b","g")),e=e.replace(G,"$&"+n+".").replace(B,"$1__d"))),e=(o?e.replace($,""):e).replace(J,"$1").replace(K,"$1;"),e="function("+n+"){"+(p?"":n+"||("+n+"={});")+"var __t,__p='',__e=_.escape"+(o?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":(p?"":",__d="+n+"."+n+"||"+n)+";")+e+"return __p}";try{u=Function("_","return "+e)(s)}catch(d){u=function(){throw d}}return t?u(t):(u.source=
|
|
||||||
e,u)},s.throttle=function(e,t){function n(){a=new Date,u=r,e.apply(o,i)}var i,s,o,u,a=0;return function(){var r=new Date,f=t-(r-a);return i=arguments,o=this,0>=f?(a=r,s=e.apply(o,i)):u||(u=Tt(n,f)),s}},s.times=function(e,t,n){var r=-1;if(n)for(;++r<e;)t.call(n,r);else for(;++r<e;)t(r)},s.toArray=function(e){if(!e)return[];if(e.toArray&&w(e.toArray))return e.toArray();var t=e.length;return-1<t&&t===t>>>0?(At?lt.call(e)==St:"string"==typeof e)?e.split(""):ft.call(e):on(e)},s.union=function(){for(var e=-1
|
|
||||||
,t=[],n=st.apply(t,arguments),r=n.length;++e<r;)0>C(t,n[e])&&t.push(n[e]);return t},s.uniq=O,s.uniqueId=function(e){var t=W++;return e?e+t:t},s.values=on,s.where=En,s.without=function(e){var t=[];if(!e)return t;for(var n=-1,r=e.length,i=u(arguments,1,20);++n<r;)i(e[n])||t.push(e[n]);return t},s.wrap=function(e,t){return function(){var n=[e];return arguments.length&&ut.apply(n,arguments),t.apply(this,n)}},s.zip=function(e){if(!e)return[];for(var t=-1,n=k(mn(arguments,"length")),r=Array(n);++t<n;)r
|
|
||||||
[t]=mn(arguments,t);return r},s.zipObject=function(e,t){if(!e)return{};var n=-1,r=e.length,i={};for(t||(t=[]);++n<r;)i[e[n]]=t[n];return i},s.all=fn,s.any=bn,s.collect=vn,s.detect=cn,s.each=hn,s.foldl=gn,s.foldr=x,s.head=T,s.include=un,s.inject=gn,s.methods=tn,s.select=ln,s.tail=L,s.take=T,s.unique=O,hn({Date:yt,Number:bt,RegExp:Et,String:St},function(e,t){s["is"+t]=function(t){return lt.call(t)==e}}),o.prototype=s.prototype,D(s),o.prototype.chain=function(){return this._chain=n,this},o.prototype
|
|
||||||
.value=function(){return this._wrapped},hn("pop push reverse shift sort splice unshift".split(" "),function(e){var t=I[e];o.prototype[e]=function(){var e=this._wrapped;return t.apply(e,arguments),e.length===0&&delete e[0],this._chain&&(e=new o(e),e._chain=n),e}}),hn(["concat","join","slice"],function(e){var t=I[e];o.prototype[e]=function(){var e=t.apply(this._wrapped,arguments);return this._chain&&(e=new o(e),e._chain=n),e}}),typeof define=="function"&&typeof define.amd=="object"&&define.amd?(e._=
|
|
||||||
s,define(function(){return s})):F?"object"==typeof module&&module&&module.t==F?(module.t=s)._=s:F._=s:e._=s})(this);
|
|
||||||
90
package.json
90
package.json
@@ -1,52 +1,50 @@
|
|||||||
{
|
{
|
||||||
"name": "lodash",
|
"name": "lodash",
|
||||||
"version": "0.5.2",
|
"version": "4.5.1",
|
||||||
"description": "A drop-in replacement for Underscore.js delivering performance, bug fixes, and additional features.",
|
"main": "lodash.js",
|
||||||
"homepage": "http://lodash.com",
|
"private": true,
|
||||||
"main": "lodash",
|
"devDependencies": {
|
||||||
"keywords": [
|
"async": "^1.5.2",
|
||||||
"browser",
|
"benchmark": "^2.1.0",
|
||||||
"client",
|
"chalk": "^1.1.1",
|
||||||
"functional",
|
"codecov.io": "~0.1.6",
|
||||||
"performance",
|
"coveralls": "^2.11.6",
|
||||||
"server",
|
"curl-amd": "~0.8.12",
|
||||||
"speed",
|
"docdown": "~0.4.1",
|
||||||
"util"
|
"dojo": "^1.10.4",
|
||||||
],
|
"ecstatic": "^1.4.0",
|
||||||
"licenses": [
|
"fs-extra": "~0.26.5",
|
||||||
{
|
"glob": "^7.0.0",
|
||||||
"type": "MIT",
|
"istanbul": "0.4.2",
|
||||||
"url": "http://lodash.com/license"
|
"jquery": "^2.2.0",
|
||||||
}
|
"jscs": "^2.10.1",
|
||||||
],
|
"lodash": "4.4.0",
|
||||||
"author": {
|
"platform": "^1.3.1",
|
||||||
"name": "John-David Dalton",
|
"qunit-extras": "^1.4.5",
|
||||||
"email": "john.david.dalton@gmail.com",
|
"qunitjs": "~1.21.0",
|
||||||
"web": "http://allyoucanleet.com/"
|
"request": "^2.69.0",
|
||||||
},
|
"requirejs": "^2.1.22",
|
||||||
"bugs": {
|
"sauce-tunnel": "^2.4.0",
|
||||||
"url": "https://github.com/bestiejs/lodash/issues"
|
"uglify-js": "2.6.1",
|
||||||
},
|
"webpack": "^1.12.13"
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/bestiejs/lodash.git"
|
|
||||||
},
|
|
||||||
"bin": {
|
|
||||||
"lodash": "./build.js"
|
|
||||||
},
|
|
||||||
"directories": {
|
|
||||||
"doc": "./doc",
|
|
||||||
"test": "./test"
|
|
||||||
},
|
|
||||||
"engines": [
|
|
||||||
"node",
|
|
||||||
"rhino"
|
|
||||||
],
|
|
||||||
"jam": {
|
|
||||||
"main": "lodash.min.js"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "node build",
|
"build": "npm run build:main & npm run build:fp",
|
||||||
"test": "node test/test"
|
"build:fp": "node lib/fp/build-dist.js",
|
||||||
|
"build:fp-modules": "node lib/fp/build-modules.js",
|
||||||
|
"build:main": "node lib/main/build-dist.js",
|
||||||
|
"build:main-modules": "node lib/main/build-modules.js",
|
||||||
|
"doc": "node lib/main/build-doc github",
|
||||||
|
"doc:fp": "node lib/fp/build-doc",
|
||||||
|
"doc:site": "node lib/main/build-doc site",
|
||||||
|
"pretest": "npm run build",
|
||||||
|
"style": "npm run style:main & npm run style:fp & npm run style:perf & npm run style:test",
|
||||||
|
"style:fp": "jscs fp/*.js lib/**/*.js",
|
||||||
|
"style:main": "jscs lodash.js",
|
||||||
|
"style:perf": "jscs perf/*.js perf/**/*.js",
|
||||||
|
"style:test": "jscs test/*.js test/**/*.js",
|
||||||
|
"test": "npm run test:main && npm run test:fp",
|
||||||
|
"test:fp": "node test/test-fp",
|
||||||
|
"test:main": "node test/test"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
131
perf/asset/perf-ui.js
Normal file
131
perf/asset/perf-ui.js
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
;(function(window) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/** The base path of the lodash builds. */
|
||||||
|
var basePath = '../';
|
||||||
|
|
||||||
|
/** The lodash build to load. */
|
||||||
|
var build = (build = /build=([^&]+)/.exec(location.search)) && decodeURIComponent(build[1]);
|
||||||
|
|
||||||
|
/** The other library to load. */
|
||||||
|
var other = (other = /other=([^&]+)/.exec(location.search)) && decodeURIComponent(other[1]);
|
||||||
|
|
||||||
|
/** The `ui` object. */
|
||||||
|
var ui = {};
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers an event listener on an element.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Element} element The element.
|
||||||
|
* @param {string} eventName The name of the event.
|
||||||
|
* @param {Function} handler The event handler.
|
||||||
|
* @returns {Element} The element.
|
||||||
|
*/
|
||||||
|
function addListener(element, eventName, handler) {
|
||||||
|
if (typeof element.addEventListener != 'undefined') {
|
||||||
|
element.addEventListener(eventName, handler, false);
|
||||||
|
} else if (typeof element.attachEvent != 'undefined') {
|
||||||
|
element.attachEvent('on' + eventName, handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// Initialize controls.
|
||||||
|
addListener(window, 'load', function() {
|
||||||
|
function eventHandler(event) {
|
||||||
|
var buildIndex = buildList.selectedIndex,
|
||||||
|
otherIndex = otherList.selectedIndex,
|
||||||
|
search = location.search.replace(/^\?|&?(?:build|other)=[^&]*&?/g, '');
|
||||||
|
|
||||||
|
if (event.stopPropagation) {
|
||||||
|
event.stopPropagation();
|
||||||
|
} else {
|
||||||
|
event.cancelBubble = true;
|
||||||
|
}
|
||||||
|
location.href =
|
||||||
|
location.href.split('?')[0] + '?' +
|
||||||
|
(search ? search + '&' : '') +
|
||||||
|
'build=' + (buildIndex < 0 ? build : buildList[buildIndex].value) + '&' +
|
||||||
|
'other=' + (otherIndex < 0 ? other : otherList[otherIndex].value);
|
||||||
|
}
|
||||||
|
|
||||||
|
var span1 = document.createElement('span');
|
||||||
|
span1.style.cssText = 'float:right';
|
||||||
|
span1.innerHTML =
|
||||||
|
'<label for="perf-build">Build: </label>' +
|
||||||
|
'<select id="perf-build">' +
|
||||||
|
'<option value="lodash">lodash</option>' +
|
||||||
|
'</select>';
|
||||||
|
|
||||||
|
var span2 = document.createElement('span');
|
||||||
|
span2.style.cssText = 'float:right';
|
||||||
|
span2.innerHTML =
|
||||||
|
'<label for="perf-other">Other Library: </label>' +
|
||||||
|
'<select id="perf-other">' +
|
||||||
|
'<option value="underscore-dev">Underscore (development)</option>' +
|
||||||
|
'<option value="underscore">Underscore (production)</option>' +
|
||||||
|
'<option value="lodash">lodash</option>' +
|
||||||
|
'</select>';
|
||||||
|
|
||||||
|
var buildList = span1.lastChild,
|
||||||
|
otherList = span2.lastChild,
|
||||||
|
toolbar = document.getElementById('perf-toolbar');
|
||||||
|
|
||||||
|
toolbar.appendChild(span2);
|
||||||
|
toolbar.appendChild(span1);
|
||||||
|
|
||||||
|
buildList.selectedIndex = (function() {
|
||||||
|
switch (build) {
|
||||||
|
case 'lodash':
|
||||||
|
case null: return 0;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}());
|
||||||
|
|
||||||
|
otherList.selectedIndex = (function() {
|
||||||
|
switch (other) {
|
||||||
|
case 'underscore-dev': return 0;
|
||||||
|
case 'lodash': return 2;
|
||||||
|
case 'underscore':
|
||||||
|
case null: return 1;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}());
|
||||||
|
|
||||||
|
addListener(buildList, 'change', eventHandler);
|
||||||
|
addListener(otherList, 'change', eventHandler);
|
||||||
|
});
|
||||||
|
|
||||||
|
// The lodash build file path.
|
||||||
|
ui.buildPath = (function() {
|
||||||
|
var result;
|
||||||
|
switch (build) {
|
||||||
|
case null: build = 'lodash';
|
||||||
|
case 'lodash': result = 'dist/lodash.min.js'; break;
|
||||||
|
default: return build;
|
||||||
|
}
|
||||||
|
return basePath + result;
|
||||||
|
}());
|
||||||
|
|
||||||
|
// The other library file path.
|
||||||
|
ui.otherPath = (function() {
|
||||||
|
var result;
|
||||||
|
switch (other) {
|
||||||
|
case 'lodash': result = 'dist/lodash.min.js'; break;
|
||||||
|
case 'underscore-dev': result = 'vendor/underscore/underscore.js'; break;
|
||||||
|
case null: other = 'underscore';
|
||||||
|
case 'underscore': result = 'vendor/underscore/underscore-min.js'; break;
|
||||||
|
default: return other;
|
||||||
|
}
|
||||||
|
return basePath + result;
|
||||||
|
}());
|
||||||
|
|
||||||
|
ui.urlParams = { 'build': build, 'other': other };
|
||||||
|
|
||||||
|
window.ui = ui;
|
||||||
|
|
||||||
|
}(this));
|
||||||
116
perf/index.html
116
perf/index.html
@@ -1,59 +1,69 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>Lo-Dash Performance Suite</title>
|
<title>lodash Performance Suite</title>
|
||||||
<style>
|
<style>
|
||||||
html, body {
|
html, body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
applet {
|
#FirebugUI {
|
||||||
position: absolute;
|
top: 2em;
|
||||||
left: -9999em;
|
}
|
||||||
}
|
#perf-toolbar {
|
||||||
</style>
|
background-color: #EEE;
|
||||||
</head>
|
color: #5E740B;
|
||||||
<body>
|
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
|
||||||
<script src="../lodash.min.js"></script>
|
font-size: small;
|
||||||
<script>
|
padding: 0.5em 0 0.5em 2em;
|
||||||
var lodash = _.noConflict();
|
overflow: hidden;
|
||||||
</script>
|
}
|
||||||
<script src="../vendor/underscore/underscore-min.js"></script>
|
</style>
|
||||||
<script src="../vendor/platform.js/platform.js"></script>
|
</head>
|
||||||
<script src="../vendor/benchmark.js/benchmark.js"></script>
|
<body>
|
||||||
<script src="../vendor/firebug-lite/src/firebug-lite-debug.js"></script>
|
<div id="perf-toolbar"></div>
|
||||||
<script src="perf.js"></script>
|
<script src="../lodash.js"></script>
|
||||||
<script>
|
<script src="../node_modules/platform/platform.js"></script>
|
||||||
(function() {
|
<script src="../node_modules/benchmark/benchmark.js"></script>
|
||||||
var measured,
|
<script src="../vendor/firebug-lite/src/firebug-lite-debug.js"></script>
|
||||||
perfNow,
|
<script src="./asset/perf-ui.js"></script>
|
||||||
begin = new Date;
|
<script>
|
||||||
|
document.write('<script src="' + ui.buildPath + '"><\/script>');
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
var lodash = _.noConflict();
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
document.write('<script src="' + ui.otherPath + '"><\/script>');
|
||||||
|
</script>
|
||||||
|
<script src="perf.js"></script>
|
||||||
|
<script>
|
||||||
|
(function() {
|
||||||
|
var measured,
|
||||||
|
perfNow,
|
||||||
|
begin = new Date;
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
var fbUI = document.getElementById('FirebugUI'),
|
var fbUI = document.getElementById('FirebugUI'),
|
||||||
fbDoc = fbUI && (fbDoc = fbUI.contentWindow || fbUI.contentDocument).document || fbDoc,
|
fbDoc = fbUI && (fbDoc = fbUI.contentWindow || fbUI.contentDocument).document || fbDoc,
|
||||||
fbCommandLine = fbDoc && fbDoc.getElementById('fbCommandLine');
|
fbCommandLine = fbDoc && fbDoc.getElementById('fbCommandLine');
|
||||||
|
|
||||||
if (!fbCommandLine) {
|
if (!fbCommandLine) {
|
||||||
return setTimeout(init, 15);
|
return setTimeout(init, 15);
|
||||||
}
|
}
|
||||||
fbUI.style.height = fbDoc.body.style.height = fbDoc.documentElement.style.height = '100%';
|
fbUI.style.height = (
|
||||||
setTimeout(run, 15);
|
Math.max(document.documentElement.clientHeight, document.body.clientHeight) -
|
||||||
}
|
document.getElementById('perf-toolbar').clientHeight
|
||||||
|
) + 'px';
|
||||||
|
|
||||||
// is the applet permitted?
|
fbDoc.body.style.height = fbDoc.documentElement.style.height = '100%';
|
||||||
if (!/[?&]nojava=true(?:&|$)/.test(location.search)) {
|
setTimeout(run, 15);
|
||||||
// is the applet really needed?
|
}
|
||||||
while (!(measured = new Date - begin)) { }
|
|
||||||
if (measured != 1 && !((perfNow = window.performance) && typeof (perfNow.now || perfNow.webkitNow) == 'function')) {
|
window.onload = init;
|
||||||
// load applet
|
}());
|
||||||
document.write('<applet code="nano" archive="../vendor/benchmark.js/nano.jar"></applet>');
|
</script>
|
||||||
}
|
</body>
|
||||||
}
|
|
||||||
window.onload = init;
|
|
||||||
}());
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
1823
perf/perf.js
1823
perf/perf.js
File diff suppressed because it is too large
Load Diff
@@ -1,9 +0,0 @@
|
|||||||
cd "$(dirname "$0")"
|
|
||||||
for cmd in node narwhal ringo rhino; do
|
|
||||||
echo ""
|
|
||||||
echo "Running performance suite in $cmd..."
|
|
||||||
$cmd perf.js
|
|
||||||
done
|
|
||||||
echo ""
|
|
||||||
echo "Running performance suite in a browser..."
|
|
||||||
open index.html
|
|
||||||
170
test/asset/test-ui.js
Normal file
170
test/asset/test-ui.js
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
;(function(window) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/** The base path of the lodash builds. */
|
||||||
|
var basePath = '../';
|
||||||
|
|
||||||
|
/** The lodash build to load. */
|
||||||
|
var build = (build = /build=([^&]+)/.exec(location.search)) && decodeURIComponent(build[1]);
|
||||||
|
|
||||||
|
/** The module loader to use. */
|
||||||
|
var loader = (loader = /loader=([^&]+)/.exec(location.search)) && decodeURIComponent(loader[1]);
|
||||||
|
|
||||||
|
/** The `ui` object. */
|
||||||
|
var ui = {};
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers an event listener on an element.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Element} element The element.
|
||||||
|
* @param {string} eventName The name of the event.
|
||||||
|
* @param {Function} handler The event handler.
|
||||||
|
* @returns {Element} The element.
|
||||||
|
*/
|
||||||
|
function addListener(element, eventName, handler) {
|
||||||
|
if (typeof element.addEventListener != 'undefined') {
|
||||||
|
element.addEventListener(eventName, handler, false);
|
||||||
|
} else if (typeof element.attachEvent != 'undefined') {
|
||||||
|
element.attachEvent('on' + eventName, handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// Initialize controls.
|
||||||
|
addListener(window, 'load', function() {
|
||||||
|
function eventHandler(event) {
|
||||||
|
var buildIndex = buildList.selectedIndex,
|
||||||
|
loaderIndex = loaderList.selectedIndex,
|
||||||
|
search = location.search.replace(/^\?|&?(?:build|loader)=[^&]*&?/g, '');
|
||||||
|
|
||||||
|
if (event.stopPropagation) {
|
||||||
|
event.stopPropagation();
|
||||||
|
} else {
|
||||||
|
event.cancelBubble = true;
|
||||||
|
}
|
||||||
|
location.href =
|
||||||
|
location.href.split('?')[0] + '?' +
|
||||||
|
(search ? search + '&' : '') +
|
||||||
|
'build=' + (buildIndex < 0 ? build : buildList[buildIndex].value) + '&' +
|
||||||
|
'loader=' + (loaderIndex < 0 ? loader : loaderList[loaderIndex].value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
var toolbar = document.getElementById('qunit-testrunner-toolbar');
|
||||||
|
if (!toolbar) {
|
||||||
|
setTimeout(init, 15);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
toolbar.appendChild(span1);
|
||||||
|
toolbar.appendChild(span2);
|
||||||
|
|
||||||
|
buildList.selectedIndex = (function() {
|
||||||
|
switch (build) {
|
||||||
|
case 'lodash': return 1;
|
||||||
|
case 'lodash-core-dev': return 2;
|
||||||
|
case 'lodash-core': return 3;
|
||||||
|
case 'lodash-dev':
|
||||||
|
case null: return 0;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}());
|
||||||
|
|
||||||
|
loaderList.selectedIndex = (function() {
|
||||||
|
switch (loader) {
|
||||||
|
case 'curl': return 1;
|
||||||
|
case 'dojo': return 2;
|
||||||
|
case 'requirejs': return 3;
|
||||||
|
case 'none':
|
||||||
|
case null: return 0;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}());
|
||||||
|
|
||||||
|
addListener(buildList, 'change', eventHandler);
|
||||||
|
addListener(loaderList, 'change', eventHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
var span1 = document.createElement('span');
|
||||||
|
span1.style.cssText = 'float:right';
|
||||||
|
span1.innerHTML =
|
||||||
|
'<label for="qunit-build">Build: </label>' +
|
||||||
|
'<select id="qunit-build">' +
|
||||||
|
'<option value="lodash-dev">lodash (development)</option>' +
|
||||||
|
'<option value="lodash">lodash (production)</option>' +
|
||||||
|
'<option value="lodash-core-dev">lodash-core (development)</option>' +
|
||||||
|
'<option value="lodash-core">lodash-core (production)</option>' +
|
||||||
|
'</select>';
|
||||||
|
|
||||||
|
var span2 = document.createElement('span');
|
||||||
|
span2.style.cssText = 'float:right';
|
||||||
|
span2.innerHTML =
|
||||||
|
'<label for="qunit-loader">Loader: </label>' +
|
||||||
|
'<select id="qunit-loader">' +
|
||||||
|
'<option value="none">None</option>' +
|
||||||
|
'<option value="curl">Curl</option>' +
|
||||||
|
'<option value="dojo">Dojo</option>' +
|
||||||
|
'<option value="requirejs">RequireJS</option>' +
|
||||||
|
'</select>';
|
||||||
|
|
||||||
|
var buildList = span1.lastChild,
|
||||||
|
loaderList = span2.lastChild;
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
ui.timing.loadEventEnd = +new Date;
|
||||||
|
}, 1);
|
||||||
|
|
||||||
|
init();
|
||||||
|
});
|
||||||
|
|
||||||
|
// The lodash build file path.
|
||||||
|
ui.buildPath = (function() {
|
||||||
|
var result;
|
||||||
|
switch (build) {
|
||||||
|
case 'lodash': result = 'dist/lodash.min.js'; break;
|
||||||
|
case 'lodash-core-dev': result = 'dist/lodash.core.js'; break;
|
||||||
|
case 'lodash-core': result = 'dist/lodash.core.min.js'; break;
|
||||||
|
case null: build = 'lodash-dev';
|
||||||
|
case 'lodash-dev': result = 'lodash.js'; break;
|
||||||
|
default: return build;
|
||||||
|
}
|
||||||
|
return basePath + result;
|
||||||
|
}());
|
||||||
|
|
||||||
|
// The module loader file path.
|
||||||
|
ui.loaderPath = (function() {
|
||||||
|
var result;
|
||||||
|
switch (loader) {
|
||||||
|
case 'curl': result = 'node_modules/curl-amd/dist/curl-kitchen-sink/curl.js'; break;
|
||||||
|
case 'dojo': result = 'node_modules/dojo/dojo.js'; break;
|
||||||
|
case 'requirejs': result = 'node_modules/requirejs/require.js'; break;
|
||||||
|
case null: loader = 'none'; return '';
|
||||||
|
default: return loader;
|
||||||
|
}
|
||||||
|
return basePath + result;
|
||||||
|
}());
|
||||||
|
|
||||||
|
// Used to indicate testing a core build.
|
||||||
|
ui.isCore = /\bcore(\.min)?\.js\b/.test(ui.buildPath);
|
||||||
|
|
||||||
|
// Used to indicate testing a foreign file.
|
||||||
|
ui.isForeign = RegExp('^(\\w+:)?//').test(build);
|
||||||
|
|
||||||
|
// Used to indicate testing a modularized build.
|
||||||
|
ui.isModularize = /\b(?:amd|commonjs|es|node|npm|(index|main)\.js)\b/.test([location.pathname, location.search]);
|
||||||
|
|
||||||
|
// Used to indicate testing in Sauce Labs' automated test cloud.
|
||||||
|
ui.isSauceLabs = location.port == '9001';
|
||||||
|
|
||||||
|
// Used to indicate that lodash is in strict mode.
|
||||||
|
ui.isStrict = /\bes\b/.test([location.pathname, location.search]);
|
||||||
|
|
||||||
|
ui.urlParams = { 'build': build, 'loader': loader };
|
||||||
|
ui.timing = { 'loadEventEnd': 0 };
|
||||||
|
|
||||||
|
window.ui = ui;
|
||||||
|
|
||||||
|
}(this));
|
||||||
12
test/asset/worker.js
Normal file
12
test/asset/worker.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
self.console || (self.console = { 'log': function() {} });
|
||||||
|
|
||||||
|
addEventListener('message', function(e) {
|
||||||
|
if (e.data) {
|
||||||
|
try {
|
||||||
|
importScripts('../' + e.data);
|
||||||
|
} catch (e) {
|
||||||
|
self._ = { 'VERSION': e.message };
|
||||||
|
}
|
||||||
|
postMessage(_.VERSION);
|
||||||
|
}
|
||||||
|
}, false);
|
||||||
@@ -1,41 +1,170 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>Backbone Test Suite</title>
|
<title>Backbone Test Suite</title>
|
||||||
<link rel="stylesheet" href="../vendor/backbone/test/vendor/qunit.css">
|
<link rel="stylesheet" href="../node_modules/qunitjs/qunit/qunit.css">
|
||||||
<style>
|
</head>
|
||||||
body > #qunit-header {
|
<body>
|
||||||
display: none;
|
<script>
|
||||||
}
|
// Avoid reporting tests to Sauce Labs when script errors occur.
|
||||||
#jslitmus {
|
if (location.port == '9001') {
|
||||||
display: none;
|
window.onerror = function(message) {
|
||||||
}
|
if (window.QUnit) {
|
||||||
</style>
|
QUnit.config.done.length = 0;
|
||||||
</head>
|
}
|
||||||
<body>
|
global_test_results = { 'message': message };
|
||||||
<div id="qunit"></div>
|
};
|
||||||
<h1 id="qunit-header"><a href="#">Backbone Speed Suite</a></h1>
|
}
|
||||||
<div id="qunit-fixture">
|
</script>
|
||||||
<div id='testElement'>
|
<script src="../node_modules/qunitjs/qunit/qunit.js"></script>
|
||||||
<h1>Test</h1>
|
<script src="../node_modules/qunit-extras/qunit-extras.js"></script>
|
||||||
</div>
|
<script src="../vendor/json-js/json2.js"></script>
|
||||||
</div>
|
<script src="../node_modules/platform/platform.js"></script>
|
||||||
<script src="../vendor/backbone/test/vendor/json2.js"></script>
|
<script src="./asset/test-ui.js"></script>
|
||||||
<script src="../vendor/backbone/test/vendor/jquery-1.7.1.js"></script>
|
<script src="../lodash.js"></script>
|
||||||
<script src="../vendor/backbone/test/vendor/qunit.js"></script>
|
<script>
|
||||||
<script src="../vendor/backbone/test/vendor/jslitmus.js"></script>
|
QUnit.config.asyncRetries = 10;
|
||||||
<script src="test-ui.js"></script>
|
QUnit.config.hidepassed = true;
|
||||||
<script>
|
|
||||||
document.write('<script src="../' + QUnit.config.lodashFilename + '.js"><\/script>');
|
var mixinPrereqs = (function() {
|
||||||
</script>
|
var aliasToReal = {
|
||||||
<script src="../vendor/backbone/backbone.js"></script>
|
'indexBy': 'keyBy',
|
||||||
<script src="../vendor/backbone/test/noconflict.js"></script>
|
'invoke': 'invokeMap'
|
||||||
<script src="../vendor/backbone/test/events.js"></script>
|
};
|
||||||
<script src="../vendor/backbone/test/model.js"></script>
|
|
||||||
<script src="../vendor/backbone/test/collection.js"></script>
|
var keyMap = {
|
||||||
<script src="../vendor/backbone/test/router.js"></script>
|
'rest': 'tail'
|
||||||
<script src="../vendor/backbone/test/view.js"></script>
|
};
|
||||||
<script src="../vendor/backbone/test/sync.js"></script>
|
|
||||||
</body>
|
var lodash = _.noConflict();
|
||||||
|
|
||||||
|
return function(_) {
|
||||||
|
lodash.defaultsDeep(_, { 'templateSettings': lodash.templateSettings });
|
||||||
|
lodash.mixin(_, lodash.pick(lodash, lodash.difference([
|
||||||
|
'countBy',
|
||||||
|
'debounce',
|
||||||
|
'difference',
|
||||||
|
'find',
|
||||||
|
'findIndex',
|
||||||
|
'findLastIndex',
|
||||||
|
'groupBy',
|
||||||
|
'includes',
|
||||||
|
'invert',
|
||||||
|
'invokeMap',
|
||||||
|
'keyBy',
|
||||||
|
'omit',
|
||||||
|
'partition',
|
||||||
|
'reduceRight',
|
||||||
|
'reject',
|
||||||
|
'sample',
|
||||||
|
'without'
|
||||||
|
], lodash.functions(_))));
|
||||||
|
|
||||||
|
lodash.forOwn(keyMap, function(realName, otherName) {
|
||||||
|
_[otherName] = lodash[realName];
|
||||||
|
_.prototype[otherName] = lodash.prototype[realName];
|
||||||
|
});
|
||||||
|
|
||||||
|
lodash.forOwn(aliasToReal, function(realName, alias) {
|
||||||
|
_[alias] = _[realName];
|
||||||
|
_.prototype[alias] = _.prototype[realName];
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}());
|
||||||
|
|
||||||
|
// Load prerequisite scripts.
|
||||||
|
document.write(ui.urlParams.loader == 'none'
|
||||||
|
? '<script src="' + ui.buildPath + '"><\/script>'
|
||||||
|
: '<script data-dojo-config="async:1" src="' + ui.loaderPath + '"><\/script>'
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
if (ui.urlParams.loader == 'none') {
|
||||||
|
mixinPrereqs(_);
|
||||||
|
document.write([
|
||||||
|
'<script src="../node_modules/jquery/dist/jquery.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/backbone.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/setup/dom-setup.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/setup/environment.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/noconflict.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/events.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/model.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/collection.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/router.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/view.js"><\/script>',
|
||||||
|
'<script src="../vendor/backbone/test/sync.js"><\/script>'
|
||||||
|
].join('\n'));
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
(function() {
|
||||||
|
if (window.curl) {
|
||||||
|
curl.config({ 'apiName': 'require' });
|
||||||
|
}
|
||||||
|
if (!window.require) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var reBasename = /[\w.-]+$/,
|
||||||
|
basePath = ('//' + location.host + location.pathname.replace(reBasename, '')).replace(/\btest\/$/, ''),
|
||||||
|
modulePath = ui.buildPath.replace(/\.js$/, ''),
|
||||||
|
locationPath = modulePath.replace(reBasename, '').replace(/^\/|\/$/g, ''),
|
||||||
|
moduleMain = modulePath.match(reBasename)[0],
|
||||||
|
uid = +new Date;
|
||||||
|
|
||||||
|
function getConfig() {
|
||||||
|
var result = {
|
||||||
|
'baseUrl': './',
|
||||||
|
'urlArgs': 't=' + uid++,
|
||||||
|
'waitSeconds': 0,
|
||||||
|
'paths': {
|
||||||
|
'backbone': '../vendor/backbone/backbone',
|
||||||
|
'jquery': '../node_modules/jquery/dist/jquery'
|
||||||
|
},
|
||||||
|
'packages': [{
|
||||||
|
'name': 'test',
|
||||||
|
'location': '../vendor/backbone/test',
|
||||||
|
'config': {
|
||||||
|
// Work around no global being exported.
|
||||||
|
'exports': 'QUnit',
|
||||||
|
'loader': 'curl/loader/legacy'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
if (ui.isModularize) {
|
||||||
|
result.packages.push({
|
||||||
|
'name': 'underscore',
|
||||||
|
'location': locationPath,
|
||||||
|
'main': moduleMain
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
result.paths.underscore = modulePath;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QUnit.config.autostart = false;
|
||||||
|
|
||||||
|
require(getConfig(), ['underscore'], function(lodash) {
|
||||||
|
mixinPrereqs(lodash);
|
||||||
|
require(getConfig(), ['backbone'], function() {
|
||||||
|
require(getConfig(), [
|
||||||
|
'test/setup/dom-setup',
|
||||||
|
'test/setup/environment',
|
||||||
|
'test/noconflict',
|
||||||
|
'test/events',
|
||||||
|
'test/model',
|
||||||
|
'test/collection',
|
||||||
|
'test/router',
|
||||||
|
'test/view',
|
||||||
|
'test/sync'
|
||||||
|
], function() {
|
||||||
|
QUnit.start();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}());
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
41
test/fp.html
Normal file
41
test/fp.html
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>lodash-fp Test Suite</title>
|
||||||
|
<link rel="stylesheet" href="../node_modules/qunitjs/qunit/qunit.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
// Avoid reporting tests to Sauce Labs when script errors occur.
|
||||||
|
if (location.port == '9001') {
|
||||||
|
window.onerror = function(message) {
|
||||||
|
if (window.QUnit) {
|
||||||
|
QUnit.config.done.length = 0;
|
||||||
|
}
|
||||||
|
global_test_results = { 'message': message };
|
||||||
|
};
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script src="../lodash.js"></script>
|
||||||
|
<script src="../dist/lodash.fp.js"></script>
|
||||||
|
<script src="../dist/mapping.fp.js"></script>
|
||||||
|
<script src="../node_modules/qunitjs/qunit/qunit.js"></script>
|
||||||
|
<script src="../node_modules/qunit-extras/qunit-extras.js"></script>
|
||||||
|
<script src="../node_modules/platform/platform.js"></script>
|
||||||
|
<script src="./test-fp.js"></script>
|
||||||
|
<div id="qunit"></div>
|
||||||
|
<script>
|
||||||
|
// Set a more readable browser name.
|
||||||
|
window.onload = function() {
|
||||||
|
var timeoutId = setInterval(function() {
|
||||||
|
var ua = document.getElementById('qunit-userAgent');
|
||||||
|
if (ua) {
|
||||||
|
ua.innerHTML = platform;
|
||||||
|
clearInterval(timeoutId);
|
||||||
|
}
|
||||||
|
}, 16);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
400
test/index.html
400
test/index.html
@@ -1,82 +1,342 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>Lo-Dash Test Suite</title>
|
<title>lodash Test Suite</title>
|
||||||
<link rel="stylesheet" href="../vendor/qunit/qunit/qunit.css">
|
<link rel="stylesheet" href="../node_modules/qunitjs/qunit/qunit.css">
|
||||||
</head>
|
<style>
|
||||||
<body>
|
#exports, #module {
|
||||||
<div id="qunit"></div>
|
display: none;
|
||||||
<script src="../vendor/platform.js/platform.js"></script>
|
}
|
||||||
<script>
|
</style>
|
||||||
// avoid syntax errors for `QUnit.throws` in older Firefoxes
|
</head>
|
||||||
document.write(platform.name == 'Firefox' && /^1\b/.test(platform.version)
|
<body>
|
||||||
? '<script src="../vendor/qunit/qunit/qunit-1.8.0.js"><\/script>'
|
<script>
|
||||||
: '<script src="../vendor/qunit/qunit/qunit.js"><\/script>'
|
// Avoid reporting tests to Sauce Labs when script errors occur.
|
||||||
);
|
if (location.port == '9001') {
|
||||||
</script>
|
window.onerror = function(message) {
|
||||||
<script src="test-ui.js"></script>
|
if (window.QUnit) {
|
||||||
<script>
|
QUnit.config.done.length = 0;
|
||||||
// set a bad shim
|
}
|
||||||
Object._keys = Object.keys;
|
global_test_results = { 'message': message };
|
||||||
Object.keys = function() { return []; };
|
};
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script src="../node_modules/lodash/lodash.js"></script>
|
||||||
|
<script>var lodashStable = _.noConflict();</script>
|
||||||
|
<script src="../node_modules/qunitjs/qunit/qunit.js"></script>
|
||||||
|
<script src="../node_modules/qunit-extras/qunit-extras.js"></script>
|
||||||
|
<script src="../node_modules/platform/platform.js"></script>
|
||||||
|
<script src="./asset/test-ui.js"></script>
|
||||||
|
<div id="qunit"></div>
|
||||||
|
<div id="exports"></div>
|
||||||
|
<div id="module"></div>
|
||||||
|
<script>
|
||||||
|
function setProperty(object, key, value) {
|
||||||
|
try {
|
||||||
|
Object.defineProperty(object, key, {
|
||||||
|
'configurable': true,
|
||||||
|
'enumerable': false,
|
||||||
|
'writable': true,
|
||||||
|
'value': value
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
object[key] = value;
|
||||||
|
}
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
// load Lo-Dash and expose it to the bad `Object.keys` shim
|
function addBizarroMethods() {
|
||||||
document.write('<script src="../' + QUnit.config.lodashFilename + '.js"><\/script>');
|
var funcProto = Function.prototype,
|
||||||
</script>
|
objectProto = Object.prototype;
|
||||||
<script>
|
|
||||||
// store Lo-Dash to test for bad shim detection
|
|
||||||
var lodashBadShim = _;
|
|
||||||
|
|
||||||
// restore nativeKeys
|
var hasOwnProperty = objectProto.hasOwnProperty,
|
||||||
Object.keys = Object._keys;
|
fnToString = funcProto.toString,
|
||||||
delete Object._keys;
|
nativeString = fnToString.call(objectProto.toString),
|
||||||
|
noop = function() {},
|
||||||
|
propertyIsEnumerable = objectProto.propertyIsEnumerable,
|
||||||
|
reToString = /toString/g;
|
||||||
|
|
||||||
// set to test `_.noConflict`
|
function constant(value) {
|
||||||
_ = 1;
|
return function() {
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
// load Lo-Dash again to overwrite the existing `_` value
|
function createToString(funcName) {
|
||||||
document.write('<script src="../' + QUnit.config.lodashFilename + '.js"><\/script>');
|
return constant(nativeString.replace(reToString, funcName));
|
||||||
|
}
|
||||||
|
|
||||||
// load test.js if not using require.js
|
// Allow bypassing native checks.
|
||||||
document.write(QUnit.urlParams.norequire
|
setProperty(funcProto, 'toString', (function() {
|
||||||
? '<script src="test.js"><\/script>'
|
function wrapper() {
|
||||||
: '<script src="../vendor/requirejs/require.js"><\/script>'
|
setProperty(funcProto, 'toString', fnToString);
|
||||||
);
|
var result = hasOwnProperty.call(this, 'toString') ? this.toString() : fnToString.call(this);
|
||||||
</script>
|
setProperty(funcProto, 'toString', wrapper);
|
||||||
<script>
|
return result;
|
||||||
// load Lo-Dash as a module
|
}
|
||||||
var lodashModule,
|
return wrapper;
|
||||||
underscoreModule;
|
}()));
|
||||||
|
|
||||||
window.require && require({
|
// Add prototype extensions.
|
||||||
'baseUrl': '../vendor/requirejs/',
|
funcProto._method = noop;
|
||||||
'urlArgs': 't=' + (+new Date),
|
|
||||||
'paths': {
|
|
||||||
'lodash': '../../' + QUnit.config.lodashFilename,
|
|
||||||
'underscore': './../../' + QUnit.config.lodashFilename
|
|
||||||
}
|
|
||||||
},
|
|
||||||
['lodash', 'underscore'], function(lodash, underscore) {
|
|
||||||
lodashModule = lodash.noConflict();
|
|
||||||
lodashModule.moduleName = 'lodash';
|
|
||||||
|
|
||||||
underscoreModule = underscore.noConflict();
|
// Set bad shims.
|
||||||
underscoreModule.moduleName = 'underscore';
|
setProperty(Object, '_create', Object.create);
|
||||||
|
setProperty(Object, 'create', (function() {
|
||||||
|
function object() {}
|
||||||
|
return function(prototype) {
|
||||||
|
if (prototype === Object(prototype)) {
|
||||||
|
object.prototype = prototype;
|
||||||
|
var result = new object;
|
||||||
|
object.prototype = undefined;
|
||||||
|
}
|
||||||
|
return result || {};
|
||||||
|
};
|
||||||
|
}()));
|
||||||
|
|
||||||
require(['test.js']);
|
setProperty(Object, '_getOwnPropertySymbols', Object.getOwnPropertySymbols);
|
||||||
});
|
setProperty(Object, 'getOwnPropertySymbols', undefined);
|
||||||
|
|
||||||
// set a more readable browser name
|
setProperty(objectProto, '_propertyIsEnumerable', propertyIsEnumerable);
|
||||||
window.onload = function() {
|
setProperty(objectProto, 'propertyIsEnumerable', function(key) {
|
||||||
var timeoutId = setInterval(function() {
|
return !(key == 'valueOf' && this && this.valueOf === 1) && _propertyIsEnumerable.call(this, key);
|
||||||
var ua = document.getElementById('qunit-userAgent');
|
});
|
||||||
if (ua) {
|
|
||||||
ua.innerHTML = platform;
|
setProperty(window, '_Map', window.Map);
|
||||||
clearInterval(timeoutId);
|
if (_Map) {
|
||||||
}
|
setProperty(window, 'Map', (function(Map) {
|
||||||
}, 15);
|
var count = 0;
|
||||||
};
|
return function() {
|
||||||
</script>
|
if (count++) {
|
||||||
</body>
|
return new Map;
|
||||||
|
}
|
||||||
|
var result = {};
|
||||||
|
setProperty(window, 'Map', Map);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
}(_Map)));
|
||||||
|
|
||||||
|
setProperty(Map, 'toString', createToString('Map'));
|
||||||
|
}
|
||||||
|
setProperty(window, '_Set', window.Set);
|
||||||
|
setProperty(window, 'Set', noop);
|
||||||
|
|
||||||
|
setProperty(window, '_Symbol', window.Symbol);
|
||||||
|
setProperty(window, 'Symbol', undefined);
|
||||||
|
|
||||||
|
setProperty(window, '_WeakMap', window.WeakMap);
|
||||||
|
setProperty(window, 'WeakMap', noop);
|
||||||
|
|
||||||
|
// Fake `WinRTError`.
|
||||||
|
setProperty(window, 'WinRTError', Error);
|
||||||
|
|
||||||
|
// Fake free variable `global`.
|
||||||
|
setProperty(window, 'exports', window);
|
||||||
|
setProperty(window, 'global', window);
|
||||||
|
setProperty(window, 'module', {});
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeBizarroMethods() {
|
||||||
|
var funcProto = Function.prototype,
|
||||||
|
objectProto = Object.prototype;
|
||||||
|
|
||||||
|
setProperty(objectProto, 'propertyIsEnumerable', objectProto._propertyIsEnumerable);
|
||||||
|
|
||||||
|
if (Object._create) {
|
||||||
|
Object.create = Object._create;
|
||||||
|
} else {
|
||||||
|
delete Object.create;
|
||||||
|
}
|
||||||
|
if (Object._getOwnPropertySymbols) {
|
||||||
|
Object.getOwnPropertySymbols = Object._getOwnPropertySymbols;
|
||||||
|
} else {
|
||||||
|
delete Object.getOwnPropertySymbols;
|
||||||
|
}
|
||||||
|
if (_Map) {
|
||||||
|
Map = _Map;
|
||||||
|
} else {
|
||||||
|
setProperty(window, 'Map', undefined);
|
||||||
|
}
|
||||||
|
if (_Set) {
|
||||||
|
Set = _Set;
|
||||||
|
} else {
|
||||||
|
setProperty(window, 'Set', undefined);
|
||||||
|
}
|
||||||
|
if (_Symbol) {
|
||||||
|
Symbol = _Symbol;
|
||||||
|
}
|
||||||
|
if (_WeakMap) {
|
||||||
|
WeakMap = _WeakMap;
|
||||||
|
} else {
|
||||||
|
setProperty(window, 'WeakMap', undefined);
|
||||||
|
}
|
||||||
|
setProperty(window, '_Map', undefined);
|
||||||
|
setProperty(window, '_Set', undefined);
|
||||||
|
setProperty(window, '_Symbol', undefined);
|
||||||
|
setProperty(window, '_WeakMap', undefined);
|
||||||
|
|
||||||
|
setProperty(window, 'WinRTError', undefined);
|
||||||
|
|
||||||
|
setProperty(window, 'exports', document.getElementById('exports'));
|
||||||
|
setProperty(window, 'global', undefined);
|
||||||
|
setProperty(window, 'module', document.getElementById('module'));
|
||||||
|
|
||||||
|
delete funcProto._method;
|
||||||
|
delete Object._create;
|
||||||
|
delete Object._getOwnPropertySymbols;
|
||||||
|
delete objectProto._propertyIsEnumerable;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load lodash to expose it to the bad extensions/shims.
|
||||||
|
if (!ui.isModularize) {
|
||||||
|
addBizarroMethods();
|
||||||
|
document.write('<script src="' + ui.buildPath + '"><\/script>');
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
// Store lodash to test for bad extensions/shims.
|
||||||
|
if (!ui.isModularize) {
|
||||||
|
var lodashBizarro = window._;
|
||||||
|
window._ = undefined;
|
||||||
|
removeBizarroMethods();
|
||||||
|
}
|
||||||
|
// Load test scripts.
|
||||||
|
document.write((ui.isForeign || ui.urlParams.loader == 'none')
|
||||||
|
? '<script src="' + ui.buildPath + '"><\/script><script src="test.js"><\/script>'
|
||||||
|
: '<script data-dojo-config="async:1" src="' + ui.loaderPath + '"><\/script>'
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
var lodashModule,
|
||||||
|
shimmedModule,
|
||||||
|
underscoreModule;
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
if (window.curl) {
|
||||||
|
curl.config({ 'apiName': 'require' });
|
||||||
|
}
|
||||||
|
if (ui.isForeign || !window.require) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var reBasename = /[\w.-]+$/,
|
||||||
|
basePath = ('//' + location.host + location.pathname.replace(reBasename, '')).replace(/\btest\/$/, ''),
|
||||||
|
modulePath = ui.buildPath.replace(/\.js$/, ''),
|
||||||
|
moduleMain = modulePath.match(reBasename)[0],
|
||||||
|
locationPath = modulePath.replace(reBasename, '').replace(/^\/|\/$/g, ''),
|
||||||
|
shimmedLocationPath = './abc/../' + locationPath,
|
||||||
|
underscoreLocationPath = './xyz/../' + locationPath,
|
||||||
|
uid = +new Date;
|
||||||
|
|
||||||
|
function getConfig() {
|
||||||
|
var result = {
|
||||||
|
'baseUrl': './',
|
||||||
|
'urlArgs': 't=' + uid++,
|
||||||
|
'waitSeconds': 0,
|
||||||
|
'paths': {},
|
||||||
|
'packages': [{
|
||||||
|
'name': 'test',
|
||||||
|
'location': basePath + 'test',
|
||||||
|
'main': 'test',
|
||||||
|
'config': {
|
||||||
|
// Work around no global being exported.
|
||||||
|
'exports': 'QUnit',
|
||||||
|
'loader': 'curl/loader/legacy'
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
'shim': {
|
||||||
|
'shimmed': {
|
||||||
|
'exports': '_'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (ui.isModularize) {
|
||||||
|
result.packages.push({
|
||||||
|
'name': 'lodash',
|
||||||
|
'location': locationPath,
|
||||||
|
'main': moduleMain
|
||||||
|
}, {
|
||||||
|
'name': 'shimmed',
|
||||||
|
'location': shimmedLocationPath,
|
||||||
|
'main': moduleMain
|
||||||
|
}, {
|
||||||
|
'name': 'underscore',
|
||||||
|
'location': underscoreLocationPath,
|
||||||
|
'main': moduleMain
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
result.paths.lodash = modulePath;
|
||||||
|
result.paths.shimmed = shimmedLocationPath + '/' + moduleMain;
|
||||||
|
result.paths.underscore = underscoreLocationPath + '/' + moduleMain;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadTests() {
|
||||||
|
require(getConfig(), ['test'], function() {
|
||||||
|
QUnit.start();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadModulesAndTests() {
|
||||||
|
require(getConfig(), ['lodash', 'shimmed', 'underscore'], function(lodash, shimmed, underscore) {
|
||||||
|
lodashModule = lodash;
|
||||||
|
lodashModule.moduleName = 'lodash';
|
||||||
|
|
||||||
|
if (shimmed) {
|
||||||
|
shimmedModule = shimmed.result(shimmed, 'noConflict') || shimmed;
|
||||||
|
shimmedModule.moduleName = 'shimmed';
|
||||||
|
}
|
||||||
|
if (underscore) {
|
||||||
|
underscoreModule = underscore.result(underscore, 'noConflict') || underscore;
|
||||||
|
underscoreModule.moduleName = 'underscore';
|
||||||
|
}
|
||||||
|
window._ = lodash;
|
||||||
|
|
||||||
|
if (ui.isModularize) {
|
||||||
|
require(getConfig(), [
|
||||||
|
'lodash/_baseEach',
|
||||||
|
'lodash/_isIndex',
|
||||||
|
'lodash/_isIterateeCall'
|
||||||
|
], function(baseEach, isIndex, isIterateeCall) {
|
||||||
|
lodash._baseEach = baseEach;
|
||||||
|
lodash._isIndex = isIndex;
|
||||||
|
lodash._isIterateeCall = isIterateeCall;
|
||||||
|
loadTests();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
loadTests();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
QUnit.config.autostart = false;
|
||||||
|
|
||||||
|
if (window.requirejs) {
|
||||||
|
addBizarroMethods();
|
||||||
|
require(getConfig(), ['lodash'], function(lodash) {
|
||||||
|
lodashBizarro = lodash.result(lodash, 'noConflict') || lodash;
|
||||||
|
delete requirejs.s.contexts._;
|
||||||
|
|
||||||
|
removeBizarroMethods();
|
||||||
|
loadModulesAndTests();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
loadModulesAndTests();
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
|
||||||
|
// Set a more readable browser name.
|
||||||
|
window.onload = function() {
|
||||||
|
var timeoutId = setInterval(function() {
|
||||||
|
var ua = document.getElementById('qunit-userAgent');
|
||||||
|
if (ua) {
|
||||||
|
ua.innerHTML = platform;
|
||||||
|
clearInterval(timeoutId);
|
||||||
|
}
|
||||||
|
}, 16);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
27
test/remove.js
Normal file
27
test/remove.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _ = require('../lodash'),
|
||||||
|
fs = require('fs'),
|
||||||
|
path = require('path');
|
||||||
|
|
||||||
|
var args = (args = process.argv)
|
||||||
|
.slice((args[0] === process.execPath || args[0] === 'node') ? 2 : 0);
|
||||||
|
|
||||||
|
var filePath = path.resolve(args[1]),
|
||||||
|
reLine = /.*/gm;
|
||||||
|
|
||||||
|
var pattern = (function() {
|
||||||
|
var result = args[0],
|
||||||
|
delimiter = result.charAt(0),
|
||||||
|
lastIndex = result.lastIndexOf(delimiter);
|
||||||
|
|
||||||
|
return RegExp(result.slice(1, lastIndex), result.slice(lastIndex + 1));
|
||||||
|
}());
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
fs.writeFileSync(filePath, fs.readFileSync(filePath, 'utf8').replace(pattern, function(match) {
|
||||||
|
var snippet = _.slice(arguments, -3, -2)[0];
|
||||||
|
return match.replace(snippet, snippet.replace(reLine, ''));
|
||||||
|
}));
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
cd "$(dirname "$0")"
|
|
||||||
for cmd in rhino ringo narwhal node; do
|
|
||||||
echo ""
|
|
||||||
echo "Testing in $cmd..."
|
|
||||||
$cmd test.js
|
|
||||||
done
|
|
||||||
echo ""
|
|
||||||
echo "Testing in a browser..."
|
|
||||||
open index.html
|
|
||||||
921
test/saucelabs.js
Normal file
921
test/saucelabs.js
Normal file
@@ -0,0 +1,921 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/** Environment shortcut. */
|
||||||
|
var env = process.env;
|
||||||
|
|
||||||
|
if (env.TRAVIS_SECURE_ENV_VARS == 'false') {
|
||||||
|
console.log('Skipping Sauce Labs jobs; secure environment variables are unavailable');
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Load Node.js modules. */
|
||||||
|
var EventEmitter = require('events').EventEmitter,
|
||||||
|
http = require('http'),
|
||||||
|
path = require('path'),
|
||||||
|
url = require('url'),
|
||||||
|
util = require('util');
|
||||||
|
|
||||||
|
/** Load other modules. */
|
||||||
|
var _ = require('../lodash.js'),
|
||||||
|
chalk = require('chalk'),
|
||||||
|
ecstatic = require('ecstatic'),
|
||||||
|
request = require('request'),
|
||||||
|
SauceTunnel = require('sauce-tunnel');
|
||||||
|
|
||||||
|
/** Used for Sauce Labs credentials. */
|
||||||
|
var accessKey = env.SAUCE_ACCESS_KEY,
|
||||||
|
username = env.SAUCE_USERNAME;
|
||||||
|
|
||||||
|
/** Used as the default maximum number of times to retry a job and tunnel. */
|
||||||
|
var maxJobRetries = 3,
|
||||||
|
maxTunnelRetries = 3;
|
||||||
|
|
||||||
|
/** Used as the static file server middleware. */
|
||||||
|
var mount = ecstatic({
|
||||||
|
'cache': 'no-cache',
|
||||||
|
'root': process.cwd()
|
||||||
|
});
|
||||||
|
|
||||||
|
/** Used as the list of ports supported by Sauce Connect. */
|
||||||
|
var ports = [
|
||||||
|
80, 443, 888, 2000, 2001, 2020, 2109, 2222, 2310, 3000, 3001, 3030, 3210,
|
||||||
|
3333, 4000, 4001, 4040, 4321, 4502, 4503, 4567, 5000, 5001, 5050, 5555, 5432,
|
||||||
|
6000, 6001, 6060, 6666, 6543, 7000, 7070, 7774, 7777, 8000, 8001, 8003, 8031,
|
||||||
|
8080, 8081, 8765, 8777, 8888, 9000, 9001, 9080, 9090, 9876, 9877, 9999, 49221,
|
||||||
|
55001
|
||||||
|
];
|
||||||
|
|
||||||
|
/** Used by `logInline` to clear previously logged messages. */
|
||||||
|
var prevLine = '';
|
||||||
|
|
||||||
|
/** Method shortcut. */
|
||||||
|
var push = Array.prototype.push;
|
||||||
|
|
||||||
|
/** Used to detect error messages. */
|
||||||
|
var reError = /(?:\be|E)rror\b/;
|
||||||
|
|
||||||
|
/** Used to detect valid job ids. */
|
||||||
|
var reJobId = /^[a-z0-9]{32}$/;
|
||||||
|
|
||||||
|
/** Used to display the wait throbber. */
|
||||||
|
var throbberDelay = 500,
|
||||||
|
waitCount = -1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used as Sauce Labs config values.
|
||||||
|
* See the [Sauce Labs documentation](https://docs.saucelabs.com/reference/test-configuration/)
|
||||||
|
* for more details.
|
||||||
|
*/
|
||||||
|
var advisor = getOption('advisor', false),
|
||||||
|
build = getOption('build', (env.TRAVIS_COMMIT || '').slice(0, 10)),
|
||||||
|
commandTimeout = getOption('commandTimeout', 90),
|
||||||
|
compatMode = getOption('compatMode', null),
|
||||||
|
customData = Function('return {' + getOption('customData', '').replace(/^\{|}$/g, '') + '}')(),
|
||||||
|
deviceOrientation = getOption('deviceOrientation', 'portrait'),
|
||||||
|
framework = getOption('framework', 'qunit'),
|
||||||
|
idleTimeout = getOption('idleTimeout', 60),
|
||||||
|
jobName = getOption('name', 'unit tests'),
|
||||||
|
maxDuration = getOption('maxDuration', 180),
|
||||||
|
port = ports[Math.min(_.sortedIndex(ports, getOption('port', 9001)), ports.length - 1)],
|
||||||
|
publicAccess = getOption('public', true),
|
||||||
|
queueTimeout = getOption('queueTimeout', 240),
|
||||||
|
recordVideo = getOption('recordVideo', true),
|
||||||
|
recordScreenshots = getOption('recordScreenshots', false),
|
||||||
|
runner = getOption('runner', 'test/index.html').replace(/^\W+/, ''),
|
||||||
|
runnerUrl = getOption('runnerUrl', 'http://localhost:' + port + '/' + runner),
|
||||||
|
statusInterval = getOption('statusInterval', 5),
|
||||||
|
tags = getOption('tags', []),
|
||||||
|
throttled = getOption('throttled', 10),
|
||||||
|
tunneled = getOption('tunneled', true),
|
||||||
|
tunnelId = getOption('tunnelId', 'tunnel_' + (env.TRAVIS_JOB_ID || 0)),
|
||||||
|
tunnelTimeout = getOption('tunnelTimeout', 120),
|
||||||
|
videoUploadOnPass = getOption('videoUploadOnPass', false);
|
||||||
|
|
||||||
|
/** Used to convert Sauce Labs browser identifiers to their formal names. */
|
||||||
|
var browserNameMap = {
|
||||||
|
'googlechrome': 'Chrome',
|
||||||
|
'iehta': 'Internet Explorer',
|
||||||
|
'ipad': 'iPad',
|
||||||
|
'iphone': 'iPhone'
|
||||||
|
};
|
||||||
|
|
||||||
|
/** List of platforms to load the runner on. */
|
||||||
|
var platforms = [
|
||||||
|
['Linux', 'android', '5.1'],
|
||||||
|
['Windows 10', 'chrome', '48'],
|
||||||
|
['Windows 10', 'chrome', '47'],
|
||||||
|
['Windows 10', 'firefox', '44'],
|
||||||
|
['Windows 10', 'firefox', '43'],
|
||||||
|
['Windows 10', 'microsoftedge', '20.10240'],
|
||||||
|
['Windows 10', 'internet explorer', '11'],
|
||||||
|
['Windows 8', 'internet explorer', '10'],
|
||||||
|
['Windows 7', 'internet explorer', '9'],
|
||||||
|
// ['OS X 10.10', 'ipad', '9.1'],
|
||||||
|
['OS X 10.11', 'safari', '9'],
|
||||||
|
['OS X 10.10', 'safari', '8']
|
||||||
|
];
|
||||||
|
|
||||||
|
/** Used to tailor the `platforms` array. */
|
||||||
|
var isAMD = _.includes(tags, 'amd'),
|
||||||
|
isBackbone = _.includes(tags, 'backbone'),
|
||||||
|
isModern = _.includes(tags, 'modern');
|
||||||
|
|
||||||
|
// The platforms to test IE compatibility modes.
|
||||||
|
if (compatMode) {
|
||||||
|
platforms = [
|
||||||
|
['Windows 10', 'internet explorer', '11'],
|
||||||
|
['Windows 8', 'internet explorer', '10'],
|
||||||
|
['Windows 7', 'internet explorer', '9'],
|
||||||
|
['Windows 7', 'internet explorer', '8']
|
||||||
|
];
|
||||||
|
}
|
||||||
|
// The platforms for AMD tests.
|
||||||
|
if (isAMD) {
|
||||||
|
platforms = _.filter(platforms, function(platform) {
|
||||||
|
var browser = browserName(platform[1]),
|
||||||
|
version = +platform[2];
|
||||||
|
|
||||||
|
switch (browser) {
|
||||||
|
case 'Android': return version >= 4.4;
|
||||||
|
case 'Opera': return version >= 10;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// The platforms for Backbone tests.
|
||||||
|
if (isBackbone) {
|
||||||
|
platforms = _.filter(platforms, function(platform) {
|
||||||
|
var browser = browserName(platform[1]),
|
||||||
|
version = +platform[2];
|
||||||
|
|
||||||
|
switch (browser) {
|
||||||
|
case 'Firefox': return version >= 4;
|
||||||
|
case 'Internet Explorer': return version >= 7;
|
||||||
|
case 'iPad': return version >= 5;
|
||||||
|
case 'Opera': return version >= 12;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// The platforms for modern builds.
|
||||||
|
if (isModern) {
|
||||||
|
platforms = _.filter(platforms, function(platform) {
|
||||||
|
var browser = browserName(platform[1]),
|
||||||
|
version = +platform[2];
|
||||||
|
|
||||||
|
switch (browser) {
|
||||||
|
case 'Android': return version >= 4.1;
|
||||||
|
case 'Firefox': return version >= 10;
|
||||||
|
case 'Internet Explorer': return version >= 9;
|
||||||
|
case 'iPad': return version >= 6;
|
||||||
|
case 'Opera': return version >= 12;
|
||||||
|
case 'Safari': return version >= 6;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Used as the default `Job` options object. */
|
||||||
|
var jobOptions = {
|
||||||
|
'build': build,
|
||||||
|
'command-timeout': commandTimeout,
|
||||||
|
'custom-data': customData,
|
||||||
|
'device-orientation': deviceOrientation,
|
||||||
|
'framework': framework,
|
||||||
|
'idle-timeout': idleTimeout,
|
||||||
|
'max-duration': maxDuration,
|
||||||
|
'name': jobName,
|
||||||
|
'public': publicAccess,
|
||||||
|
'platforms': platforms,
|
||||||
|
'record-screenshots': recordScreenshots,
|
||||||
|
'record-video': recordVideo,
|
||||||
|
'sauce-advisor': advisor,
|
||||||
|
'tags': tags,
|
||||||
|
'url': runnerUrl,
|
||||||
|
'video-upload-on-pass': videoUploadOnPass
|
||||||
|
};
|
||||||
|
|
||||||
|
if (publicAccess === true) {
|
||||||
|
jobOptions['public'] = 'public';
|
||||||
|
}
|
||||||
|
if (tunneled) {
|
||||||
|
jobOptions['tunnel-identifier'] = tunnelId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolves the formal browser name for a given Sauce Labs browser identifier.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} identifier The browser identifier.
|
||||||
|
* @returns {string} Returns the formal browser name.
|
||||||
|
*/
|
||||||
|
function browserName(identifier) {
|
||||||
|
return browserNameMap[identifier] || capitalizeWords(identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Capitalizes the first character of each word in `string`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} string The string to augment.
|
||||||
|
* @returns {string} Returns the augmented string.
|
||||||
|
*/
|
||||||
|
function capitalizeWords(string) {
|
||||||
|
return _.map(string.split(' '), _.capitalize).join(' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value for the given option name. If no value is available the
|
||||||
|
* `defaultValue` is returned.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the option.
|
||||||
|
* @param {*} defaultValue The default option value.
|
||||||
|
* @returns {*} Returns the option value.
|
||||||
|
*/
|
||||||
|
function getOption(name, defaultValue) {
|
||||||
|
var isArr = _.isArray(defaultValue);
|
||||||
|
return _.reduce(process.argv, function(result, value) {
|
||||||
|
if (isArr) {
|
||||||
|
value = optionToArray(name, value);
|
||||||
|
return _.isEmpty(value) ? result : value;
|
||||||
|
}
|
||||||
|
value = optionToValue(name, value);
|
||||||
|
|
||||||
|
return value == null ? result : value;
|
||||||
|
}, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if `value` is a job ID.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to check.
|
||||||
|
* @returns {boolean} Returns `true` if `value` is a job ID, else `false`.
|
||||||
|
*/
|
||||||
|
function isJobId(value) {
|
||||||
|
return reJobId.test(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes an inline message to standard output.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} [text=''] The text to log.
|
||||||
|
*/
|
||||||
|
function logInline(text) {
|
||||||
|
var blankLine = _.repeat(' ', _.size(prevLine));
|
||||||
|
prevLine = text = _.truncate(text, { 'length': 40 });
|
||||||
|
process.stdout.write(text + blankLine.slice(text.length) + '\r');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the wait throbber to standard output.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function logThrobber() {
|
||||||
|
logInline('Please wait' + _.repeat('.', (++waitCount % 3) + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a comma separated option value into an array.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the option to inspect.
|
||||||
|
* @param {string} string The options string.
|
||||||
|
* @returns {Array} Returns the new converted array.
|
||||||
|
*/
|
||||||
|
function optionToArray(name, string) {
|
||||||
|
return _.compact(_.invokeMap((optionToValue(name, string) || '').split(/, */), 'trim'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts the option value from an option string.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the option to inspect.
|
||||||
|
* @param {string} string The options string.
|
||||||
|
* @returns {string|undefined} Returns the option value, else `undefined`.
|
||||||
|
*/
|
||||||
|
function optionToValue(name, string) {
|
||||||
|
var result = string.match(RegExp('^' + name + '(?:=([\\s\\S]+))?$'));
|
||||||
|
if (result) {
|
||||||
|
result = _.result(result, 1);
|
||||||
|
result = result ? _.trim(result) : true;
|
||||||
|
}
|
||||||
|
if (result === 'false') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return result || undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `Job#remove` and `Tunnel#stop` callback used by `Jobs#restart`
|
||||||
|
* and `Tunnel#restart` respectively.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function onGenericRestart() {
|
||||||
|
this.restarting = false;
|
||||||
|
this.emit('restart');
|
||||||
|
this.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `request.put` and `SauceTunnel#stop` callback used by `Jobs#stop`
|
||||||
|
* and `Tunnel#stop` respectively.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} [error] The error object.
|
||||||
|
*/
|
||||||
|
function onGenericStop(error) {
|
||||||
|
this.running = this.stopping = false;
|
||||||
|
this.emit('stop', error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `request.del` callback used by `Jobs#remove`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function onJobRemove(error, res, body) {
|
||||||
|
this.id = this.taskId = this.url = null;
|
||||||
|
this.removing = false;
|
||||||
|
this.emit('remove');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `Job#remove` callback used by `Jobs#reset`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function onJobReset() {
|
||||||
|
this.attempts = 0;
|
||||||
|
this.failed = this.resetting = false;
|
||||||
|
this._pollerId = this.id = this.result = this.taskId = this.url = null;
|
||||||
|
this.emit('reset');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `request.post` callback used by `Jobs#start`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} [error] The error object.
|
||||||
|
* @param {Object} res The response data object.
|
||||||
|
* @param {Object} body The response body JSON object.
|
||||||
|
*/
|
||||||
|
function onJobStart(error, res, body) {
|
||||||
|
this.starting = false;
|
||||||
|
|
||||||
|
if (this.stopping) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var statusCode = _.result(res, 'statusCode'),
|
||||||
|
taskId = _.first(_.result(body, 'js tests'));
|
||||||
|
|
||||||
|
if (error || !taskId || statusCode != 200) {
|
||||||
|
if (this.attempts < this.retries) {
|
||||||
|
this.restart();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var na = 'unavailable',
|
||||||
|
bodyStr = _.isObject(body) ? '\n' + JSON.stringify(body) : na,
|
||||||
|
statusStr = _.isFinite(statusCode) ? statusCode : na;
|
||||||
|
|
||||||
|
logInline();
|
||||||
|
console.error('Failed to start job; status: %s, body: %s', statusStr, bodyStr);
|
||||||
|
if (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
this.failed = true;
|
||||||
|
this.emit('complete');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.running = true;
|
||||||
|
this.taskId = taskId;
|
||||||
|
this.timestamp = _.now();
|
||||||
|
this.emit('start');
|
||||||
|
this.status();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `request.post` callback used by `Job#status`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} [error] The error object.
|
||||||
|
* @param {Object} res The response data object.
|
||||||
|
* @param {Object} body The response body JSON object.
|
||||||
|
*/
|
||||||
|
function onJobStatus(error, res, body) {
|
||||||
|
this.checking = false;
|
||||||
|
|
||||||
|
if (!this.running || this.stopping) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var completed = _.result(body, 'completed', false),
|
||||||
|
data = _.first(_.result(body, 'js tests')),
|
||||||
|
elapsed = (_.now() - this.timestamp) / 1000,
|
||||||
|
jobId = _.result(data, 'job_id', null),
|
||||||
|
jobResult = _.result(data, 'result', null),
|
||||||
|
jobStatus = _.result(data, 'status', ''),
|
||||||
|
jobUrl = _.result(data, 'url', null),
|
||||||
|
expired = (elapsed >= queueTimeout && !_.includes(jobStatus, 'in progress')),
|
||||||
|
options = this.options,
|
||||||
|
platform = options.platforms[0];
|
||||||
|
|
||||||
|
if (_.isObject(jobResult)) {
|
||||||
|
var message = _.result(jobResult, 'message');
|
||||||
|
} else {
|
||||||
|
if (typeof jobResult == 'string') {
|
||||||
|
message = jobResult;
|
||||||
|
}
|
||||||
|
jobResult = null;
|
||||||
|
}
|
||||||
|
if (isJobId(jobId)) {
|
||||||
|
this.id = jobId;
|
||||||
|
this.result = jobResult;
|
||||||
|
this.url = jobUrl;
|
||||||
|
} else {
|
||||||
|
completed = false;
|
||||||
|
}
|
||||||
|
this.emit('status', jobStatus);
|
||||||
|
|
||||||
|
if (!completed && !expired) {
|
||||||
|
this._pollerId = _.delay(_.bind(this.status, this), this.statusInterval * 1000);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var description = browserName(platform[1]) + ' ' + platform[2] + ' on ' + capitalizeWords(platform[0]),
|
||||||
|
errored = !jobResult || !jobResult.passed || reError.test(message) || reError.test(jobStatus),
|
||||||
|
failures = _.result(jobResult, 'failed'),
|
||||||
|
label = options.name + ':',
|
||||||
|
tunnel = this.tunnel;
|
||||||
|
|
||||||
|
if (errored || failures) {
|
||||||
|
if (errored && this.attempts < this.retries) {
|
||||||
|
this.restart();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var details = 'See ' + jobUrl + ' for details.';
|
||||||
|
this.failed = true;
|
||||||
|
|
||||||
|
logInline();
|
||||||
|
if (failures) {
|
||||||
|
console.error(label + ' %s ' + chalk.red('failed') + ' %d test' + (failures > 1 ? 's' : '') + '. %s', description, failures, details);
|
||||||
|
}
|
||||||
|
else if (tunnel.attempts < tunnel.retries) {
|
||||||
|
tunnel.restart();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (typeof message == 'undefined') {
|
||||||
|
message = 'Results are unavailable. ' + details;
|
||||||
|
}
|
||||||
|
console.error(label, description, chalk.red('failed') + ';', message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
logInline();
|
||||||
|
console.log(label, description, chalk.green('passed'));
|
||||||
|
}
|
||||||
|
this.running = false;
|
||||||
|
this.emit('complete');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `SauceTunnel#start` callback used by `Tunnel#start`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {boolean} success The connection success indicator.
|
||||||
|
*/
|
||||||
|
function onTunnelStart(success) {
|
||||||
|
this.starting = false;
|
||||||
|
|
||||||
|
if (this._timeoutId) {
|
||||||
|
clearTimeout(this._timeoutId);
|
||||||
|
this._timeoutId = null;
|
||||||
|
}
|
||||||
|
if (!success) {
|
||||||
|
if (this.attempts < this.retries) {
|
||||||
|
this.restart();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
logInline();
|
||||||
|
console.error('Failed to open Sauce Connect tunnel');
|
||||||
|
process.exit(2);
|
||||||
|
}
|
||||||
|
logInline();
|
||||||
|
console.log('Sauce Connect tunnel opened');
|
||||||
|
|
||||||
|
var jobs = this.jobs;
|
||||||
|
push.apply(jobs.queue, jobs.all);
|
||||||
|
|
||||||
|
this.running = true;
|
||||||
|
this.emit('start');
|
||||||
|
|
||||||
|
console.log('Starting jobs...');
|
||||||
|
this.dequeue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Job constructor.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} [properties] The properties to initialize a job with.
|
||||||
|
*/
|
||||||
|
function Job(properties) {
|
||||||
|
EventEmitter.call(this);
|
||||||
|
|
||||||
|
this.options = {};
|
||||||
|
_.merge(this, properties);
|
||||||
|
_.defaults(this.options, _.cloneDeep(jobOptions));
|
||||||
|
|
||||||
|
this.attempts = 0;
|
||||||
|
this.checking = this.failed = this.removing = this.resetting = this.restarting = this.running = this.starting = this.stopping = false;
|
||||||
|
this._pollerId = this.id = this.result = this.taskId = this.url = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
util.inherits(Job, EventEmitter);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the job.
|
||||||
|
*
|
||||||
|
* @memberOf Job
|
||||||
|
* @param {Function} callback The function called once the job is removed.
|
||||||
|
* @param {Object} Returns the job instance.
|
||||||
|
*/
|
||||||
|
Job.prototype.remove = function(callback) {
|
||||||
|
this.once('remove', _.iteratee(callback));
|
||||||
|
if (this.removing) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this.removing = true;
|
||||||
|
return this.stop(function() {
|
||||||
|
var onRemove = _.bind(onJobRemove, this);
|
||||||
|
if (!this.id) {
|
||||||
|
_.defer(onRemove);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
request.del(_.template('https://saucelabs.com/rest/v1/${user}/jobs/${id}')(this), {
|
||||||
|
'auth': { 'user': this.user, 'pass': this.pass }
|
||||||
|
}, onRemove);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets the job.
|
||||||
|
*
|
||||||
|
* @memberOf Job
|
||||||
|
* @param {Function} callback The function called once the job is reset.
|
||||||
|
* @param {Object} Returns the job instance.
|
||||||
|
*/
|
||||||
|
Job.prototype.reset = function(callback) {
|
||||||
|
this.once('reset', _.iteratee(callback));
|
||||||
|
if (this.resetting) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this.resetting = true;
|
||||||
|
return this.remove(onJobReset);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restarts the job.
|
||||||
|
*
|
||||||
|
* @memberOf Job
|
||||||
|
* @param {Function} callback The function called once the job is restarted.
|
||||||
|
* @param {Object} Returns the job instance.
|
||||||
|
*/
|
||||||
|
Job.prototype.restart = function(callback) {
|
||||||
|
this.once('restart', _.iteratee(callback));
|
||||||
|
if (this.restarting) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this.restarting = true;
|
||||||
|
|
||||||
|
var options = this.options,
|
||||||
|
platform = options.platforms[0],
|
||||||
|
description = browserName(platform[1]) + ' ' + platform[2] + ' on ' + capitalizeWords(platform[0]),
|
||||||
|
label = options.name + ':';
|
||||||
|
|
||||||
|
logInline();
|
||||||
|
console.log('%s %s restart %d of %d', label, description, ++this.attempts, this.retries);
|
||||||
|
|
||||||
|
return this.remove(onGenericRestart);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts the job.
|
||||||
|
*
|
||||||
|
* @memberOf Job
|
||||||
|
* @param {Function} callback The function called once the job is started.
|
||||||
|
* @param {Object} Returns the job instance.
|
||||||
|
*/
|
||||||
|
Job.prototype.start = function(callback) {
|
||||||
|
this.once('start', _.iteratee(callback));
|
||||||
|
if (this.starting || this.running) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this.starting = true;
|
||||||
|
request.post(_.template('https://saucelabs.com/rest/v1/${user}/js-tests')(this), {
|
||||||
|
'auth': { 'user': this.user, 'pass': this.pass },
|
||||||
|
'json': this.options
|
||||||
|
}, _.bind(onJobStart, this));
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks the status of a job.
|
||||||
|
*
|
||||||
|
* @memberOf Job
|
||||||
|
* @param {Function} callback The function called once the status is resolved.
|
||||||
|
* @param {Object} Returns the job instance.
|
||||||
|
*/
|
||||||
|
Job.prototype.status = function(callback) {
|
||||||
|
this.once('status', _.iteratee(callback));
|
||||||
|
if (this.checking || this.removing || this.resetting || this.restarting || this.starting || this.stopping) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this._pollerId = null;
|
||||||
|
this.checking = true;
|
||||||
|
request.post(_.template('https://saucelabs.com/rest/v1/${user}/js-tests/status')(this), {
|
||||||
|
'auth': { 'user': this.user, 'pass': this.pass },
|
||||||
|
'json': { 'js tests': [this.taskId] }
|
||||||
|
}, _.bind(onJobStatus, this));
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stops the job.
|
||||||
|
*
|
||||||
|
* @memberOf Job
|
||||||
|
* @param {Function} callback The function called once the job is stopped.
|
||||||
|
* @param {Object} Returns the job instance.
|
||||||
|
*/
|
||||||
|
Job.prototype.stop = function(callback) {
|
||||||
|
this.once('stop', _.iteratee(callback));
|
||||||
|
if (this.stopping) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this.stopping = true;
|
||||||
|
if (this._pollerId) {
|
||||||
|
clearTimeout(this._pollerId);
|
||||||
|
this._pollerId = null;
|
||||||
|
this.checking = false;
|
||||||
|
}
|
||||||
|
var onStop = _.bind(onGenericStop, this);
|
||||||
|
if (!this.running || !this.id) {
|
||||||
|
_.defer(onStop);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
request.put(_.template('https://saucelabs.com/rest/v1/${user}/jobs/${id}/stop')(this), {
|
||||||
|
'auth': { 'user': this.user, 'pass': this.pass }
|
||||||
|
}, onStop);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Tunnel constructor.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} [properties] The properties to initialize the tunnel with.
|
||||||
|
*/
|
||||||
|
function Tunnel(properties) {
|
||||||
|
EventEmitter.call(this);
|
||||||
|
|
||||||
|
_.merge(this, properties);
|
||||||
|
|
||||||
|
var active = [],
|
||||||
|
queue = [];
|
||||||
|
|
||||||
|
var all = _.map(this.platforms, _.bind(function(platform) {
|
||||||
|
return new Job(_.merge({
|
||||||
|
'user': this.user,
|
||||||
|
'pass': this.pass,
|
||||||
|
'tunnel': this,
|
||||||
|
'options': { 'platforms': [platform] }
|
||||||
|
}, this.job));
|
||||||
|
}, this));
|
||||||
|
|
||||||
|
var completed = 0,
|
||||||
|
restarted = [],
|
||||||
|
success = true,
|
||||||
|
total = all.length,
|
||||||
|
tunnel = this;
|
||||||
|
|
||||||
|
_.invokeMap(all, 'on', 'complete', function() {
|
||||||
|
_.pull(active, this);
|
||||||
|
if (success) {
|
||||||
|
success = !this.failed;
|
||||||
|
}
|
||||||
|
if (++completed == total) {
|
||||||
|
tunnel.stop(_.partial(tunnel.emit, 'complete', success));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tunnel.dequeue();
|
||||||
|
});
|
||||||
|
|
||||||
|
_.invokeMap(all, 'on', 'restart', function() {
|
||||||
|
if (!_.includes(restarted, this)) {
|
||||||
|
restarted.push(this);
|
||||||
|
}
|
||||||
|
// Restart tunnel if all active jobs have restarted.
|
||||||
|
var threshold = Math.min(all.length, _.isFinite(throttled) ? throttled : 3);
|
||||||
|
if (tunnel.attempts < tunnel.retries &&
|
||||||
|
active.length >= threshold && _.isEmpty(_.difference(active, restarted))) {
|
||||||
|
tunnel.restart();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.on('restart', function() {
|
||||||
|
completed = 0;
|
||||||
|
success = true;
|
||||||
|
restarted.length = 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
this._timeoutId = null;
|
||||||
|
this.attempts = 0;
|
||||||
|
this.restarting = this.running = this.starting = this.stopping = false;
|
||||||
|
this.jobs = { 'active': active, 'all': all, 'queue': queue };
|
||||||
|
this.connection = new SauceTunnel(this.user, this.pass, this.id, this.tunneled, ['-P', '0']);
|
||||||
|
}
|
||||||
|
|
||||||
|
util.inherits(Tunnel, EventEmitter);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restarts the tunnel.
|
||||||
|
*
|
||||||
|
* @memberOf Tunnel
|
||||||
|
* @param {Function} callback The function called once the tunnel is restarted.
|
||||||
|
*/
|
||||||
|
Tunnel.prototype.restart = function(callback) {
|
||||||
|
this.once('restart', _.iteratee(callback));
|
||||||
|
if (this.restarting) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this.restarting = true;
|
||||||
|
|
||||||
|
logInline();
|
||||||
|
console.log('Tunnel %s: restart %d of %d', this.id, ++this.attempts, this.retries);
|
||||||
|
|
||||||
|
var jobs = this.jobs,
|
||||||
|
active = jobs.active,
|
||||||
|
all = jobs.all;
|
||||||
|
|
||||||
|
var reset = _.after(all.length, _.bind(this.stop, this, onGenericRestart)),
|
||||||
|
stop = _.after(active.length, _.partial(_.invokeMap, all, 'reset', reset));
|
||||||
|
|
||||||
|
if (_.isEmpty(active)) {
|
||||||
|
_.defer(stop);
|
||||||
|
}
|
||||||
|
if (_.isEmpty(all)) {
|
||||||
|
_.defer(reset);
|
||||||
|
}
|
||||||
|
_.invokeMap(active, 'stop', function() {
|
||||||
|
_.pull(active, this);
|
||||||
|
stop();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (this._timeoutId) {
|
||||||
|
clearTimeout(this._timeoutId);
|
||||||
|
this._timeoutId = null;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts the tunnel.
|
||||||
|
*
|
||||||
|
* @memberOf Tunnel
|
||||||
|
* @param {Function} callback The function called once the tunnel is started.
|
||||||
|
* @param {Object} Returns the tunnel instance.
|
||||||
|
*/
|
||||||
|
Tunnel.prototype.start = function(callback) {
|
||||||
|
this.once('start', _.iteratee(callback));
|
||||||
|
if (this.starting || this.running) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this.starting = true;
|
||||||
|
|
||||||
|
logInline();
|
||||||
|
console.log('Opening Sauce Connect tunnel...');
|
||||||
|
|
||||||
|
var onStart = _.bind(onTunnelStart, this);
|
||||||
|
if (this.timeout) {
|
||||||
|
this._timeoutId = _.delay(onStart, this.timeout * 1000, false);
|
||||||
|
}
|
||||||
|
this.connection.start(onStart);
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes jobs from the queue and starts them.
|
||||||
|
*
|
||||||
|
* @memberOf Tunnel
|
||||||
|
* @param {Object} Returns the tunnel instance.
|
||||||
|
*/
|
||||||
|
Tunnel.prototype.dequeue = function() {
|
||||||
|
var jobs = this.jobs,
|
||||||
|
active = jobs.active,
|
||||||
|
queue = jobs.queue,
|
||||||
|
throttled = this.throttled;
|
||||||
|
|
||||||
|
while (queue.length && (active.length < throttled)) {
|
||||||
|
active.push(queue.shift().start());
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stops the tunnel.
|
||||||
|
*
|
||||||
|
* @memberOf Tunnel
|
||||||
|
* @param {Function} callback The function called once the tunnel is stopped.
|
||||||
|
* @param {Object} Returns the tunnel instance.
|
||||||
|
*/
|
||||||
|
Tunnel.prototype.stop = function(callback) {
|
||||||
|
this.once('stop', _.iteratee(callback));
|
||||||
|
if (this.stopping) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this.stopping = true;
|
||||||
|
|
||||||
|
logInline();
|
||||||
|
console.log('Shutting down Sauce Connect tunnel...');
|
||||||
|
|
||||||
|
var jobs = this.jobs,
|
||||||
|
active = jobs.active;
|
||||||
|
|
||||||
|
var stop = _.after(active.length, _.bind(function() {
|
||||||
|
var onStop = _.bind(onGenericStop, this);
|
||||||
|
if (this.running) {
|
||||||
|
this.connection.stop(onStop);
|
||||||
|
} else {
|
||||||
|
onStop();
|
||||||
|
}
|
||||||
|
}, this));
|
||||||
|
|
||||||
|
jobs.queue.length = 0;
|
||||||
|
if (_.isEmpty(active)) {
|
||||||
|
_.defer(stop);
|
||||||
|
}
|
||||||
|
_.invokeMap(active, 'stop', function() {
|
||||||
|
_.pull(active, this);
|
||||||
|
stop();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (this._timeoutId) {
|
||||||
|
clearTimeout(this._timeoutId);
|
||||||
|
this._timeoutId = null;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// Cleanup any inline logs when exited via `ctrl+c`.
|
||||||
|
process.on('SIGINT', function() {
|
||||||
|
logInline();
|
||||||
|
process.exit();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create a web server for the current working directory.
|
||||||
|
http.createServer(function(req, res) {
|
||||||
|
// See http://msdn.microsoft.com/en-us/library/ff955275(v=vs.85).aspx.
|
||||||
|
if (compatMode && path.extname(url.parse(req.url).pathname) == '.html') {
|
||||||
|
res.setHeader('X-UA-Compatible', 'IE=' + compatMode);
|
||||||
|
}
|
||||||
|
mount(req, res);
|
||||||
|
}).listen(port);
|
||||||
|
|
||||||
|
// Setup Sauce Connect so we can use this server from Sauce Labs.
|
||||||
|
var tunnel = new Tunnel({
|
||||||
|
'user': username,
|
||||||
|
'pass': accessKey,
|
||||||
|
'id': tunnelId,
|
||||||
|
'job': { 'retries': maxJobRetries, 'statusInterval': statusInterval },
|
||||||
|
'platforms': platforms,
|
||||||
|
'retries': maxTunnelRetries,
|
||||||
|
'throttled': throttled,
|
||||||
|
'tunneled': tunneled,
|
||||||
|
'timeout': tunnelTimeout
|
||||||
|
});
|
||||||
|
|
||||||
|
tunnel.on('complete', function(success) {
|
||||||
|
process.exit(success ? 0 : 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
tunnel.start();
|
||||||
|
|
||||||
|
setInterval(logThrobber, throbberDelay);
|
||||||
1473
test/test-fp.js
Normal file
1473
test/test-fp.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,90 +0,0 @@
|
|||||||
;(function(window) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/** `QUnit.addEvent` shortcut */
|
|
||||||
var addEvent = QUnit.addEvent;
|
|
||||||
|
|
||||||
/** The Lo-Dash build to load */
|
|
||||||
var build = (/build=([^&]+)/.exec(location.search) || [])[1];
|
|
||||||
|
|
||||||
/** A flag to determine if RequireJS should be loaded */
|
|
||||||
var norequire = /[?&]norequire=true(?:&|$)/.test(location.search);
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// assign `QUnit.config` properties
|
|
||||||
QUnit.config.lodashFilename = (function() {
|
|
||||||
switch (build) {
|
|
||||||
case 'prod': return 'lodash.min';
|
|
||||||
case 'custom': return 'lodash.custom.min';
|
|
||||||
case 'custom-debug': return 'lodash.custom';
|
|
||||||
}
|
|
||||||
return 'lodash';
|
|
||||||
}());
|
|
||||||
|
|
||||||
// assign `QUnit.urlParams` properties
|
|
||||||
QUnit.extend(QUnit.urlParams, {
|
|
||||||
'build': build,
|
|
||||||
'norequire': norequire
|
|
||||||
});
|
|
||||||
|
|
||||||
// initialize the build dropdown
|
|
||||||
addEvent(window, 'load', function() {
|
|
||||||
function eventHandler(event) {
|
|
||||||
var search = location.search.replace(/^\?|&?(?:build|norequire)=[^&]*&?/g, '');
|
|
||||||
if (event.stopPropagation) {
|
|
||||||
event.stopPropagation();
|
|
||||||
} else {
|
|
||||||
event.cancelBubble = true;
|
|
||||||
}
|
|
||||||
location.href =
|
|
||||||
location.href.split('?')[0] + '?' +
|
|
||||||
(search ? search + '&' : '') + 'build=' +
|
|
||||||
dropdown[dropdown.selectedIndex].value +
|
|
||||||
(checkbox.checked ? '&norequire=true' : '');
|
|
||||||
}
|
|
||||||
|
|
||||||
function init() {
|
|
||||||
var toolbar = document.getElementById('qunit-testrunner-toolbar');
|
|
||||||
if (toolbar) {
|
|
||||||
toolbar.appendChild(label1);
|
|
||||||
toolbar.appendChild(label2);
|
|
||||||
|
|
||||||
dropdown.selectedIndex = (function() {
|
|
||||||
switch (build) {
|
|
||||||
case 'prod': return 1;
|
|
||||||
case 'custom': return 2;
|
|
||||||
case 'custom-debug': return 3;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}());
|
|
||||||
|
|
||||||
checkbox.checked = norequire;
|
|
||||||
addEvent(checkbox, 'click', eventHandler);
|
|
||||||
addEvent(dropdown, 'change', eventHandler);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
setTimeout(init, 15);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var label1 = document.createElement('label');
|
|
||||||
label1.innerHTML =
|
|
||||||
'<input name="norequire" type="checkbox">No RequireJS';
|
|
||||||
|
|
||||||
var label2 = document.createElement('label');
|
|
||||||
label2.innerHTML = ' ' +
|
|
||||||
'<select name="build">' +
|
|
||||||
'<option value="dev">Developement</option>' +
|
|
||||||
'<option value="prod">Production</option>' +
|
|
||||||
'<option value="custom">Custom</option>' +
|
|
||||||
'<option value="custom-debug">Custom (debug)</option>' +
|
|
||||||
'</select> Build';
|
|
||||||
|
|
||||||
var checkbox = label1.firstChild,
|
|
||||||
dropdown = label2.getElementsByTagName('select')[0];
|
|
||||||
|
|
||||||
init();
|
|
||||||
});
|
|
||||||
|
|
||||||
}(this));
|
|
||||||
24594
test/test.js
24594
test/test.js
File diff suppressed because it is too large
Load Diff
@@ -1,42 +1,480 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>Underscore Test Suite</title>
|
<title>Underscore Test Suite</title>
|
||||||
<link rel="stylesheet" href="../vendor/underscore/test/vendor/qunit.css">
|
<link rel="stylesheet" href="../node_modules/qunitjs/qunit/qunit.css">
|
||||||
<style>
|
</head>
|
||||||
#jslitmus, iframe {
|
<body>
|
||||||
display: none;
|
<div id="qunit"></div>
|
||||||
}
|
<script>
|
||||||
</style>
|
// Avoid reporting tests to Sauce Labs when script errors occur.
|
||||||
</head>
|
if (location.port == '9001') {
|
||||||
<body>
|
window.onerror = function(message) {
|
||||||
<div id="qunit"></div>
|
if (window.QUnit) {
|
||||||
<div id="qunit-fixture">
|
QUnit.config.done.length = 0;
|
||||||
<div id="map-test">
|
}
|
||||||
<div id="id1"></div>
|
global_test_results = { 'message': message };
|
||||||
<div id="id2"></div>
|
};
|
||||||
</div>
|
}
|
||||||
</div>
|
</script>
|
||||||
<script src="../vendor/backbone/test/vendor/json2.js"></script>
|
<script src="../node_modules/qunitjs/qunit/qunit.js"></script>
|
||||||
<script src="../vendor/underscore/test/vendor/jquery.js"></script>
|
<script src="../node_modules/qunit-extras/qunit-extras.js"></script>
|
||||||
<script src="../vendor/underscore/test/vendor/qunit.js"></script>
|
<script src="../node_modules/jquery/dist/jquery.js"></script>
|
||||||
<script src="../vendor/underscore/test/vendor/jslitmus.js"></script>
|
<script src="../node_modules/platform/platform.js"></script>
|
||||||
<script src="test-ui.js"></script>
|
<script src="./asset/test-ui.js"></script>
|
||||||
<script>
|
<script src="../lodash.js"></script>
|
||||||
document.write('<script src="../' + QUnit.config.lodashFilename + '.js"><\/script>');
|
<script>
|
||||||
</script>
|
QUnit.config.asyncRetries = 10;
|
||||||
<script src="../vendor/underscore/test/collections.js"></script>
|
QUnit.config.hidepassed = true;
|
||||||
<script src="../vendor/underscore/test/arrays.js"></script>
|
QUnit.config.excused = {
|
||||||
<script src="../vendor/underscore/test/functions.js"></script>
|
'Arrays': {
|
||||||
<script src="../vendor/underscore/test/objects.js"></script>
|
'difference': [
|
||||||
<script src="../vendor/underscore/test/utility.js"></script>
|
'can perform an OO-style difference'
|
||||||
<script src="../vendor/underscore/test/chaining.js"></script>
|
],
|
||||||
<script type="text/html" id="template">
|
'drop': [
|
||||||
<%
|
'is an alias for rest'
|
||||||
// a comment
|
],
|
||||||
if (data) { data += 12345; }; %>
|
'first': [
|
||||||
<li><%= data %></li>
|
'returns an empty array when n <= 0 (0 case)',
|
||||||
</script>
|
'returns an empty array when n <= 0 (negative case)',
|
||||||
</body>
|
'can fetch the first n elements',
|
||||||
|
'returns the whole array if n > length'
|
||||||
|
],
|
||||||
|
'findIndex': [
|
||||||
|
'called with context'
|
||||||
|
],
|
||||||
|
'findLastIndex': [
|
||||||
|
'called with context'
|
||||||
|
],
|
||||||
|
'flatten': [
|
||||||
|
'supports empty arrays',
|
||||||
|
'can flatten nested arrays',
|
||||||
|
'works on an arguments object',
|
||||||
|
'can handle very deep arrays'
|
||||||
|
],
|
||||||
|
'head': [
|
||||||
|
'is an alias for first'
|
||||||
|
],
|
||||||
|
'indexOf': [
|
||||||
|
"sorted indexOf doesn't uses binary search",
|
||||||
|
'0'
|
||||||
|
],
|
||||||
|
'initial': [
|
||||||
|
'returns all but the last n elements',
|
||||||
|
'returns an empty array when n > length',
|
||||||
|
'works on an arguments object'
|
||||||
|
],
|
||||||
|
'intersection': [
|
||||||
|
'can perform an OO-style intersection'
|
||||||
|
],
|
||||||
|
'last': [
|
||||||
|
'returns an empty array when n <= 0 (0 case)',
|
||||||
|
'returns an empty array when n <= 0 (negative case)',
|
||||||
|
'can fetch the last n elements',
|
||||||
|
'returns the whole array if n > length'
|
||||||
|
],
|
||||||
|
'lastIndexOf': [
|
||||||
|
'should treat falsey `fromIndex` values, except `0` and `NaN`, as `array.length`',
|
||||||
|
'should treat non-number `fromIndex` values as `array.length`',
|
||||||
|
'[0,-1,-1]'
|
||||||
|
],
|
||||||
|
'object': [
|
||||||
|
'an array of pairs zipped together into an object',
|
||||||
|
'an object converted to pairs and back to an object'
|
||||||
|
],
|
||||||
|
'range': [
|
||||||
|
'range with two arguments a & b, b<a generates an empty array'
|
||||||
|
],
|
||||||
|
'rest': [
|
||||||
|
'returns the whole array when index is 0',
|
||||||
|
'returns elements starting at the given index',
|
||||||
|
'works on an arguments object'
|
||||||
|
],
|
||||||
|
'sortedIndex': [
|
||||||
|
'2',
|
||||||
|
'3'
|
||||||
|
],
|
||||||
|
'tail': [
|
||||||
|
'is an alias for rest'
|
||||||
|
],
|
||||||
|
'take': [
|
||||||
|
'is an alias for first'
|
||||||
|
],
|
||||||
|
'uniq': [
|
||||||
|
'uses the result of `iterator` for uniqueness comparisons (unsorted case)',
|
||||||
|
'`sorted` argument defaults to false when omitted',
|
||||||
|
'when `iterator` is a string, uses that key for comparisons (unsorted case)',
|
||||||
|
'uses the result of `iterator` for uniqueness comparisons (sorted case)',
|
||||||
|
'when `iterator` is a string, uses that key for comparisons (sorted case)',
|
||||||
|
'can use falsey pluck like iterator'
|
||||||
|
],
|
||||||
|
'union': [
|
||||||
|
'can perform an OO-style union'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
'Chaining': {
|
||||||
|
'pop': true,
|
||||||
|
'shift': true,
|
||||||
|
'splice': true,
|
||||||
|
'reverse/concat/unshift/pop/map': [
|
||||||
|
'can chain together array functions.'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
'Collections': {
|
||||||
|
'lookupIterator with contexts': true,
|
||||||
|
'Iterating objects with sketchy length properties': true,
|
||||||
|
'Resistant to collection length and properties changing while iterating': true,
|
||||||
|
'countBy': [
|
||||||
|
'true'
|
||||||
|
],
|
||||||
|
'each': [
|
||||||
|
'context object property accessed'
|
||||||
|
],
|
||||||
|
'every': [
|
||||||
|
'Can be called with object',
|
||||||
|
'Died on test #15',
|
||||||
|
'context works'
|
||||||
|
],
|
||||||
|
'filter': [
|
||||||
|
'given context',
|
||||||
|
'[{"a":1,"b":2},{"a":1,"b":3},{"a":1,"b":4}]',
|
||||||
|
'[{"a":1,"b":2},{"a":2,"b":2}]',
|
||||||
|
'Empty object accepts all items',
|
||||||
|
'OO-filter'
|
||||||
|
],
|
||||||
|
'find': [
|
||||||
|
'{"a":1,"b":4}',
|
||||||
|
'undefined when not found',
|
||||||
|
'undefined when searching empty list',
|
||||||
|
'works on objects',
|
||||||
|
'undefined',
|
||||||
|
'called with context'
|
||||||
|
],
|
||||||
|
'findWhere': [
|
||||||
|
'checks properties given function'
|
||||||
|
],
|
||||||
|
'groupBy': [
|
||||||
|
'true'
|
||||||
|
],
|
||||||
|
'includes': [
|
||||||
|
"doesn't delegate to binary search"
|
||||||
|
],
|
||||||
|
'invoke': [
|
||||||
|
'handles null & undefined'
|
||||||
|
],
|
||||||
|
'map': [
|
||||||
|
'tripled numbers with context',
|
||||||
|
'OO-style doubled numbers'
|
||||||
|
],
|
||||||
|
'max': [
|
||||||
|
'can handle null/undefined',
|
||||||
|
'can perform a computation-based max',
|
||||||
|
'Maximum value of an empty object',
|
||||||
|
'Maximum value of an empty array',
|
||||||
|
'Maximum value of a non-numeric collection',
|
||||||
|
'Finds correct max in array starting with num and containing a NaN',
|
||||||
|
'Finds correct max in array starting with NaN',
|
||||||
|
'Respects iterator return value of -Infinity',
|
||||||
|
'String keys use property iterator',
|
||||||
|
'Iterator context',
|
||||||
|
'Lookup falsy iterator'
|
||||||
|
],
|
||||||
|
'min': [
|
||||||
|
'can handle null/undefined',
|
||||||
|
'can perform a computation-based min',
|
||||||
|
'Minimum value of an empty object',
|
||||||
|
'Minimum value of an empty array',
|
||||||
|
'Minimum value of a non-numeric collection',
|
||||||
|
'Finds correct min in array starting with NaN',
|
||||||
|
'Respects iterator return value of Infinity',
|
||||||
|
'String keys use property iterator',
|
||||||
|
'Iterator context',
|
||||||
|
'Lookup falsy iterator'
|
||||||
|
],
|
||||||
|
'partition': [
|
||||||
|
'can reference the array index',
|
||||||
|
'Died on test #8',
|
||||||
|
'partition takes a context argument',
|
||||||
|
'function(a){[code]}'
|
||||||
|
],
|
||||||
|
'pluck': [
|
||||||
|
'[1]'
|
||||||
|
],
|
||||||
|
'reduce': [
|
||||||
|
'can reduce with a context object'
|
||||||
|
],
|
||||||
|
'reject': [
|
||||||
|
'Returns empty list given empty array'
|
||||||
|
],
|
||||||
|
'sample': [
|
||||||
|
'behaves correctly on negative n',
|
||||||
|
'Died on test #3'
|
||||||
|
],
|
||||||
|
'some': [
|
||||||
|
'Can be called with object',
|
||||||
|
'Died on test #17',
|
||||||
|
'context works'
|
||||||
|
],
|
||||||
|
'where': [
|
||||||
|
'checks properties given function'
|
||||||
|
],
|
||||||
|
'Can use various collection methods on NodeLists': [
|
||||||
|
'<span id="id2"></span>',
|
||||||
|
'<span id="id1"></span>'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
'Functions': {
|
||||||
|
'debounce asap': true,
|
||||||
|
'debounce asap cancel': true,
|
||||||
|
'debounce after system time is set backwards': true,
|
||||||
|
'debounce asap recursively': true,
|
||||||
|
'throttle repeatedly with results': true,
|
||||||
|
'more throttle does not trigger leading call when leading is set to false': true,
|
||||||
|
'throttle does not trigger trailing call when trailing is set to false': true,
|
||||||
|
'before': [
|
||||||
|
'stores a memo to the last value',
|
||||||
|
'provides context'
|
||||||
|
],
|
||||||
|
'bind': [
|
||||||
|
'Died on test #2'
|
||||||
|
],
|
||||||
|
'bindAll': [
|
||||||
|
'throws an error for bindAll with no functions named'
|
||||||
|
],
|
||||||
|
'memoize': [
|
||||||
|
'{"bar":"BAR","foo":"FOO"}',
|
||||||
|
'Died on test #8'
|
||||||
|
],
|
||||||
|
'partial':[
|
||||||
|
'can partially apply with placeholders',
|
||||||
|
'accepts more arguments than the number of placeholders',
|
||||||
|
'accepts fewer arguments than the number of placeholders',
|
||||||
|
'unfilled placeholders are undefined',
|
||||||
|
'keeps prototype',
|
||||||
|
'allows the placeholder to be swapped out'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
'Objects': {
|
||||||
|
'#1929 Typed Array constructors are functions': true,
|
||||||
|
'allKeys': [
|
||||||
|
'is not fooled by sparse arrays; see issue #95',
|
||||||
|
'is not fooled by sparse arrays with additional properties',
|
||||||
|
'[]'
|
||||||
|
],
|
||||||
|
'defaults': [
|
||||||
|
'defaults skips nulls',
|
||||||
|
'defaults skips undefined'
|
||||||
|
],
|
||||||
|
'extend': [
|
||||||
|
'extending null results in null',
|
||||||
|
'extending undefined results in undefined'
|
||||||
|
],
|
||||||
|
'extendOwn': [
|
||||||
|
'extending non-objects results in returning the non-object value',
|
||||||
|
'extending undefined results in undefined'
|
||||||
|
],
|
||||||
|
'functions': [
|
||||||
|
'also looks up functions on the prototype'
|
||||||
|
],
|
||||||
|
'isEqual': [
|
||||||
|
'`0` is not equal to `-0`',
|
||||||
|
'Commutative equality is implemented for `0` and `-0`',
|
||||||
|
'`new Number(0)` and `-0` are not equal',
|
||||||
|
'Commutative equality is implemented for `new Number(0)` and `-0`',
|
||||||
|
'false'
|
||||||
|
],
|
||||||
|
'isFinite': [
|
||||||
|
'Numeric strings are numbers',
|
||||||
|
'Number instances can be finite'
|
||||||
|
],
|
||||||
|
'isMatch': [
|
||||||
|
'doesnt falsey match constructor on undefined/null'
|
||||||
|
],
|
||||||
|
'findKey': [
|
||||||
|
'called with context'
|
||||||
|
],
|
||||||
|
'keys': [
|
||||||
|
'is not fooled by sparse arrays; see issue #95',
|
||||||
|
'[]'
|
||||||
|
],
|
||||||
|
'mapObject': [
|
||||||
|
'keep context',
|
||||||
|
'called with context',
|
||||||
|
'mapValue identity'
|
||||||
|
],
|
||||||
|
'matcher': [
|
||||||
|
'null matches null',
|
||||||
|
'treats primitives as empty'
|
||||||
|
],
|
||||||
|
'omit': [
|
||||||
|
'can accept a predicate',
|
||||||
|
'function is given context'
|
||||||
|
],
|
||||||
|
'pick': [
|
||||||
|
'can accept a predicate and context',
|
||||||
|
'function is given context'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
'Utility': {
|
||||||
|
'noConflict (node vm)': true,
|
||||||
|
'now': [
|
||||||
|
'Produces the correct time in milliseconds'
|
||||||
|
],
|
||||||
|
'times': [
|
||||||
|
'works as a wrapper'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var mixinPrereqs = (function() {
|
||||||
|
var aliasToReal = {
|
||||||
|
'all': 'every',
|
||||||
|
'allKeys': 'keysIn',
|
||||||
|
'any': 'some',
|
||||||
|
'collect': 'map',
|
||||||
|
'compose': 'flowRight',
|
||||||
|
'contains': 'includes',
|
||||||
|
'detect': 'find',
|
||||||
|
'extendOwn': 'assign',
|
||||||
|
'findWhere': 'find',
|
||||||
|
'foldl': 'reduce',
|
||||||
|
'foldr': 'reduceRight',
|
||||||
|
'include': 'includes',
|
||||||
|
'indexBy': 'keyBy',
|
||||||
|
'inject': 'reduce',
|
||||||
|
'invoke': 'invokeMap',
|
||||||
|
'mapObject': 'mapValues',
|
||||||
|
'matcher': 'matches',
|
||||||
|
'methods': 'functions',
|
||||||
|
'object': 'zipObject',
|
||||||
|
'pairs': 'toPairs',
|
||||||
|
'pluck': 'map',
|
||||||
|
'restParam': 'restArgs',
|
||||||
|
'select': 'filter',
|
||||||
|
'unique': 'uniq',
|
||||||
|
'where': 'filter'
|
||||||
|
};
|
||||||
|
|
||||||
|
var keyMap = {
|
||||||
|
'rest': 'tail',
|
||||||
|
'restArgs': 'rest'
|
||||||
|
};
|
||||||
|
|
||||||
|
var lodash = _.noConflict();
|
||||||
|
|
||||||
|
return function(_) {
|
||||||
|
lodash.defaultsDeep(_, { 'templateSettings': lodash.templateSettings });
|
||||||
|
lodash.mixin(_, lodash.pick(lodash, lodash.difference(lodash.functions(lodash), lodash.functions(_))));
|
||||||
|
|
||||||
|
lodash.forOwn(keyMap, function(realName, otherName) {
|
||||||
|
_[otherName] = lodash[realName];
|
||||||
|
_.prototype[otherName] = lodash.prototype[realName];
|
||||||
|
});
|
||||||
|
|
||||||
|
lodash.forOwn(aliasToReal, function(realName, alias) {
|
||||||
|
_[alias] = _[realName];
|
||||||
|
_.prototype[alias] = _.prototype[realName];
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}());
|
||||||
|
|
||||||
|
// Only excuse in Sauce Labs.
|
||||||
|
if (!ui.isSauceLabs) {
|
||||||
|
delete QUnit.config.excused.Functions['throttle repeatedly with results'];
|
||||||
|
delete QUnit.config.excused.Functions['more throttle does not trigger leading call when leading is set to false'];
|
||||||
|
delete QUnit.config.excused.Functions['throttle does not trigger trailing call when trailing is set to false'];
|
||||||
|
delete QUnit.config.excused.Utility.now;
|
||||||
|
}
|
||||||
|
// Load prerequisite scripts.
|
||||||
|
document.write(ui.urlParams.loader == 'none'
|
||||||
|
? '<script src="' + ui.buildPath + '"><\/script>'
|
||||||
|
: '<script data-dojo-config="async:1" src="' + ui.loaderPath + '"><\/script>'
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
if (ui.urlParams.loader == 'none') {
|
||||||
|
mixinPrereqs(_);
|
||||||
|
document.write([
|
||||||
|
'<script src="../vendor/underscore/test/collections.js"><\/script>',
|
||||||
|
'<script src="../vendor/underscore/test/arrays.js"><\/script>',
|
||||||
|
'<script src="../vendor/underscore/test/functions.js"><\/script>',
|
||||||
|
'<script src="../vendor/underscore/test/objects.js"><\/script>',
|
||||||
|
'<script src="../vendor/underscore/test/cross-document.js"><\/script>',
|
||||||
|
'<script src="../vendor/underscore/test/utility.js"><\/script>',
|
||||||
|
'<script src="../vendor/underscore/test/chaining.js"><\/script>'
|
||||||
|
].join('\n'));
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
(function() {
|
||||||
|
if (window.curl) {
|
||||||
|
curl.config({ 'apiName': 'require' });
|
||||||
|
}
|
||||||
|
if (!window.require) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Wrap to work around tests assuming Node `require` use.
|
||||||
|
require = (function(func) {
|
||||||
|
return function() {
|
||||||
|
return arguments[0] === '..' ? window._ : func.apply(null, arguments);
|
||||||
|
};
|
||||||
|
}(require));
|
||||||
|
|
||||||
|
var reBasename = /[\w.-]+$/,
|
||||||
|
basePath = ('//' + location.host + location.pathname.replace(reBasename, '')).replace(/\btest\/$/, ''),
|
||||||
|
modulePath = ui.buildPath.replace(/\.js$/, ''),
|
||||||
|
locationPath = modulePath.replace(reBasename, '').replace(/^\/|\/$/g, ''),
|
||||||
|
moduleId = /\bunderscore\b/i.test(ui.buildPath) ? 'underscore' : 'lodash',
|
||||||
|
moduleMain = modulePath.match(reBasename)[0],
|
||||||
|
uid = +new Date;
|
||||||
|
|
||||||
|
function getConfig() {
|
||||||
|
var result = {
|
||||||
|
'baseUrl': './',
|
||||||
|
'urlArgs': 't=' + uid++,
|
||||||
|
'waitSeconds': 0,
|
||||||
|
'paths': {},
|
||||||
|
'packages': [{
|
||||||
|
'name': 'test',
|
||||||
|
'location': '../vendor/underscore/test',
|
||||||
|
'config': {
|
||||||
|
// Work around no global being exported.
|
||||||
|
'exports': 'QUnit',
|
||||||
|
'loader': 'curl/loader/legacy'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
if (ui.isModularize) {
|
||||||
|
result.packages.push({
|
||||||
|
'name': moduleId,
|
||||||
|
'location': locationPath,
|
||||||
|
'main': moduleMain
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
result.paths[moduleId] = modulePath;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QUnit.config.autostart = false;
|
||||||
|
|
||||||
|
require(getConfig(), [moduleId], function(lodash) {
|
||||||
|
mixinPrereqs(lodash);
|
||||||
|
require(getConfig(), [
|
||||||
|
'test/collections',
|
||||||
|
'test/arrays',
|
||||||
|
'test/functions',
|
||||||
|
'test/objects',
|
||||||
|
'test/cross-document',
|
||||||
|
'test/utility',
|
||||||
|
'test/chaining'
|
||||||
|
], function() {
|
||||||
|
QUnit.start();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}());
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
2
vendor/backbone/LICENSE
vendored
2
vendor/backbone/LICENSE
vendored
@@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2010-2012 Jeremy Ashkenas, DocumentCloud
|
Copyright (c) 2010-2016 Jeremy Ashkenas, DocumentCloud
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
Permission is hereby granted, free of charge, to any person
|
||||||
obtaining a copy of this software and associated documentation
|
obtaining a copy of this software and associated documentation
|
||||||
|
|||||||
26
vendor/backbone/README.md
vendored
26
vendor/backbone/README.md
vendored
@@ -1,26 +0,0 @@
|
|||||||
____ __ __
|
|
||||||
/\ _`\ /\ \ /\ \ __
|
|
||||||
\ \ \ \ \ __ ___\ \ \/'\\ \ \____ ___ ___ __ /\_\ ____
|
|
||||||
\ \ _ <' /'__`\ /'___\ \ , < \ \ '__`\ / __`\ /' _ `\ /'__`\ \/\ \ /',__\
|
|
||||||
\ \ \ \ \/\ \ \.\_/\ \__/\ \ \\`\\ \ \ \ \/\ \ \ \/\ \/\ \/\ __/ __ \ \ \/\__, `\
|
|
||||||
\ \____/\ \__/.\_\ \____\\ \_\ \_\ \_,__/\ \____/\ \_\ \_\ \____\/\_\_\ \ \/\____/
|
|
||||||
\/___/ \/__/\/_/\/____/ \/_/\/_/\/___/ \/___/ \/_/\/_/\/____/\/_/\ \_\ \/___/
|
|
||||||
\ \____/
|
|
||||||
\/___/
|
|
||||||
(_'_______________________________________________________________________________'_)
|
|
||||||
(_.———————————————————————————————————————————————————————————————————————————————._)
|
|
||||||
|
|
||||||
|
|
||||||
Backbone supplies structure to JavaScript-heavy applications by providing models key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing application over a RESTful JSON interface.
|
|
||||||
|
|
||||||
For Docs, License, Tests, pre-packed downloads, and everything else, really, see:
|
|
||||||
http://backbonejs.org
|
|
||||||
|
|
||||||
To suggest a feature, report a bug, or general discussion:
|
|
||||||
http://github.com/documentcloud/backbone/issues/
|
|
||||||
|
|
||||||
All contributors are listed here:
|
|
||||||
http://github.com/documentcloud/backbone/contributors
|
|
||||||
|
|
||||||
Special thanks to Robert Kieffer for the original philosophy behind Backbone.
|
|
||||||
http://github.com/broofa
|
|
||||||
2411
vendor/backbone/backbone.js
vendored
2411
vendor/backbone/backbone.js
vendored
File diff suppressed because it is too large
Load Diff
2155
vendor/backbone/test/collection.js
vendored
2155
vendor/backbone/test/collection.js
vendored
File diff suppressed because it is too large
Load Diff
648
vendor/backbone/test/events.js
vendored
648
vendor/backbone/test/events.js
vendored
@@ -1,79 +1,394 @@
|
|||||||
$(document).ready(function() {
|
(function() {
|
||||||
|
|
||||||
module("Backbone.Events");
|
QUnit.module('Backbone.Events');
|
||||||
|
|
||||||
test("Events: on and trigger", 2, function() {
|
QUnit.test('on and trigger', function(assert) {
|
||||||
var obj = { counter: 0 };
|
assert.expect(2);
|
||||||
_.extend(obj,Backbone.Events);
|
var obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
obj.on('event', function() { obj.counter += 1; });
|
obj.on('event', function() { obj.counter += 1; });
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
equal(obj.counter,1,'counter should be incremented.');
|
assert.equal(obj.counter, 1, 'counter should be incremented.');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
equal(obj.counter, 5, 'counter should be incremented five times.');
|
assert.equal(obj.counter, 5, 'counter should be incremented five times.');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: binding and triggering multiple events", 4, function() {
|
QUnit.test('binding and triggering multiple events', function(assert) {
|
||||||
var obj = { counter: 0 };
|
assert.expect(4);
|
||||||
_.extend(obj,Backbone.Events);
|
var obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
|
||||||
obj.on('a b c', function() { obj.counter += 1; });
|
obj.on('a b c', function() { obj.counter += 1; });
|
||||||
|
|
||||||
obj.trigger('a');
|
obj.trigger('a');
|
||||||
equal(obj.counter, 1);
|
assert.equal(obj.counter, 1);
|
||||||
|
|
||||||
obj.trigger('a b');
|
obj.trigger('a b');
|
||||||
equal(obj.counter, 3);
|
assert.equal(obj.counter, 3);
|
||||||
|
|
||||||
obj.trigger('c');
|
obj.trigger('c');
|
||||||
equal(obj.counter, 4);
|
assert.equal(obj.counter, 4);
|
||||||
|
|
||||||
obj.off('a c');
|
obj.off('a c');
|
||||||
obj.trigger('a b c');
|
obj.trigger('a b c');
|
||||||
equal(obj.counter, 5);
|
assert.equal(obj.counter, 5);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: trigger all for each event", 3, function() {
|
QUnit.test('binding and triggering with event maps', function(assert) {
|
||||||
var a, b, obj = { counter: 0 };
|
var obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
|
||||||
|
var increment = function() {
|
||||||
|
this.counter += 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
obj.on({
|
||||||
|
a: increment,
|
||||||
|
b: increment,
|
||||||
|
c: increment
|
||||||
|
}, obj);
|
||||||
|
|
||||||
|
obj.trigger('a');
|
||||||
|
assert.equal(obj.counter, 1);
|
||||||
|
|
||||||
|
obj.trigger('a b');
|
||||||
|
assert.equal(obj.counter, 3);
|
||||||
|
|
||||||
|
obj.trigger('c');
|
||||||
|
assert.equal(obj.counter, 4);
|
||||||
|
|
||||||
|
obj.off({
|
||||||
|
a: increment,
|
||||||
|
c: increment
|
||||||
|
}, obj);
|
||||||
|
obj.trigger('a b c');
|
||||||
|
assert.equal(obj.counter, 5);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('binding and triggering multiple event names with event maps', function(assert) {
|
||||||
|
var obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
|
||||||
|
var increment = function() {
|
||||||
|
this.counter += 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
obj.on({
|
||||||
|
'a b c': increment
|
||||||
|
});
|
||||||
|
|
||||||
|
obj.trigger('a');
|
||||||
|
assert.equal(obj.counter, 1);
|
||||||
|
|
||||||
|
obj.trigger('a b');
|
||||||
|
assert.equal(obj.counter, 3);
|
||||||
|
|
||||||
|
obj.trigger('c');
|
||||||
|
assert.equal(obj.counter, 4);
|
||||||
|
|
||||||
|
obj.off({
|
||||||
|
'a c': increment
|
||||||
|
});
|
||||||
|
obj.trigger('a b c');
|
||||||
|
assert.equal(obj.counter, 5);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('binding and trigger with event maps context', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var obj = {counter: 0};
|
||||||
|
var context = {};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
|
||||||
|
obj.on({
|
||||||
|
a: function() {
|
||||||
|
assert.strictEqual(this, context, 'defaults `context` to `callback` param');
|
||||||
|
}
|
||||||
|
}, context).trigger('a');
|
||||||
|
|
||||||
|
obj.off().on({
|
||||||
|
a: function() {
|
||||||
|
assert.strictEqual(this, context, 'will not override explicit `context` param');
|
||||||
|
}
|
||||||
|
}, this, context).trigger('a');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenTo and stopListening', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
a.listenTo(b, 'all', function(){ assert.ok(true); });
|
||||||
|
b.trigger('anything');
|
||||||
|
a.listenTo(b, 'all', function(){ assert.ok(false); });
|
||||||
|
a.stopListening();
|
||||||
|
b.trigger('anything');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenTo and stopListening with event maps', function(assert) {
|
||||||
|
assert.expect(4);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
var cb = function(){ assert.ok(true); };
|
||||||
|
a.listenTo(b, {event: cb});
|
||||||
|
b.trigger('event');
|
||||||
|
a.listenTo(b, {event2: cb});
|
||||||
|
b.on('event2', cb);
|
||||||
|
a.stopListening(b, {event2: cb});
|
||||||
|
b.trigger('event event2');
|
||||||
|
a.stopListening();
|
||||||
|
b.trigger('event event2');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('stopListening with omitted args', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
var cb = function() { assert.ok(true); };
|
||||||
|
a.listenTo(b, 'event', cb);
|
||||||
|
b.on('event', cb);
|
||||||
|
a.listenTo(b, 'event2', cb);
|
||||||
|
a.stopListening(null, {event: cb});
|
||||||
|
b.trigger('event event2');
|
||||||
|
b.off();
|
||||||
|
a.listenTo(b, 'event event2', cb);
|
||||||
|
a.stopListening(null, 'event');
|
||||||
|
a.stopListening();
|
||||||
|
b.trigger('event2');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenToOnce', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
// Same as the previous test, but we use once rather than having to explicitly unbind
|
||||||
|
var obj = {counterA: 0, counterB: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
var incrA = function(){ obj.counterA += 1; obj.trigger('event'); };
|
||||||
|
var incrB = function(){ obj.counterB += 1; };
|
||||||
|
obj.listenToOnce(obj, 'event', incrA);
|
||||||
|
obj.listenToOnce(obj, 'event', incrB);
|
||||||
|
obj.trigger('event');
|
||||||
|
assert.equal(obj.counterA, 1, 'counterA should have only been incremented once.');
|
||||||
|
assert.equal(obj.counterB, 1, 'counterB should have only been incremented once.');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenToOnce and stopListening', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
a.listenToOnce(b, 'all', function() { assert.ok(true); });
|
||||||
|
b.trigger('anything');
|
||||||
|
b.trigger('anything');
|
||||||
|
a.listenToOnce(b, 'all', function() { assert.ok(false); });
|
||||||
|
a.stopListening();
|
||||||
|
b.trigger('anything');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenTo, listenToOnce and stopListening', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
a.listenToOnce(b, 'all', function() { assert.ok(true); });
|
||||||
|
b.trigger('anything');
|
||||||
|
b.trigger('anything');
|
||||||
|
a.listenTo(b, 'all', function() { assert.ok(false); });
|
||||||
|
a.stopListening();
|
||||||
|
b.trigger('anything');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenTo and stopListening with event maps', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
a.listenTo(b, {change: function(){ assert.ok(true); }});
|
||||||
|
b.trigger('change');
|
||||||
|
a.listenTo(b, {change: function(){ assert.ok(false); }});
|
||||||
|
a.stopListening();
|
||||||
|
b.trigger('change');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenTo yourself', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var e = _.extend({}, Backbone.Events);
|
||||||
|
e.listenTo(e, 'foo', function(){ assert.ok(true); });
|
||||||
|
e.trigger('foo');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenTo yourself cleans yourself up with stopListening', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var e = _.extend({}, Backbone.Events);
|
||||||
|
e.listenTo(e, 'foo', function(){ assert.ok(true); });
|
||||||
|
e.trigger('foo');
|
||||||
|
e.stopListening();
|
||||||
|
e.trigger('foo');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('stopListening cleans up references', function(assert) {
|
||||||
|
assert.expect(12);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
var fn = function() {};
|
||||||
|
b.on('event', fn);
|
||||||
|
a.listenTo(b, 'event', fn).stopListening();
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._events.event), 1);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenTo(b, 'event', fn).stopListening(b);
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._events.event), 1);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenTo(b, 'event', fn).stopListening(b, 'event');
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._events.event), 1);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenTo(b, 'event', fn).stopListening(b, 'event', fn);
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._events.event), 1);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('stopListening cleans up references from listenToOnce', function(assert) {
|
||||||
|
assert.expect(12);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
var fn = function() {};
|
||||||
|
b.on('event', fn);
|
||||||
|
a.listenToOnce(b, 'event', fn).stopListening();
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._events.event), 1);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenToOnce(b, 'event', fn).stopListening(b);
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._events.event), 1);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenToOnce(b, 'event', fn).stopListening(b, 'event');
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._events.event), 1);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenToOnce(b, 'event', fn).stopListening(b, 'event', fn);
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._events.event), 1);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenTo and off cleaning up references', function(assert) {
|
||||||
|
assert.expect(8);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
var fn = function() {};
|
||||||
|
a.listenTo(b, 'event', fn);
|
||||||
|
b.off();
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenTo(b, 'event', fn);
|
||||||
|
b.off('event');
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenTo(b, 'event', fn);
|
||||||
|
b.off(null, fn);
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
a.listenTo(b, 'event', fn);
|
||||||
|
b.off(null, null, a);
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
assert.equal(_.size(b._listeners), 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenTo and stopListening cleaning up references', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
a.listenTo(b, 'all', function(){ assert.ok(true); });
|
||||||
|
b.trigger('anything');
|
||||||
|
a.listenTo(b, 'other', function(){ assert.ok(false); });
|
||||||
|
a.stopListening(b, 'other');
|
||||||
|
a.stopListening(b, 'all');
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenToOnce without context cleans up references after the event has fired', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
a.listenToOnce(b, 'all', function(){ assert.ok(true); });
|
||||||
|
b.trigger('anything');
|
||||||
|
assert.equal(_.size(a._listeningTo), 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenToOnce with event maps cleans up references', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
a.listenToOnce(b, {
|
||||||
|
one: function() { assert.ok(true); },
|
||||||
|
two: function() { assert.ok(false); }
|
||||||
|
});
|
||||||
|
b.trigger('one');
|
||||||
|
assert.equal(_.size(a._listeningTo), 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenToOnce with event maps binds the correct `this`', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var a = _.extend({}, Backbone.Events);
|
||||||
|
var b = _.extend({}, Backbone.Events);
|
||||||
|
a.listenToOnce(b, {
|
||||||
|
one: function() { assert.ok(this === a); },
|
||||||
|
two: function() { assert.ok(false); }
|
||||||
|
});
|
||||||
|
b.trigger('one');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test("listenTo with empty callback doesn't throw an error", function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var e = _.extend({}, Backbone.Events);
|
||||||
|
e.listenTo(e, 'foo', null);
|
||||||
|
e.trigger('foo');
|
||||||
|
assert.ok(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('trigger all for each event', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
var a, b, obj = {counter: 0};
|
||||||
_.extend(obj, Backbone.Events);
|
_.extend(obj, Backbone.Events);
|
||||||
obj.on('all', function(event) {
|
obj.on('all', function(event) {
|
||||||
obj.counter++;
|
obj.counter++;
|
||||||
if (event == 'a') a = true;
|
if (event === 'a') a = true;
|
||||||
if (event == 'b') b = true;
|
if (event === 'b') b = true;
|
||||||
})
|
})
|
||||||
.trigger('a b');
|
.trigger('a b');
|
||||||
ok(a);
|
assert.ok(a);
|
||||||
ok(b);
|
assert.ok(b);
|
||||||
equal(obj.counter, 2);
|
assert.equal(obj.counter, 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: on, then unbind all functions", 1, function() {
|
QUnit.test('on, then unbind all functions', function(assert) {
|
||||||
var obj = { counter: 0 };
|
assert.expect(1);
|
||||||
_.extend(obj,Backbone.Events);
|
var obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
var callback = function() { obj.counter += 1; };
|
var callback = function() { obj.counter += 1; };
|
||||||
obj.on('event', callback);
|
obj.on('event', callback);
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.off('event');
|
obj.off('event');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
equal(obj.counter, 1, 'counter should have only been incremented once.');
|
assert.equal(obj.counter, 1, 'counter should have only been incremented once.');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: bind two callbacks, unbind only one", 2, function() {
|
QUnit.test('bind two callbacks, unbind only one', function(assert) {
|
||||||
var obj = { counterA: 0, counterB: 0 };
|
assert.expect(2);
|
||||||
_.extend(obj,Backbone.Events);
|
var obj = {counterA: 0, counterB: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
var callback = function() { obj.counterA += 1; };
|
var callback = function() { obj.counterA += 1; };
|
||||||
obj.on('event', callback);
|
obj.on('event', callback);
|
||||||
obj.on('event', function() { obj.counterB += 1; });
|
obj.on('event', function() { obj.counterB += 1; });
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.off('event', callback);
|
obj.off('event', callback);
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
equal(obj.counterA, 1, 'counterA should have only been incremented once.');
|
assert.equal(obj.counterA, 1, 'counterA should have only been incremented once.');
|
||||||
equal(obj.counterB, 2, 'counterB should have been incremented twice.');
|
assert.equal(obj.counterB, 2, 'counterB should have been incremented twice.');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: unbind a callback in the midst of it firing", 1, function() {
|
QUnit.test('unbind a callback in the midst of it firing', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
var obj = {counter: 0};
|
var obj = {counter: 0};
|
||||||
_.extend(obj, Backbone.Events);
|
_.extend(obj, Backbone.Events);
|
||||||
var callback = function() {
|
var callback = function() {
|
||||||
@@ -84,12 +399,13 @@ $(document).ready(function() {
|
|||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
equal(obj.counter, 1, 'the callback should have been unbound.');
|
assert.equal(obj.counter, 1, 'the callback should have been unbound.');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: two binds that unbind themeselves", 2, function() {
|
QUnit.test('two binds that unbind themeselves', function(assert) {
|
||||||
var obj = { counterA: 0, counterB: 0 };
|
assert.expect(2);
|
||||||
_.extend(obj,Backbone.Events);
|
var obj = {counterA: 0, counterB: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
var incrA = function(){ obj.counterA += 1; obj.off('event', incrA); };
|
var incrA = function(){ obj.counterA += 1; obj.off('event', incrA); };
|
||||||
var incrB = function(){ obj.counterB += 1; obj.off('event', incrB); };
|
var incrB = function(){ obj.counterB += 1; obj.off('event', incrB); };
|
||||||
obj.on('event', incrA);
|
obj.on('event', incrA);
|
||||||
@@ -97,49 +413,52 @@ $(document).ready(function() {
|
|||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
equal(obj.counterA, 1, 'counterA should have only been incremented once.');
|
assert.equal(obj.counterA, 1, 'counterA should have only been incremented once.');
|
||||||
equal(obj.counterB, 1, 'counterB should have only been incremented once.');
|
assert.equal(obj.counterB, 1, 'counterB should have only been incremented once.');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: bind a callback with a supplied context", 1, function () {
|
QUnit.test('bind a callback with a supplied context', function(assert) {
|
||||||
var TestClass = function () {
|
assert.expect(1);
|
||||||
|
var TestClass = function() {
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
TestClass.prototype.assertTrue = function () {
|
TestClass.prototype.assertTrue = function() {
|
||||||
ok(true, '`this` was bound to the callback');
|
assert.ok(true, '`this` was bound to the callback');
|
||||||
};
|
};
|
||||||
|
|
||||||
var obj = _.extend({},Backbone.Events);
|
var obj = _.extend({}, Backbone.Events);
|
||||||
obj.on('event', function () { this.assertTrue(); }, (new TestClass));
|
obj.on('event', function() { this.assertTrue(); }, new TestClass);
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: nested trigger with unbind", 1, function () {
|
QUnit.test('nested trigger with unbind', function(assert) {
|
||||||
var obj = { counter: 0 };
|
assert.expect(1);
|
||||||
|
var obj = {counter: 0};
|
||||||
_.extend(obj, Backbone.Events);
|
_.extend(obj, Backbone.Events);
|
||||||
var incr1 = function(){ obj.counter += 1; obj.off('event', incr1); obj.trigger('event'); };
|
var incr1 = function(){ obj.counter += 1; obj.off('event', incr1); obj.trigger('event'); };
|
||||||
var incr2 = function(){ obj.counter += 1; };
|
var incr2 = function(){ obj.counter += 1; };
|
||||||
obj.on('event', incr1);
|
obj.on('event', incr1);
|
||||||
obj.on('event', incr2);
|
obj.on('event', incr2);
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
equal(obj.counter, 3, 'counter should have been incremented three times');
|
assert.equal(obj.counter, 3, 'counter should have been incremented three times');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Events: callback list is not altered during trigger", 2, function () {
|
QUnit.test('callback list is not altered during trigger', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
var counter = 0, obj = _.extend({}, Backbone.Events);
|
var counter = 0, obj = _.extend({}, Backbone.Events);
|
||||||
var incr = function(){ counter++; };
|
var incr = function(){ counter++; };
|
||||||
obj.on('event', function(){ obj.on('event', incr).on('all', incr); })
|
var incrOn = function(){ obj.on('event all', incr); };
|
||||||
.trigger('event');
|
var incrOff = function(){ obj.off('event all', incr); };
|
||||||
equal(counter, 0, 'bind does not alter callback list');
|
|
||||||
obj.off()
|
obj.on('event all', incrOn).trigger('event');
|
||||||
.on('event', function(){ obj.off('event', incr).off('all', incr); })
|
assert.equal(counter, 0, 'on does not alter callback list');
|
||||||
.on('event', incr)
|
|
||||||
.on('all', incr)
|
obj.off().on('event', incrOff).on('event all', incr).trigger('event');
|
||||||
.trigger('event');
|
assert.equal(counter, 2, 'off does not alter callback list');
|
||||||
equal(counter, 2, 'unbind does not alter callback list');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("#1282 - 'all' callback list is retrieved after each event.", 1, function() {
|
QUnit.test("#1282 - 'all' callback list is retrieved after each event.", function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
var counter = 0;
|
var counter = 0;
|
||||||
var obj = _.extend({}, Backbone.Events);
|
var obj = _.extend({}, Backbone.Events);
|
||||||
var incr = function(){ counter++; };
|
var incr = function(){ counter++; };
|
||||||
@@ -147,49 +466,216 @@ $(document).ready(function() {
|
|||||||
obj.on('y', incr).on('all', incr);
|
obj.on('y', incr).on('all', incr);
|
||||||
})
|
})
|
||||||
.trigger('x y');
|
.trigger('x y');
|
||||||
strictEqual(counter, 2);
|
assert.strictEqual(counter, 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("if no callback is provided, `on` is a noop", 0, function() {
|
QUnit.test('if no callback is provided, `on` is a noop', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
_.extend({}, Backbone.Events).on('test').trigger('test');
|
_.extend({}, Backbone.Events).on('test').trigger('test');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("remove all events for a specific context", 4, function() {
|
QUnit.test('if callback is truthy but not a function, `on` should throw an error just like jQuery', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var view = _.extend({}, Backbone.Events).on('test', 'noop');
|
||||||
|
assert.raises(function() {
|
||||||
|
view.trigger('test');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('remove all events for a specific context', function(assert) {
|
||||||
|
assert.expect(4);
|
||||||
var obj = _.extend({}, Backbone.Events);
|
var obj = _.extend({}, Backbone.Events);
|
||||||
obj.on('x y all', function() { ok(true); });
|
obj.on('x y all', function() { assert.ok(true); });
|
||||||
obj.on('x y all', function() { ok(false); }, obj);
|
obj.on('x y all', function() { assert.ok(false); }, obj);
|
||||||
obj.off(null, null, obj);
|
obj.off(null, null, obj);
|
||||||
obj.trigger('x y');
|
obj.trigger('x y');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("remove all events for a specific callback", 4, function() {
|
QUnit.test('remove all events for a specific callback', function(assert) {
|
||||||
|
assert.expect(4);
|
||||||
var obj = _.extend({}, Backbone.Events);
|
var obj = _.extend({}, Backbone.Events);
|
||||||
var success = function() { ok(true); };
|
var success = function() { assert.ok(true); };
|
||||||
var fail = function() { ok(false); };
|
var fail = function() { assert.ok(false); };
|
||||||
obj.on('x y all', success);
|
obj.on('x y all', success);
|
||||||
obj.on('x y all', fail);
|
obj.on('x y all', fail);
|
||||||
obj.off(null, fail);
|
obj.off(null, fail);
|
||||||
obj.trigger('x y');
|
obj.trigger('x y');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("off is chainable", 3, function() {
|
QUnit.test('#1310 - off does not skip consecutive events', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
var obj = _.extend({}, Backbone.Events);
|
var obj = _.extend({}, Backbone.Events);
|
||||||
// With no events
|
obj.on('event', function() { assert.ok(false); }, obj);
|
||||||
ok(obj.off() === obj);
|
obj.on('event', function() { assert.ok(false); }, obj);
|
||||||
// When removing all events
|
|
||||||
obj.on('event', function(){}, obj);
|
|
||||||
ok(obj.off() === obj);
|
|
||||||
// When removing some events
|
|
||||||
obj.on('event', function(){}, obj);
|
|
||||||
ok(obj.off('event') === obj);
|
|
||||||
});
|
|
||||||
|
|
||||||
test("#1310 - off does not skip consecutive events", 0, function() {
|
|
||||||
var obj = _.extend({}, Backbone.Events);
|
|
||||||
obj.on('event', function() { ok(false); }, obj);
|
|
||||||
obj.on('event', function() { ok(false); }, obj);
|
|
||||||
obj.off(null, null, obj);
|
obj.off(null, null, obj);
|
||||||
obj.trigger('event');
|
obj.trigger('event');
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
QUnit.test('once', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
// Same as the previous test, but we use once rather than having to explicitly unbind
|
||||||
|
var obj = {counterA: 0, counterB: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
var incrA = function(){ obj.counterA += 1; obj.trigger('event'); };
|
||||||
|
var incrB = function(){ obj.counterB += 1; };
|
||||||
|
obj.once('event', incrA);
|
||||||
|
obj.once('event', incrB);
|
||||||
|
obj.trigger('event');
|
||||||
|
assert.equal(obj.counterA, 1, 'counterA should have only been incremented once.');
|
||||||
|
assert.equal(obj.counterB, 1, 'counterB should have only been incremented once.');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once variant one', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
var f = function(){ assert.ok(true); };
|
||||||
|
|
||||||
|
var a = _.extend({}, Backbone.Events).once('event', f);
|
||||||
|
var b = _.extend({}, Backbone.Events).on('event', f);
|
||||||
|
|
||||||
|
a.trigger('event');
|
||||||
|
|
||||||
|
b.trigger('event');
|
||||||
|
b.trigger('event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once variant two', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
var f = function(){ assert.ok(true); };
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
|
||||||
|
obj
|
||||||
|
.once('event', f)
|
||||||
|
.on('event', f)
|
||||||
|
.trigger('event')
|
||||||
|
.trigger('event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once with off', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
|
var f = function(){ assert.ok(true); };
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
|
||||||
|
obj.once('event', f);
|
||||||
|
obj.off('event', f);
|
||||||
|
obj.trigger('event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once with event maps', function(assert) {
|
||||||
|
var obj = {counter: 0};
|
||||||
|
_.extend(obj, Backbone.Events);
|
||||||
|
|
||||||
|
var increment = function() {
|
||||||
|
this.counter += 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
obj.once({
|
||||||
|
a: increment,
|
||||||
|
b: increment,
|
||||||
|
c: increment
|
||||||
|
}, obj);
|
||||||
|
|
||||||
|
obj.trigger('a');
|
||||||
|
assert.equal(obj.counter, 1);
|
||||||
|
|
||||||
|
obj.trigger('a b');
|
||||||
|
assert.equal(obj.counter, 2);
|
||||||
|
|
||||||
|
obj.trigger('c');
|
||||||
|
assert.equal(obj.counter, 3);
|
||||||
|
|
||||||
|
obj.trigger('a b c');
|
||||||
|
assert.equal(obj.counter, 3);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once with off only by context', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
|
var context = {};
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
obj.once('event', function(){ assert.ok(false); }, context);
|
||||||
|
obj.off(null, null, context);
|
||||||
|
obj.trigger('event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('Backbone object inherits Events', function(assert) {
|
||||||
|
assert.ok(Backbone.on === Backbone.Events.on);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once with asynchronous events', function(assert) {
|
||||||
|
var done = assert.async();
|
||||||
|
assert.expect(1);
|
||||||
|
var func = _.debounce(function() { assert.ok(true); done(); }, 50);
|
||||||
|
var obj = _.extend({}, Backbone.Events).once('async', func);
|
||||||
|
|
||||||
|
obj.trigger('async');
|
||||||
|
obj.trigger('async');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once with multiple events.', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
obj.once('x y', function() { assert.ok(true); });
|
||||||
|
obj.trigger('x y');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('Off during iteration with once.', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
var f = function(){ this.off('event', f); };
|
||||||
|
obj.on('event', f);
|
||||||
|
obj.once('event', function(){});
|
||||||
|
obj.on('event', function(){ assert.ok(true); });
|
||||||
|
|
||||||
|
obj.trigger('event');
|
||||||
|
obj.trigger('event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('`once` on `all` should work as expected', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
Backbone.once('all', function() {
|
||||||
|
assert.ok(true);
|
||||||
|
Backbone.trigger('all');
|
||||||
|
});
|
||||||
|
Backbone.trigger('all');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('once without a callback is a noop', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
|
_.extend({}, Backbone.Events).once('event').trigger('event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('listenToOnce without a callback is a noop', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
obj.listenToOnce(obj, 'event').trigger('event');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('event functions are chainable', function(assert) {
|
||||||
|
var obj = _.extend({}, Backbone.Events);
|
||||||
|
var obj2 = _.extend({}, Backbone.Events);
|
||||||
|
var fn = function() {};
|
||||||
|
assert.equal(obj, obj.trigger('noeventssetyet'));
|
||||||
|
assert.equal(obj, obj.off('noeventssetyet'));
|
||||||
|
assert.equal(obj, obj.stopListening('noeventssetyet'));
|
||||||
|
assert.equal(obj, obj.on('a', fn));
|
||||||
|
assert.equal(obj, obj.once('c', fn));
|
||||||
|
assert.equal(obj, obj.trigger('a'));
|
||||||
|
assert.equal(obj, obj.listenTo(obj2, 'a', fn));
|
||||||
|
assert.equal(obj, obj.listenToOnce(obj2, 'b', fn));
|
||||||
|
assert.equal(obj, obj.off('a c'));
|
||||||
|
assert.equal(obj, obj.stopListening(obj2, 'a'));
|
||||||
|
assert.equal(obj, obj.stopListening());
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#3448 - listenToOnce with space-separated events', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var one = _.extend({}, Backbone.Events);
|
||||||
|
var two = _.extend({}, Backbone.Events);
|
||||||
|
var count = 1;
|
||||||
|
one.listenToOnce(two, 'x y', function(n) { assert.ok(n === count++); });
|
||||||
|
two.trigger('x', 1);
|
||||||
|
two.trigger('x', 1);
|
||||||
|
two.trigger('y', 2);
|
||||||
|
two.trigger('y', 2);
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
||||||
|
|||||||
1388
vendor/backbone/test/model.js
vendored
1388
vendor/backbone/test/model.js
vendored
File diff suppressed because it is too large
Load Diff
13
vendor/backbone/test/noconflict.js
vendored
13
vendor/backbone/test/noconflict.js
vendored
@@ -1,12 +1,13 @@
|
|||||||
$(document).ready(function() {
|
(function() {
|
||||||
|
|
||||||
module("Backbone.noConflict");
|
QUnit.module('Backbone.noConflict');
|
||||||
|
|
||||||
test('Backbone.noConflict', 2, function() {
|
QUnit.test('noConflict', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
var noconflictBackbone = Backbone.noConflict();
|
var noconflictBackbone = Backbone.noConflict();
|
||||||
equal(window.Backbone, undefined, 'Returned window.Backbone');
|
assert.equal(window.Backbone, undefined, 'Returned window.Backbone');
|
||||||
window.Backbone = noconflictBackbone;
|
window.Backbone = noconflictBackbone;
|
||||||
equal(window.Backbone, noconflictBackbone, 'Backbone is still pointing to the original Backbone');
|
assert.equal(window.Backbone, noconflictBackbone, 'Backbone is still pointing to the original Backbone');
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
})();
|
||||||
|
|||||||
919
vendor/backbone/test/router.js
vendored
919
vendor/backbone/test/router.js
vendored
File diff suppressed because it is too large
Load Diff
4
vendor/backbone/test/setup/dom-setup.js
vendored
Normal file
4
vendor/backbone/test/setup/dom-setup.js
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
$('body').append(
|
||||||
|
'<div id="qunit"></div>' +
|
||||||
|
'<div id="qunit-fixture"></div>'
|
||||||
|
);
|
||||||
45
vendor/backbone/test/setup/environment.js
vendored
Normal file
45
vendor/backbone/test/setup/environment.js
vendored
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
(function() {
|
||||||
|
|
||||||
|
var sync = Backbone.sync;
|
||||||
|
var ajax = Backbone.ajax;
|
||||||
|
var emulateHTTP = Backbone.emulateHTTP;
|
||||||
|
var emulateJSON = Backbone.emulateJSON;
|
||||||
|
var history = window.history;
|
||||||
|
var pushState = history.pushState;
|
||||||
|
var replaceState = history.replaceState;
|
||||||
|
|
||||||
|
QUnit.config.noglobals = true;
|
||||||
|
|
||||||
|
QUnit.testStart(function() {
|
||||||
|
var env = QUnit.config.current.testEnvironment;
|
||||||
|
|
||||||
|
// We never want to actually call these during tests.
|
||||||
|
history.pushState = history.replaceState = function(){};
|
||||||
|
|
||||||
|
// Capture ajax settings for comparison.
|
||||||
|
Backbone.ajax = function(settings) {
|
||||||
|
env.ajaxSettings = settings;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Capture the arguments to Backbone.sync for comparison.
|
||||||
|
Backbone.sync = function(method, model, options) {
|
||||||
|
env.syncArgs = {
|
||||||
|
method: method,
|
||||||
|
model: model,
|
||||||
|
options: options
|
||||||
|
};
|
||||||
|
sync.apply(this, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.testDone(function() {
|
||||||
|
Backbone.sync = sync;
|
||||||
|
Backbone.ajax = ajax;
|
||||||
|
Backbone.emulateHTTP = emulateHTTP;
|
||||||
|
Backbone.emulateJSON = emulateJSON;
|
||||||
|
history.pushState = pushState;
|
||||||
|
history.replaceState = replaceState;
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
||||||
275
vendor/backbone/test/sync.js
vendored
275
vendor/backbone/test/sync.js
vendored
@@ -1,160 +1,239 @@
|
|||||||
$(document).ready(function() {
|
(function() {
|
||||||
|
|
||||||
var ajax = Backbone.ajax;
|
|
||||||
var lastRequest = null;
|
|
||||||
|
|
||||||
var Library = Backbone.Collection.extend({
|
var Library = Backbone.Collection.extend({
|
||||||
url : function() { return '/library'; }
|
url: function() { return '/library'; }
|
||||||
});
|
});
|
||||||
var library;
|
var library;
|
||||||
|
|
||||||
var attrs = {
|
var attrs = {
|
||||||
title : "The Tempest",
|
title: 'The Tempest',
|
||||||
author : "Bill Shakespeare",
|
author: 'Bill Shakespeare',
|
||||||
length : 123
|
length: 123
|
||||||
};
|
};
|
||||||
|
|
||||||
module("Backbone.sync", {
|
QUnit.module('Backbone.sync', {
|
||||||
|
|
||||||
setup : function() {
|
beforeEach: function(assert) {
|
||||||
library = new Library();
|
library = new Library;
|
||||||
Backbone.ajax = function(obj) {
|
|
||||||
lastRequest = obj;
|
|
||||||
};
|
|
||||||
library.create(attrs, {wait: false});
|
library.create(attrs, {wait: false});
|
||||||
},
|
},
|
||||||
|
|
||||||
teardown: function() {
|
afterEach: function(assert) {
|
||||||
Backbone.ajax = ajax;
|
Backbone.emulateHTTP = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: read", 4, function() {
|
QUnit.test('read', function(assert) {
|
||||||
|
assert.expect(4);
|
||||||
library.fetch();
|
library.fetch();
|
||||||
equal(lastRequest.url, '/library');
|
assert.equal(this.ajaxSettings.url, '/library');
|
||||||
equal(lastRequest.type, 'GET');
|
assert.equal(this.ajaxSettings.type, 'GET');
|
||||||
equal(lastRequest.dataType, 'json');
|
assert.equal(this.ajaxSettings.dataType, 'json');
|
||||||
ok(_.isEmpty(lastRequest.data));
|
assert.ok(_.isEmpty(this.ajaxSettings.data));
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: passing data", 3, function() {
|
QUnit.test('passing data', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
library.fetch({data: {a: 'a', one: 1}});
|
library.fetch({data: {a: 'a', one: 1}});
|
||||||
equal(lastRequest.url, '/library');
|
assert.equal(this.ajaxSettings.url, '/library');
|
||||||
equal(lastRequest.data.a, 'a');
|
assert.equal(this.ajaxSettings.data.a, 'a');
|
||||||
equal(lastRequest.data.one, 1);
|
assert.equal(this.ajaxSettings.data.one, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: create", 6, function() {
|
QUnit.test('create', function(assert) {
|
||||||
equal(lastRequest.url, '/library');
|
assert.expect(6);
|
||||||
equal(lastRequest.type, 'POST');
|
assert.equal(this.ajaxSettings.url, '/library');
|
||||||
equal(lastRequest.dataType, 'json');
|
assert.equal(this.ajaxSettings.type, 'POST');
|
||||||
var data = JSON.parse(lastRequest.data);
|
assert.equal(this.ajaxSettings.dataType, 'json');
|
||||||
equal(data.title, 'The Tempest');
|
var data = JSON.parse(this.ajaxSettings.data);
|
||||||
equal(data.author, 'Bill Shakespeare');
|
assert.equal(data.title, 'The Tempest');
|
||||||
equal(data.length, 123);
|
assert.equal(data.author, 'Bill Shakespeare');
|
||||||
|
assert.equal(data.length, 123);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: update", 7, function() {
|
QUnit.test('update', function(assert) {
|
||||||
|
assert.expect(7);
|
||||||
library.first().save({id: '1-the-tempest', author: 'William Shakespeare'});
|
library.first().save({id: '1-the-tempest', author: 'William Shakespeare'});
|
||||||
equal(lastRequest.url, '/library/1-the-tempest');
|
assert.equal(this.ajaxSettings.url, '/library/1-the-tempest');
|
||||||
equal(lastRequest.type, 'PUT');
|
assert.equal(this.ajaxSettings.type, 'PUT');
|
||||||
equal(lastRequest.dataType, 'json');
|
assert.equal(this.ajaxSettings.dataType, 'json');
|
||||||
var data = JSON.parse(lastRequest.data);
|
var data = JSON.parse(this.ajaxSettings.data);
|
||||||
equal(data.id, '1-the-tempest');
|
assert.equal(data.id, '1-the-tempest');
|
||||||
equal(data.title, 'The Tempest');
|
assert.equal(data.title, 'The Tempest');
|
||||||
equal(data.author, 'William Shakespeare');
|
assert.equal(data.author, 'William Shakespeare');
|
||||||
equal(data.length, 123);
|
assert.equal(data.length, 123);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: update with emulateHTTP and emulateJSON", 7, function() {
|
QUnit.test('update with emulateHTTP and emulateJSON', function(assert) {
|
||||||
Backbone.emulateHTTP = Backbone.emulateJSON = true;
|
assert.expect(7);
|
||||||
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
|
||||||
equal(lastRequest.url, '/library/2-the-tempest');
|
emulateHTTP: true,
|
||||||
equal(lastRequest.type, 'POST');
|
emulateJSON: true
|
||||||
equal(lastRequest.dataType, 'json');
|
});
|
||||||
equal(lastRequest.data._method, 'PUT');
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
var data = JSON.parse(lastRequest.data.model);
|
assert.equal(this.ajaxSettings.type, 'POST');
|
||||||
equal(data.id, '2-the-tempest');
|
assert.equal(this.ajaxSettings.dataType, 'json');
|
||||||
equal(data.author, 'Tim Shakespeare');
|
assert.equal(this.ajaxSettings.data._method, 'PUT');
|
||||||
equal(data.length, 123);
|
var data = JSON.parse(this.ajaxSettings.data.model);
|
||||||
Backbone.emulateHTTP = Backbone.emulateJSON = false;
|
assert.equal(data.id, '2-the-tempest');
|
||||||
|
assert.equal(data.author, 'Tim Shakespeare');
|
||||||
|
assert.equal(data.length, 123);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: update with just emulateHTTP", 6, function() {
|
QUnit.test('update with just emulateHTTP', function(assert) {
|
||||||
Backbone.emulateHTTP = true;
|
assert.expect(6);
|
||||||
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
|
||||||
equal(lastRequest.url, '/library/2-the-tempest');
|
emulateHTTP: true
|
||||||
equal(lastRequest.type, 'POST');
|
});
|
||||||
equal(lastRequest.contentType, 'application/json');
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
var data = JSON.parse(lastRequest.data);
|
assert.equal(this.ajaxSettings.type, 'POST');
|
||||||
equal(data.id, '2-the-tempest');
|
assert.equal(this.ajaxSettings.contentType, 'application/json');
|
||||||
equal(data.author, 'Tim Shakespeare');
|
var data = JSON.parse(this.ajaxSettings.data);
|
||||||
equal(data.length, 123);
|
assert.equal(data.id, '2-the-tempest');
|
||||||
Backbone.emulateHTTP = false;
|
assert.equal(data.author, 'Tim Shakespeare');
|
||||||
|
assert.equal(data.length, 123);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: update with just emulateJSON", 6, function() {
|
QUnit.test('update with just emulateJSON', function(assert) {
|
||||||
Backbone.emulateJSON = true;
|
assert.expect(6);
|
||||||
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, {
|
||||||
equal(lastRequest.url, '/library/2-the-tempest');
|
emulateJSON: true
|
||||||
equal(lastRequest.type, 'PUT');
|
});
|
||||||
equal(lastRequest.contentType, 'application/x-www-form-urlencoded');
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
var data = JSON.parse(lastRequest.data.model);
|
assert.equal(this.ajaxSettings.type, 'PUT');
|
||||||
equal(data.id, '2-the-tempest');
|
assert.equal(this.ajaxSettings.contentType, 'application/x-www-form-urlencoded');
|
||||||
equal(data.author, 'Tim Shakespeare');
|
var data = JSON.parse(this.ajaxSettings.data.model);
|
||||||
equal(data.length, 123);
|
assert.equal(data.id, '2-the-tempest');
|
||||||
Backbone.emulateJSON = false;
|
assert.equal(data.author, 'Tim Shakespeare');
|
||||||
|
assert.equal(data.length, 123);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: read model", 3, function() {
|
QUnit.test('read model', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
||||||
library.first().fetch();
|
library.first().fetch();
|
||||||
equal(lastRequest.url, '/library/2-the-tempest');
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
equal(lastRequest.type, 'GET');
|
assert.equal(this.ajaxSettings.type, 'GET');
|
||||||
ok(_.isEmpty(lastRequest.data));
|
assert.ok(_.isEmpty(this.ajaxSettings.data));
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: destroy", 3, function() {
|
QUnit.test('destroy', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
||||||
library.first().destroy({wait: true});
|
library.first().destroy({wait: true});
|
||||||
equal(lastRequest.url, '/library/2-the-tempest');
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
equal(lastRequest.type, 'DELETE');
|
assert.equal(this.ajaxSettings.type, 'DELETE');
|
||||||
equal(lastRequest.data, null);
|
assert.equal(this.ajaxSettings.data, null);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: destroy with emulateHTTP", 3, function() {
|
QUnit.test('destroy with emulateHTTP', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'});
|
||||||
Backbone.emulateHTTP = Backbone.emulateJSON = true;
|
library.first().destroy({
|
||||||
library.first().destroy();
|
emulateHTTP: true,
|
||||||
equal(lastRequest.url, '/library/2-the-tempest');
|
emulateJSON: true
|
||||||
equal(lastRequest.type, 'POST');
|
});
|
||||||
equal(JSON.stringify(lastRequest.data), '{"_method":"DELETE"}');
|
assert.equal(this.ajaxSettings.url, '/library/2-the-tempest');
|
||||||
Backbone.emulateHTTP = Backbone.emulateJSON = false;
|
assert.equal(this.ajaxSettings.type, 'POST');
|
||||||
|
assert.equal(JSON.stringify(this.ajaxSettings.data), '{"_method":"DELETE"}');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("sync: urlError", 2, function() {
|
QUnit.test('urlError', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
var model = new Backbone.Model();
|
var model = new Backbone.Model();
|
||||||
raises(function() {
|
assert.raises(function() {
|
||||||
model.fetch();
|
model.fetch();
|
||||||
});
|
});
|
||||||
model.fetch({url: '/one/two'});
|
model.fetch({url: '/one/two'});
|
||||||
equal(lastRequest.url, '/one/two');
|
assert.equal(this.ajaxSettings.url, '/one/two');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("#1052 - `options` is optional.", 0, function() {
|
QUnit.test('#1052 - `options` is optional.', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
var model = new Backbone.Model();
|
var model = new Backbone.Model();
|
||||||
model.url = '/test';
|
model.url = '/test';
|
||||||
Backbone.sync('create', model);
|
Backbone.sync('create', model);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Backbone.ajax", 1, function() {
|
QUnit.test('Backbone.ajax', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
Backbone.ajax = function(settings){
|
Backbone.ajax = function(settings){
|
||||||
strictEqual(settings.url, '/test');
|
assert.strictEqual(settings.url, '/test');
|
||||||
};
|
};
|
||||||
var model = new Backbone.Model();
|
var model = new Backbone.Model();
|
||||||
model.url = '/test';
|
model.url = '/test';
|
||||||
Backbone.sync('create', model);
|
Backbone.sync('create', model);
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
QUnit.test('Call provided error callback on error.', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var model = new Backbone.Model;
|
||||||
|
model.url = '/test';
|
||||||
|
Backbone.sync('read', model, {
|
||||||
|
error: function() { assert.ok(true); }
|
||||||
|
});
|
||||||
|
this.ajaxSettings.error();
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('Use Backbone.emulateHTTP as default.', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var model = new Backbone.Model;
|
||||||
|
model.url = '/test';
|
||||||
|
|
||||||
|
Backbone.emulateHTTP = true;
|
||||||
|
model.sync('create', model);
|
||||||
|
assert.strictEqual(this.ajaxSettings.emulateHTTP, true);
|
||||||
|
|
||||||
|
Backbone.emulateHTTP = false;
|
||||||
|
model.sync('create', model);
|
||||||
|
assert.strictEqual(this.ajaxSettings.emulateHTTP, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('Use Backbone.emulateJSON as default.', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var model = new Backbone.Model;
|
||||||
|
model.url = '/test';
|
||||||
|
|
||||||
|
Backbone.emulateJSON = true;
|
||||||
|
model.sync('create', model);
|
||||||
|
assert.strictEqual(this.ajaxSettings.emulateJSON, true);
|
||||||
|
|
||||||
|
Backbone.emulateJSON = false;
|
||||||
|
model.sync('create', model);
|
||||||
|
assert.strictEqual(this.ajaxSettings.emulateJSON, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#1756 - Call user provided beforeSend function.', function(assert) {
|
||||||
|
assert.expect(4);
|
||||||
|
Backbone.emulateHTTP = true;
|
||||||
|
var model = new Backbone.Model;
|
||||||
|
model.url = '/test';
|
||||||
|
var xhr = {
|
||||||
|
setRequestHeader: function(header, value) {
|
||||||
|
assert.strictEqual(header, 'X-HTTP-Method-Override');
|
||||||
|
assert.strictEqual(value, 'DELETE');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
model.sync('delete', model, {
|
||||||
|
beforeSend: function(_xhr) {
|
||||||
|
assert.ok(_xhr === xhr);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
assert.strictEqual(this.ajaxSettings.beforeSend(xhr), false);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#2928 - Pass along `textStatus` and `errorThrown`.', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var model = new Backbone.Model;
|
||||||
|
model.url = '/test';
|
||||||
|
model.on('error', function(m, xhr, options) {
|
||||||
|
assert.strictEqual(options.textStatus, 'textStatus');
|
||||||
|
assert.strictEqual(options.errorThrown, 'errorThrown');
|
||||||
|
});
|
||||||
|
model.fetch();
|
||||||
|
this.ajaxSettings.error({}, 'textStatus', 'errorThrown');
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
||||||
|
|||||||
9266
vendor/backbone/test/vendor/jquery-1.7.1.js
vendored
9266
vendor/backbone/test/vendor/jquery-1.7.1.js
vendored
File diff suppressed because it is too large
Load Diff
649
vendor/backbone/test/vendor/jslitmus.js
vendored
649
vendor/backbone/test/vendor/jslitmus.js
vendored
@@ -1,649 +0,0 @@
|
|||||||
// JSLitmus.js
|
|
||||||
//
|
|
||||||
// Copyright (c) 2010, Robert Kieffer, http://broofa.com
|
|
||||||
// Available under MIT license (http://en.wikipedia.org/wiki/MIT_License)
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
// Private methods and state
|
|
||||||
|
|
||||||
// Get platform info but don't go crazy trying to recognize everything
|
|
||||||
// that's out there. This is just for the major platforms and OSes.
|
|
||||||
var platform = 'unknown platform', ua = navigator.userAgent;
|
|
||||||
|
|
||||||
// Detect OS
|
|
||||||
var oses = ['Windows','iPhone OS','(Intel |PPC )?Mac OS X','Linux'].join('|');
|
|
||||||
var pOS = new RegExp('((' + oses + ') [^ \);]*)').test(ua) ? RegExp.$1 : null;
|
|
||||||
if (!pOS) pOS = new RegExp('((' + oses + ')[^ \);]*)').test(ua) ? RegExp.$1 : null;
|
|
||||||
|
|
||||||
// Detect browser
|
|
||||||
var pName = /(Chrome|MSIE|Safari|Opera|Firefox)/.test(ua) ? RegExp.$1 : null;
|
|
||||||
|
|
||||||
// Detect version
|
|
||||||
var vre = new RegExp('(Version|' + pName + ')[ \/]([^ ;]*)');
|
|
||||||
var pVersion = (pName && vre.test(ua)) ? RegExp.$2 : null;
|
|
||||||
var platform = (pOS && pName && pVersion) ? pName + ' ' + pVersion + ' on ' + pOS : 'unknown platform';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A smattering of methods that are needed to implement the JSLitmus testbed.
|
|
||||||
*/
|
|
||||||
var jsl = {
|
|
||||||
/**
|
|
||||||
* Enhanced version of escape()
|
|
||||||
*/
|
|
||||||
escape: function(s) {
|
|
||||||
s = s.replace(/,/g, '\\,');
|
|
||||||
s = escape(s);
|
|
||||||
s = s.replace(/\+/g, '%2b');
|
|
||||||
s = s.replace(/ /g, '+');
|
|
||||||
return s;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get an element by ID.
|
|
||||||
*/
|
|
||||||
$: function(id) {
|
|
||||||
return document.getElementById(id);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Null function
|
|
||||||
*/
|
|
||||||
F: function() {},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the status shown in the UI
|
|
||||||
*/
|
|
||||||
status: function(msg) {
|
|
||||||
var el = jsl.$('jsl_status');
|
|
||||||
if (el) el.innerHTML = msg || '';
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert a number to an abbreviated string like, "15K" or "10M"
|
|
||||||
*/
|
|
||||||
toLabel: function(n) {
|
|
||||||
if (n == Infinity) {
|
|
||||||
return 'Infinity';
|
|
||||||
} else if (n > 1e9) {
|
|
||||||
n = Math.round(n/1e8);
|
|
||||||
return n/10 + 'B';
|
|
||||||
} else if (n > 1e6) {
|
|
||||||
n = Math.round(n/1e5);
|
|
||||||
return n/10 + 'M';
|
|
||||||
} else if (n > 1e3) {
|
|
||||||
n = Math.round(n/1e2);
|
|
||||||
return n/10 + 'K';
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copy properties from src to dst
|
|
||||||
*/
|
|
||||||
extend: function(dst, src) {
|
|
||||||
for (var k in src) dst[k] = src[k]; return dst;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Like Array.join(), but for the key-value pairs in an object
|
|
||||||
*/
|
|
||||||
join: function(o, delimit1, delimit2) {
|
|
||||||
if (o.join) return o.join(delimit1); // If it's an array
|
|
||||||
var pairs = [];
|
|
||||||
for (var k in o) pairs.push(k + delimit1 + o[k]);
|
|
||||||
return pairs.join(delimit2);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Array#indexOf isn't supported in IE, so we use this as a cross-browser solution
|
|
||||||
*/
|
|
||||||
indexOf: function(arr, o) {
|
|
||||||
if (arr.indexOf) return arr.indexOf(o);
|
|
||||||
for (var i = 0; i < this.length; i++) if (arr[i] === o) return i;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test manages a single test (created with
|
|
||||||
* JSLitmus.test())
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
var Test = function (name, f) {
|
|
||||||
if (!f) throw new Error('Undefined test function');
|
|
||||||
if (!/function[^\(]*\(([^,\)]*)/.test(f.toString())) {
|
|
||||||
throw new Error('"' + name + '" test: Test is not a valid Function object');
|
|
||||||
}
|
|
||||||
this.loopArg = RegExp.$1;
|
|
||||||
this.name = name;
|
|
||||||
this.f = f;
|
|
||||||
};
|
|
||||||
|
|
||||||
jsl.extend(Test, /** @lends Test */ {
|
|
||||||
/** Calibration tests for establishing iteration loop overhead */
|
|
||||||
CALIBRATIONS: [
|
|
||||||
new Test('calibrating loop', function(count) {while (count--);}),
|
|
||||||
new Test('calibrating function', jsl.F)
|
|
||||||
],
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run calibration tests. Returns true if calibrations are not yet
|
|
||||||
* complete (in which case calling code should run the tests yet again).
|
|
||||||
* onCalibrated - Callback to invoke when calibrations have finished
|
|
||||||
*/
|
|
||||||
calibrate: function(onCalibrated) {
|
|
||||||
for (var i = 0; i < Test.CALIBRATIONS.length; i++) {
|
|
||||||
var cal = Test.CALIBRATIONS[i];
|
|
||||||
if (cal.running) return true;
|
|
||||||
if (!cal.count) {
|
|
||||||
cal.isCalibration = true;
|
|
||||||
cal.onStop = onCalibrated;
|
|
||||||
//cal.MIN_TIME = .1; // Do calibrations quickly
|
|
||||||
cal.run(2e4);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
jsl.extend(Test.prototype, {/** @lends Test.prototype */
|
|
||||||
/** Initial number of iterations */
|
|
||||||
INIT_COUNT: 10,
|
|
||||||
/** Max iterations allowed (i.e. used to detect bad looping functions) */
|
|
||||||
MAX_COUNT: 1e9,
|
|
||||||
/** Minimum time a test should take to get valid results (secs) */
|
|
||||||
MIN_TIME: .5,
|
|
||||||
|
|
||||||
/** Callback invoked when test state changes */
|
|
||||||
onChange: jsl.F,
|
|
||||||
|
|
||||||
/** Callback invoked when test is finished */
|
|
||||||
onStop: jsl.F,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset test state
|
|
||||||
*/
|
|
||||||
reset: function() {
|
|
||||||
delete this.count;
|
|
||||||
delete this.time;
|
|
||||||
delete this.running;
|
|
||||||
delete this.error;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run the test (in a timeout). We use a timeout to make sure the browser
|
|
||||||
* has a chance to finish rendering any UI changes we've made, like
|
|
||||||
* updating the status message.
|
|
||||||
*/
|
|
||||||
run: function(count) {
|
|
||||||
count = count || this.INIT_COUNT;
|
|
||||||
jsl.status(this.name + ' x ' + count);
|
|
||||||
this.running = true;
|
|
||||||
var me = this;
|
|
||||||
setTimeout(function() {me._run(count);}, 200);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The nuts and bolts code that actually runs a test
|
|
||||||
*/
|
|
||||||
_run: function(count) {
|
|
||||||
var me = this;
|
|
||||||
|
|
||||||
// Make sure calibration tests have run
|
|
||||||
if (!me.isCalibration && Test.calibrate(function() {me.run(count);})) return;
|
|
||||||
this.error = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
var start, f = this.f, now, i = count;
|
|
||||||
|
|
||||||
// Start the timer
|
|
||||||
start = new Date();
|
|
||||||
|
|
||||||
// Now for the money shot. If this is a looping function ...
|
|
||||||
if (this.loopArg) {
|
|
||||||
// ... let it do the iteration itself
|
|
||||||
f(count);
|
|
||||||
} else {
|
|
||||||
// ... otherwise do the iteration for it
|
|
||||||
while (i--) f();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get time test took (in secs)
|
|
||||||
this.time = Math.max(1,new Date() - start)/1000;
|
|
||||||
|
|
||||||
// Store iteration count and per-operation time taken
|
|
||||||
this.count = count;
|
|
||||||
this.period = this.time/count;
|
|
||||||
|
|
||||||
// Do we need to do another run?
|
|
||||||
this.running = this.time <= this.MIN_TIME;
|
|
||||||
|
|
||||||
// ... if so, compute how many times we should iterate
|
|
||||||
if (this.running) {
|
|
||||||
// Bump the count to the nearest power of 2
|
|
||||||
var x = this.MIN_TIME/this.time;
|
|
||||||
var pow = Math.pow(2, Math.max(1, Math.ceil(Math.log(x)/Math.log(2))));
|
|
||||||
count *= pow;
|
|
||||||
if (count > this.MAX_COUNT) {
|
|
||||||
throw new Error('Max count exceeded. If this test uses a looping function, make sure the iteration loop is working properly.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
// Exceptions are caught and displayed in the test UI
|
|
||||||
this.reset();
|
|
||||||
this.error = e;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Figure out what to do next
|
|
||||||
if (this.running) {
|
|
||||||
me.run(count);
|
|
||||||
} else {
|
|
||||||
jsl.status('');
|
|
||||||
me.onStop(me);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finish up
|
|
||||||
this.onChange(this);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the number of operations per second for this test.
|
|
||||||
*
|
|
||||||
* @param normalize if true, iteration loop overhead taken into account
|
|
||||||
*/
|
|
||||||
getHz: function(/**Boolean*/ normalize) {
|
|
||||||
var p = this.period;
|
|
||||||
|
|
||||||
// Adjust period based on the calibration test time
|
|
||||||
if (normalize && !this.isCalibration) {
|
|
||||||
var cal = Test.CALIBRATIONS[this.loopArg ? 0 : 1];
|
|
||||||
|
|
||||||
// If the period is within 20% of the calibration time, then zero the
|
|
||||||
// it out
|
|
||||||
p = p < cal.period*1.2 ? 0 : p - cal.period;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Math.round(1/p);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a friendly string describing the test
|
|
||||||
*/
|
|
||||||
toString: function() {
|
|
||||||
return this.name + ' - ' + this.time/this.count + ' secs';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// CSS we need for the UI
|
|
||||||
var STYLESHEET = '<style> \
|
|
||||||
#jslitmus {font-family:sans-serif; font-size: 12px;} \
|
|
||||||
#jslitmus a {text-decoration: none;} \
|
|
||||||
#jslitmus a:hover {text-decoration: underline;} \
|
|
||||||
#jsl_status { \
|
|
||||||
margin-top: 10px; \
|
|
||||||
font-size: 10px; \
|
|
||||||
color: #888; \
|
|
||||||
} \
|
|
||||||
A IMG {border:none} \
|
|
||||||
#test_results { \
|
|
||||||
margin-top: 10px; \
|
|
||||||
font-size: 12px; \
|
|
||||||
font-family: sans-serif; \
|
|
||||||
border-collapse: collapse; \
|
|
||||||
border-spacing: 0px; \
|
|
||||||
} \
|
|
||||||
#test_results th, #test_results td { \
|
|
||||||
border: solid 1px #ccc; \
|
|
||||||
vertical-align: top; \
|
|
||||||
padding: 3px; \
|
|
||||||
} \
|
|
||||||
#test_results th { \
|
|
||||||
vertical-align: bottom; \
|
|
||||||
background-color: #ccc; \
|
|
||||||
padding: 1px; \
|
|
||||||
font-size: 10px; \
|
|
||||||
} \
|
|
||||||
#test_results #test_platform { \
|
|
||||||
color: #444; \
|
|
||||||
text-align:center; \
|
|
||||||
} \
|
|
||||||
#test_results .test_row { \
|
|
||||||
color: #006; \
|
|
||||||
cursor: pointer; \
|
|
||||||
} \
|
|
||||||
#test_results .test_nonlooping { \
|
|
||||||
border-left-style: dotted; \
|
|
||||||
border-left-width: 2px; \
|
|
||||||
} \
|
|
||||||
#test_results .test_looping { \
|
|
||||||
border-left-style: solid; \
|
|
||||||
border-left-width: 2px; \
|
|
||||||
} \
|
|
||||||
#test_results .test_name {white-space: nowrap;} \
|
|
||||||
#test_results .test_pending { \
|
|
||||||
} \
|
|
||||||
#test_results .test_running { \
|
|
||||||
font-style: italic; \
|
|
||||||
} \
|
|
||||||
#test_results .test_done {} \
|
|
||||||
#test_results .test_done { \
|
|
||||||
text-align: right; \
|
|
||||||
font-family: monospace; \
|
|
||||||
} \
|
|
||||||
#test_results .test_error {color: #600;} \
|
|
||||||
#test_results .test_error .error_head {font-weight:bold;} \
|
|
||||||
#test_results .test_error .error_body {font-size:85%;} \
|
|
||||||
#test_results .test_row:hover td { \
|
|
||||||
background-color: #ffc; \
|
|
||||||
text-decoration: underline; \
|
|
||||||
} \
|
|
||||||
#chart { \
|
|
||||||
margin: 10px 0px; \
|
|
||||||
width: 250px; \
|
|
||||||
} \
|
|
||||||
#chart img { \
|
|
||||||
border: solid 1px #ccc; \
|
|
||||||
margin-bottom: 5px; \
|
|
||||||
} \
|
|
||||||
#chart #tiny_url { \
|
|
||||||
height: 40px; \
|
|
||||||
width: 250px; \
|
|
||||||
} \
|
|
||||||
#jslitmus_credit { \
|
|
||||||
font-size: 10px; \
|
|
||||||
color: #888; \
|
|
||||||
margin-top: 8px; \
|
|
||||||
} \
|
|
||||||
</style>';
|
|
||||||
|
|
||||||
// HTML markup for the UI
|
|
||||||
var MARKUP = '<div id="jslitmus"> \
|
|
||||||
<button onclick="JSLitmus.runAll(event)">Run Tests</button> \
|
|
||||||
<button id="stop_button" disabled="disabled" onclick="JSLitmus.stop()">Stop Tests</button> \
|
|
||||||
<br \> \
|
|
||||||
<br \> \
|
|
||||||
<input type="checkbox" style="vertical-align: middle" id="test_normalize" checked="checked" onchange="JSLitmus.renderAll()""> Normalize results \
|
|
||||||
<table id="test_results"> \
|
|
||||||
<colgroup> \
|
|
||||||
<col /> \
|
|
||||||
<col width="100" /> \
|
|
||||||
</colgroup> \
|
|
||||||
<tr><th id="test_platform" colspan="2">' + platform + '</th></tr> \
|
|
||||||
<tr><th>Test</th><th>Ops/sec</th></tr> \
|
|
||||||
<tr id="test_row_template" class="test_row" style="display:none"> \
|
|
||||||
<td class="test_name"></td> \
|
|
||||||
<td class="test_result">Ready</td> \
|
|
||||||
</tr> \
|
|
||||||
</table> \
|
|
||||||
<div id="jsl_status"></div> \
|
|
||||||
<div id="chart" style="display:none"> \
|
|
||||||
<a id="chart_link" target="_blank"><img id="chart_image"></a> \
|
|
||||||
TinyURL (for chart): \
|
|
||||||
<iframe id="tiny_url" frameBorder="0" scrolling="no" src=""></iframe> \
|
|
||||||
</div> \
|
|
||||||
<a id="jslitmus_credit" title="JSLitmus home page" href="http://code.google.com/p/jslitmus" target="_blank">Powered by JSLitmus</a> \
|
|
||||||
</div>';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The public API for creating and running tests
|
|
||||||
*/
|
|
||||||
window.JSLitmus = {
|
|
||||||
/** The list of all tests that have been registered with JSLitmus.test */
|
|
||||||
_tests: [],
|
|
||||||
/** The queue of tests that need to be run */
|
|
||||||
_queue: [],
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The parsed query parameters the current page URL. This is provided as a
|
|
||||||
* convenience for test functions - it's not used by JSLitmus proper
|
|
||||||
*/
|
|
||||||
params: {},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize
|
|
||||||
*/
|
|
||||||
_init: function() {
|
|
||||||
// Parse query params into JSLitmus.params[] hash
|
|
||||||
var match = (location + '').match(/([^?#]*)(#.*)?$/);
|
|
||||||
if (match) {
|
|
||||||
var pairs = match[1].split('&');
|
|
||||||
for (var i = 0; i < pairs.length; i++) {
|
|
||||||
var pair = pairs[i].split('=');
|
|
||||||
if (pair.length > 1) {
|
|
||||||
var key = pair.shift();
|
|
||||||
var value = pair.length > 1 ? pair.join('=') : pair[0];
|
|
||||||
this.params[key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write out the stylesheet. We have to do this here because IE
|
|
||||||
// doesn't honor sheets written after the document has loaded.
|
|
||||||
document.write(STYLESHEET);
|
|
||||||
|
|
||||||
// Setup the rest of the UI once the document is loaded
|
|
||||||
if (window.addEventListener) {
|
|
||||||
window.addEventListener('load', this._setup, false);
|
|
||||||
} else if (document.addEventListener) {
|
|
||||||
document.addEventListener('load', this._setup, false);
|
|
||||||
} else if (window.attachEvent) {
|
|
||||||
window.attachEvent('onload', this._setup);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set up the UI
|
|
||||||
*/
|
|
||||||
_setup: function() {
|
|
||||||
var el = jsl.$('jslitmus_container');
|
|
||||||
if (!el) document.body.appendChild(el = document.createElement('div'));
|
|
||||||
|
|
||||||
el.innerHTML = MARKUP;
|
|
||||||
|
|
||||||
// Render the UI for all our tests
|
|
||||||
for (var i=0; i < JSLitmus._tests.length; i++)
|
|
||||||
JSLitmus.renderTest(JSLitmus._tests[i]);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* (Re)render all the test results
|
|
||||||
*/
|
|
||||||
renderAll: function() {
|
|
||||||
for (var i = 0; i < JSLitmus._tests.length; i++)
|
|
||||||
JSLitmus.renderTest(JSLitmus._tests[i]);
|
|
||||||
JSLitmus.renderChart();
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* (Re)render the chart graphics
|
|
||||||
*/
|
|
||||||
renderChart: function() {
|
|
||||||
var url = JSLitmus.chartUrl();
|
|
||||||
jsl.$('chart_link').href = url;
|
|
||||||
jsl.$('chart_image').src = url;
|
|
||||||
jsl.$('chart').style.display = '';
|
|
||||||
|
|
||||||
// Update the tiny URL
|
|
||||||
jsl.$('tiny_url').src = 'http://tinyurl.com/api-create.php?url='+escape(url);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* (Re)render the results for a specific test
|
|
||||||
*/
|
|
||||||
renderTest: function(test) {
|
|
||||||
// Make a new row if needed
|
|
||||||
if (!test._row) {
|
|
||||||
var trow = jsl.$('test_row_template');
|
|
||||||
if (!trow) return;
|
|
||||||
|
|
||||||
test._row = trow.cloneNode(true);
|
|
||||||
test._row.style.display = '';
|
|
||||||
test._row.id = '';
|
|
||||||
test._row.onclick = function() {JSLitmus._queueTest(test);};
|
|
||||||
test._row.title = 'Run ' + test.name + ' test';
|
|
||||||
trow.parentNode.appendChild(test._row);
|
|
||||||
test._row.cells[0].innerHTML = test.name;
|
|
||||||
}
|
|
||||||
|
|
||||||
var cell = test._row.cells[1];
|
|
||||||
var cns = [test.loopArg ? 'test_looping' : 'test_nonlooping'];
|
|
||||||
|
|
||||||
if (test.error) {
|
|
||||||
cns.push('test_error');
|
|
||||||
cell.innerHTML =
|
|
||||||
'<div class="error_head">' + test.error + '</div>' +
|
|
||||||
'<ul class="error_body"><li>' +
|
|
||||||
jsl.join(test.error, ': ', '</li><li>') +
|
|
||||||
'</li></ul>';
|
|
||||||
} else {
|
|
||||||
if (test.running) {
|
|
||||||
cns.push('test_running');
|
|
||||||
cell.innerHTML = 'running';
|
|
||||||
} else if (jsl.indexOf(JSLitmus._queue, test) >= 0) {
|
|
||||||
cns.push('test_pending');
|
|
||||||
cell.innerHTML = 'pending';
|
|
||||||
} else if (test.count) {
|
|
||||||
cns.push('test_done');
|
|
||||||
var hz = test.getHz(jsl.$('test_normalize').checked);
|
|
||||||
cell.innerHTML = hz != Infinity ? hz : '∞';
|
|
||||||
cell.title = 'Looped ' + test.count + ' times in ' + test.time + ' seconds';
|
|
||||||
} else {
|
|
||||||
cell.innerHTML = 'ready';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cell.className = cns.join(' ');
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new test
|
|
||||||
*/
|
|
||||||
test: function(name, f) {
|
|
||||||
// Create the Test object
|
|
||||||
var test = new Test(name, f);
|
|
||||||
JSLitmus._tests.push(test);
|
|
||||||
|
|
||||||
// Re-render if the test state changes
|
|
||||||
test.onChange = JSLitmus.renderTest;
|
|
||||||
|
|
||||||
// Run the next test if this one finished
|
|
||||||
test.onStop = function(test) {
|
|
||||||
if (JSLitmus.onTestFinish) JSLitmus.onTestFinish(test);
|
|
||||||
JSLitmus.currentTest = null;
|
|
||||||
JSLitmus._nextTest();
|
|
||||||
};
|
|
||||||
|
|
||||||
// Render the new test
|
|
||||||
this.renderTest(test);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add all tests to the run queue
|
|
||||||
*/
|
|
||||||
runAll: function(e) {
|
|
||||||
e = e || window.event;
|
|
||||||
var reverse = e && e.shiftKey, len = JSLitmus._tests.length;
|
|
||||||
for (var i = 0; i < len; i++) {
|
|
||||||
JSLitmus._queueTest(JSLitmus._tests[!reverse ? i : (len - i - 1)]);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove all tests from the run queue. The current test has to finish on
|
|
||||||
* it's own though
|
|
||||||
*/
|
|
||||||
stop: function() {
|
|
||||||
while (JSLitmus._queue.length) {
|
|
||||||
var test = JSLitmus._queue.shift();
|
|
||||||
JSLitmus.renderTest(test);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run the next test in the run queue
|
|
||||||
*/
|
|
||||||
_nextTest: function() {
|
|
||||||
if (!JSLitmus.currentTest) {
|
|
||||||
var test = JSLitmus._queue.shift();
|
|
||||||
if (test) {
|
|
||||||
jsl.$('stop_button').disabled = false;
|
|
||||||
JSLitmus.currentTest = test;
|
|
||||||
test.run();
|
|
||||||
JSLitmus.renderTest(test);
|
|
||||||
if (JSLitmus.onTestStart) JSLitmus.onTestStart(test);
|
|
||||||
} else {
|
|
||||||
jsl.$('stop_button').disabled = true;
|
|
||||||
JSLitmus.renderChart();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a test to the run queue
|
|
||||||
*/
|
|
||||||
_queueTest: function(test) {
|
|
||||||
if (jsl.indexOf(JSLitmus._queue, test) >= 0) return;
|
|
||||||
JSLitmus._queue.push(test);
|
|
||||||
JSLitmus.renderTest(test);
|
|
||||||
JSLitmus._nextTest();
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate a Google Chart URL that shows the data for all tests
|
|
||||||
*/
|
|
||||||
chartUrl: function() {
|
|
||||||
var n = JSLitmus._tests.length, markers = [], data = [];
|
|
||||||
var d, min = 0, max = -1e10;
|
|
||||||
var normalize = jsl.$('test_normalize').checked;
|
|
||||||
|
|
||||||
// Gather test data
|
|
||||||
for (var i=0; i < JSLitmus._tests.length; i++) {
|
|
||||||
var test = JSLitmus._tests[i];
|
|
||||||
if (test.count) {
|
|
||||||
var hz = test.getHz(normalize);
|
|
||||||
var v = hz != Infinity ? hz : 0;
|
|
||||||
data.push(v);
|
|
||||||
markers.push('t' + jsl.escape(test.name + '(' + jsl.toLabel(hz)+ ')') + ',000000,0,' +
|
|
||||||
markers.length + ',10');
|
|
||||||
max = Math.max(v, max);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (markers.length <= 0) return null;
|
|
||||||
|
|
||||||
// Build chart title
|
|
||||||
var title = document.getElementsByTagName('title');
|
|
||||||
title = (title && title.length) ? title[0].innerHTML : null;
|
|
||||||
var chart_title = [];
|
|
||||||
if (title) chart_title.push(title);
|
|
||||||
chart_title.push('Ops/sec (' + platform + ')');
|
|
||||||
|
|
||||||
// Build labels
|
|
||||||
var labels = [jsl.toLabel(min), jsl.toLabel(max)];
|
|
||||||
|
|
||||||
var w = 250, bw = 15;
|
|
||||||
var bs = 5;
|
|
||||||
var h = markers.length*(bw + bs) + 30 + chart_title.length*20;
|
|
||||||
|
|
||||||
var params = {
|
|
||||||
chtt: escape(chart_title.join('|')),
|
|
||||||
chts: '000000,10',
|
|
||||||
cht: 'bhg', // chart type
|
|
||||||
chd: 't:' + data.join(','), // data set
|
|
||||||
chds: min + ',' + max, // max/min of data
|
|
||||||
chxt: 'x', // label axes
|
|
||||||
chxl: '0:|' + labels.join('|'), // labels
|
|
||||||
chsp: '0,1',
|
|
||||||
chm: markers.join('|'), // test names
|
|
||||||
chbh: [bw, 0, bs].join(','), // bar widths
|
|
||||||
// chf: 'bg,lg,0,eeeeee,0,eeeeee,.5,ffffff,1', // gradient
|
|
||||||
chs: w + 'x' + h
|
|
||||||
};
|
|
||||||
return 'http://chart.apis.google.com/chart?' + jsl.join(params, '=', '&');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
JSLitmus._init();
|
|
||||||
})();
|
|
||||||
236
vendor/backbone/test/vendor/qunit.css
vendored
236
vendor/backbone/test/vendor/qunit.css
vendored
@@ -1,236 +0,0 @@
|
|||||||
/**
|
|
||||||
* QUnit v1.8.0 - A JavaScript Unit Testing Framework
|
|
||||||
*
|
|
||||||
* http://docs.jquery.com/QUnit
|
|
||||||
*
|
|
||||||
* Copyright (c) 2012 John Resig, Jörn Zaefferer
|
|
||||||
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
|
||||||
* or GPL (GPL-LICENSE.txt) licenses.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** Font Family and Sizes */
|
|
||||||
|
|
||||||
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
|
|
||||||
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
|
|
||||||
#qunit-tests { font-size: smaller; }
|
|
||||||
|
|
||||||
|
|
||||||
/** Resets */
|
|
||||||
|
|
||||||
#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Header */
|
|
||||||
|
|
||||||
#qunit-header {
|
|
||||||
padding: 0.5em 0 0.5em 1em;
|
|
||||||
|
|
||||||
color: #8699a4;
|
|
||||||
background-color: #0d3349;
|
|
||||||
|
|
||||||
font-size: 1.5em;
|
|
||||||
line-height: 1em;
|
|
||||||
font-weight: normal;
|
|
||||||
|
|
||||||
border-radius: 15px 15px 0 0;
|
|
||||||
-moz-border-radius: 15px 15px 0 0;
|
|
||||||
-webkit-border-top-right-radius: 15px;
|
|
||||||
-webkit-border-top-left-radius: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-header a {
|
|
||||||
text-decoration: none;
|
|
||||||
color: #c2ccd1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-header a:hover,
|
|
||||||
#qunit-header a:focus {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-header label {
|
|
||||||
display: inline-block;
|
|
||||||
padding-left: 0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-banner {
|
|
||||||
height: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-testrunner-toolbar {
|
|
||||||
padding: 0.5em 0 0.5em 2em;
|
|
||||||
color: #5E740B;
|
|
||||||
background-color: #eee;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-userAgent {
|
|
||||||
padding: 0.5em 0 0.5em 2.5em;
|
|
||||||
background-color: #2b81af;
|
|
||||||
color: #fff;
|
|
||||||
text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Tests: Pass/Fail */
|
|
||||||
|
|
||||||
#qunit-tests {
|
|
||||||
list-style-position: inside;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests li {
|
|
||||||
padding: 0.4em 0.5em 0.4em 2.5em;
|
|
||||||
border-bottom: 1px solid #fff;
|
|
||||||
list-style-position: inside;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests li strong {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests li a {
|
|
||||||
padding: 0.5em;
|
|
||||||
color: #c2ccd1;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
#qunit-tests li a:hover,
|
|
||||||
#qunit-tests li a:focus {
|
|
||||||
color: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests ol {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
padding: 0.5em;
|
|
||||||
|
|
||||||
background-color: #fff;
|
|
||||||
|
|
||||||
border-radius: 15px;
|
|
||||||
-moz-border-radius: 15px;
|
|
||||||
-webkit-border-radius: 15px;
|
|
||||||
|
|
||||||
box-shadow: inset 0px 2px 13px #999;
|
|
||||||
-moz-box-shadow: inset 0px 2px 13px #999;
|
|
||||||
-webkit-box-shadow: inset 0px 2px 13px #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
margin-top: .2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests th {
|
|
||||||
text-align: right;
|
|
||||||
vertical-align: top;
|
|
||||||
padding: 0 .5em 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests td {
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests pre {
|
|
||||||
margin: 0;
|
|
||||||
white-space: pre-wrap;
|
|
||||||
word-wrap: break-word;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests del {
|
|
||||||
background-color: #e0f2be;
|
|
||||||
color: #374e0c;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests ins {
|
|
||||||
background-color: #ffcaca;
|
|
||||||
color: #500;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*** Test Counts */
|
|
||||||
|
|
||||||
#qunit-tests b.counts { color: black; }
|
|
||||||
#qunit-tests b.passed { color: #5E740B; }
|
|
||||||
#qunit-tests b.failed { color: #710909; }
|
|
||||||
|
|
||||||
#qunit-tests li li {
|
|
||||||
margin: 0.5em;
|
|
||||||
padding: 0.4em 0.5em 0.4em 0.5em;
|
|
||||||
background-color: #fff;
|
|
||||||
border-bottom: none;
|
|
||||||
list-style-position: inside;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*** Passing Styles */
|
|
||||||
|
|
||||||
#qunit-tests li li.pass {
|
|
||||||
color: #5E740B;
|
|
||||||
background-color: #fff;
|
|
||||||
border-left: 26px solid #C6E746;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
|
|
||||||
#qunit-tests .pass .test-name { color: #366097; }
|
|
||||||
|
|
||||||
#qunit-tests .pass .test-actual,
|
|
||||||
#qunit-tests .pass .test-expected { color: #999999; }
|
|
||||||
|
|
||||||
#qunit-banner.qunit-pass { background-color: #C6E746; }
|
|
||||||
|
|
||||||
/*** Failing Styles */
|
|
||||||
|
|
||||||
#qunit-tests li li.fail {
|
|
||||||
color: #710909;
|
|
||||||
background-color: #fff;
|
|
||||||
border-left: 26px solid #EE5757;
|
|
||||||
white-space: pre;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests > li:last-child {
|
|
||||||
border-radius: 0 0 15px 15px;
|
|
||||||
-moz-border-radius: 0 0 15px 15px;
|
|
||||||
-webkit-border-bottom-right-radius: 15px;
|
|
||||||
-webkit-border-bottom-left-radius: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qunit-tests .fail { color: #000000; background-color: #EE5757; }
|
|
||||||
#qunit-tests .fail .test-name,
|
|
||||||
#qunit-tests .fail .module-name { color: #000000; }
|
|
||||||
|
|
||||||
#qunit-tests .fail .test-actual { color: #EE5757; }
|
|
||||||
#qunit-tests .fail .test-expected { color: green; }
|
|
||||||
|
|
||||||
#qunit-banner.qunit-fail { background-color: #EE5757; }
|
|
||||||
|
|
||||||
|
|
||||||
/** Result */
|
|
||||||
|
|
||||||
#qunit-testresult {
|
|
||||||
padding: 0.5em 0.5em 0.5em 2.5em;
|
|
||||||
|
|
||||||
color: #2b81af;
|
|
||||||
background-color: #D2E0E6;
|
|
||||||
|
|
||||||
border-bottom: 1px solid white;
|
|
||||||
}
|
|
||||||
#qunit-testresult .module-name {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Fixture */
|
|
||||||
|
|
||||||
#qunit-fixture {
|
|
||||||
position: absolute;
|
|
||||||
top: -10000px;
|
|
||||||
left: -10000px;
|
|
||||||
width: 1000px;
|
|
||||||
height: 1000px;
|
|
||||||
}
|
|
||||||
1863
vendor/backbone/test/vendor/qunit.js
vendored
1863
vendor/backbone/test/vendor/qunit.js
vendored
File diff suppressed because it is too large
Load Diff
584
vendor/backbone/test/view.js
vendored
584
vendor/backbone/test/view.js
vendored
@@ -1,141 +1,259 @@
|
|||||||
$(document).ready(function() {
|
(function() {
|
||||||
|
|
||||||
var view;
|
var view;
|
||||||
|
|
||||||
module("Backbone.View", {
|
QUnit.module('Backbone.View', {
|
||||||
|
|
||||||
|
beforeEach: function(assert) {
|
||||||
|
$('#qunit-fixture').append(
|
||||||
|
'<div id="testElement"><h1>Test</h1></div>'
|
||||||
|
);
|
||||||
|
|
||||||
setup: function() {
|
|
||||||
view = new Backbone.View({
|
view = new Backbone.View({
|
||||||
id : 'test-view',
|
id: 'test-view',
|
||||||
className : 'test-view'
|
className: 'test-view',
|
||||||
|
other: 'non-special-option'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: constructor", 4, function() {
|
QUnit.test('constructor', function(assert) {
|
||||||
equal(view.el.id, 'test-view');
|
assert.expect(3);
|
||||||
equal(view.el.className, 'test-view');
|
assert.equal(view.el.id, 'test-view');
|
||||||
equal(view.options.id, 'test-view');
|
assert.equal(view.el.className, 'test-view');
|
||||||
equal(view.options.className, 'test-view');
|
assert.equal(view.el.other, void 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: jQuery", 2, function() {
|
QUnit.test('$', function(assert) {
|
||||||
view.setElement(document.body);
|
assert.expect(2);
|
||||||
ok(view.$('#qunit-header a').get(0).innerHTML.match(/Backbone Test Suite/));
|
var myView = new Backbone.View;
|
||||||
ok(view.$('#qunit-header a').get(1).innerHTML.match(/Backbone Speed Suite/));
|
myView.setElement('<p><a><b>test</b></a></p>');
|
||||||
|
var result = myView.$('a b');
|
||||||
|
|
||||||
|
assert.strictEqual(result[0].innerHTML, 'test');
|
||||||
|
assert.ok(result.length === +result.length);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: make", 3, function() {
|
QUnit.test('$el', function(assert) {
|
||||||
var div = view.make('div', {id: 'test-div'}, "one two three");
|
assert.expect(3);
|
||||||
equal(div.tagName.toLowerCase(), 'div');
|
var myView = new Backbone.View;
|
||||||
equal(div.id, 'test-div');
|
myView.setElement('<p><a><b>test</b></a></p>');
|
||||||
equal($(div).text(), 'one two three');
|
assert.strictEqual(myView.el.nodeType, 1);
|
||||||
|
|
||||||
|
assert.ok(myView.$el instanceof Backbone.$);
|
||||||
|
assert.strictEqual(myView.$el[0], myView.el);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: make can take falsy values for content", 2, function() {
|
QUnit.test('initialize', function(assert) {
|
||||||
var div = view.make('div', {id: 'test-div'}, 0);
|
assert.expect(1);
|
||||||
equal($(div).text(), '0');
|
|
||||||
|
|
||||||
var div = view.make('div', {id: 'test-div'}, '');
|
|
||||||
equal($(div).text(), '');
|
|
||||||
});
|
|
||||||
|
|
||||||
test("View: initialize", 1, function() {
|
|
||||||
var View = Backbone.View.extend({
|
var View = Backbone.View.extend({
|
||||||
initialize: function() {
|
initialize: function() {
|
||||||
this.one = 1;
|
this.one = 1;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var view = new View;
|
|
||||||
equal(view.one, 1);
|
assert.strictEqual(new View().one, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: delegateEvents", 6, function() {
|
QUnit.test('render', function(assert) {
|
||||||
var counter = 0;
|
assert.expect(1);
|
||||||
var counter2 = 0;
|
var myView = new Backbone.View;
|
||||||
view.setElement(document.body);
|
assert.equal(myView.render(), myView, '#render returns the view instance');
|
||||||
view.increment = function(){ counter++; };
|
|
||||||
view.$el.bind('click', function(){ counter2++; });
|
|
||||||
var events = {"click #qunit-banner": "increment"};
|
|
||||||
view.delegateEvents(events);
|
|
||||||
$('#qunit-banner').trigger('click');
|
|
||||||
equal(counter, 1);
|
|
||||||
equal(counter2, 1);
|
|
||||||
$('#qunit-banner').trigger('click');
|
|
||||||
equal(counter, 2);
|
|
||||||
equal(counter2, 2);
|
|
||||||
view.delegateEvents(events);
|
|
||||||
$('#qunit-banner').trigger('click');
|
|
||||||
equal(counter, 3);
|
|
||||||
equal(counter2, 3);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: delegateEvents allows functions for callbacks", 3, function() {
|
QUnit.test('delegateEvents', function(assert) {
|
||||||
view.counter = 0;
|
assert.expect(6);
|
||||||
view.setElement("#qunit-banner");
|
var counter1 = 0, counter2 = 0;
|
||||||
var events = {"click": function() { this.counter++; }};
|
|
||||||
view.delegateEvents(events);
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
$('#qunit-banner').trigger('click');
|
myView.increment = function(){ counter1++; };
|
||||||
equal(view.counter, 1);
|
myView.$el.on('click', function(){ counter2++; });
|
||||||
$('#qunit-banner').trigger('click');
|
|
||||||
equal(view.counter, 2);
|
var events = {'click h1': 'increment'};
|
||||||
view.delegateEvents(events);
|
|
||||||
$('#qunit-banner').trigger('click');
|
myView.delegateEvents(events);
|
||||||
equal(view.counter, 3);
|
myView.$('h1').trigger('click');
|
||||||
|
assert.equal(counter1, 1);
|
||||||
|
assert.equal(counter2, 1);
|
||||||
|
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
assert.equal(counter1, 2);
|
||||||
|
assert.equal(counter2, 2);
|
||||||
|
|
||||||
|
myView.delegateEvents(events);
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
assert.equal(counter1, 3);
|
||||||
|
assert.equal(counter2, 3);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: undelegateEvents", 6, function() {
|
QUnit.test('delegate', function(assert) {
|
||||||
var counter = 0;
|
assert.expect(3);
|
||||||
var counter2 = 0;
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
view.setElement(document.body);
|
myView.delegate('click', 'h1', function() {
|
||||||
view.increment = function(){ counter++; };
|
assert.ok(true);
|
||||||
$(view.el).unbind('click');
|
});
|
||||||
$(view.el).bind('click', function(){ counter2++; });
|
myView.delegate('click', function() {
|
||||||
var events = {"click #qunit-userAgent": "increment"};
|
assert.ok(true);
|
||||||
view.delegateEvents(events);
|
});
|
||||||
$('#qunit-userAgent').trigger('click');
|
myView.$('h1').trigger('click');
|
||||||
equal(counter, 1);
|
|
||||||
equal(counter2, 1);
|
assert.equal(myView.delegate(), myView, '#delegate returns the view instance');
|
||||||
view.undelegateEvents();
|
|
||||||
$('#qunit-userAgent').trigger('click');
|
|
||||||
equal(counter, 1);
|
|
||||||
equal(counter2, 2);
|
|
||||||
view.delegateEvents(events);
|
|
||||||
$('#qunit-userAgent').trigger('click');
|
|
||||||
equal(counter, 2);
|
|
||||||
equal(counter2, 3);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: _ensureElement with DOM node el", 1, function() {
|
QUnit.test('delegateEvents allows functions for callbacks', function(assert) {
|
||||||
var ViewClass = Backbone.View.extend({
|
assert.expect(3);
|
||||||
|
var myView = new Backbone.View({el: '<p></p>'});
|
||||||
|
myView.counter = 0;
|
||||||
|
|
||||||
|
var events = {
|
||||||
|
click: function() {
|
||||||
|
this.counter++;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
myView.delegateEvents(events);
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
assert.equal(myView.counter, 1);
|
||||||
|
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
assert.equal(myView.counter, 2);
|
||||||
|
|
||||||
|
myView.delegateEvents(events);
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
assert.equal(myView.counter, 3);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
QUnit.test('delegateEvents ignore undefined methods', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
|
var myView = new Backbone.View({el: '<p></p>'});
|
||||||
|
myView.delegateEvents({'click': 'undefinedMethod'});
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('undelegateEvents', function(assert) {
|
||||||
|
assert.expect(7);
|
||||||
|
var counter1 = 0, counter2 = 0;
|
||||||
|
|
||||||
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
|
myView.increment = function(){ counter1++; };
|
||||||
|
myView.$el.on('click', function(){ counter2++; });
|
||||||
|
|
||||||
|
var events = {'click h1': 'increment'};
|
||||||
|
|
||||||
|
myView.delegateEvents(events);
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
assert.equal(counter1, 1);
|
||||||
|
assert.equal(counter2, 1);
|
||||||
|
|
||||||
|
myView.undelegateEvents();
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
assert.equal(counter1, 1);
|
||||||
|
assert.equal(counter2, 2);
|
||||||
|
|
||||||
|
myView.delegateEvents(events);
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
assert.equal(counter1, 2);
|
||||||
|
assert.equal(counter2, 3);
|
||||||
|
|
||||||
|
assert.equal(myView.undelegateEvents(), myView, '#undelegateEvents returns the view instance');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('undelegate', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
|
myView.delegate('click', function() { assert.ok(false); });
|
||||||
|
myView.delegate('click', 'h1', function() { assert.ok(false); });
|
||||||
|
|
||||||
|
myView.undelegate('click');
|
||||||
|
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
|
||||||
|
assert.equal(myView.undelegate(), myView, '#undelegate returns the view instance');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('undelegate with passed handler', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
|
var listener = function() { assert.ok(false); };
|
||||||
|
myView.delegate('click', listener);
|
||||||
|
myView.delegate('click', function() { assert.ok(true); });
|
||||||
|
myView.undelegate('click', listener);
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('undelegate with selector', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
|
myView.delegate('click', function() { assert.ok(true); });
|
||||||
|
myView.delegate('click', 'h1', function() { assert.ok(false); });
|
||||||
|
myView.undelegate('click', 'h1');
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('undelegate with handler and selector', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var myView = new Backbone.View({el: '#testElement'});
|
||||||
|
myView.delegate('click', function() { assert.ok(true); });
|
||||||
|
var handler = function(){ assert.ok(false); };
|
||||||
|
myView.delegate('click', 'h1', handler);
|
||||||
|
myView.undelegate('click', 'h1', handler);
|
||||||
|
myView.$('h1').trigger('click');
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('tagName can be provided as a string', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
tagName: 'span'
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.equal(new View().el.tagName, 'SPAN');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('tagName can be provided as a function', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
tagName: function() {
|
||||||
|
return 'p';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.ok(new View().$el.is('p'));
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('_ensureElement with DOM node el', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
el: document.body
|
el: document.body
|
||||||
});
|
});
|
||||||
var view = new ViewClass;
|
|
||||||
equal(view.el, document.body);
|
assert.equal(new View().el, document.body);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: _ensureElement with string el", 3, function() {
|
QUnit.test('_ensureElement with string el', function(assert) {
|
||||||
var ViewClass = Backbone.View.extend({
|
assert.expect(3);
|
||||||
el: "body"
|
var View = Backbone.View.extend({
|
||||||
|
el: 'body'
|
||||||
});
|
});
|
||||||
var view = new ViewClass;
|
assert.strictEqual(new View().el, document.body);
|
||||||
strictEqual(view.el, document.body);
|
|
||||||
|
|
||||||
ViewClass = Backbone.View.extend({
|
View = Backbone.View.extend({
|
||||||
el: "#testElement > h1"
|
el: '#testElement > h1'
|
||||||
});
|
});
|
||||||
view = new ViewClass;
|
assert.strictEqual(new View().el, $('#testElement > h1').get(0));
|
||||||
strictEqual(view.el, $("#testElement > h1").get(0));
|
|
||||||
|
|
||||||
ViewClass = Backbone.View.extend({
|
View = Backbone.View.extend({
|
||||||
el: "#nonexistent"
|
el: '#nonexistent'
|
||||||
});
|
});
|
||||||
view = new ViewClass;
|
assert.ok(!new View().el);
|
||||||
ok(!view.el);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: with className and id functions", 2, function() {
|
QUnit.test('with className and id functions', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
var View = Backbone.View.extend({
|
var View = Backbone.View.extend({
|
||||||
className: function() {
|
className: function() {
|
||||||
return 'className';
|
return 'className';
|
||||||
@@ -144,125 +262,229 @@ $(document).ready(function() {
|
|||||||
return 'id';
|
return 'id';
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var view = new View();
|
|
||||||
strictEqual(view.el.className, 'className');
|
assert.strictEqual(new View().el.className, 'className');
|
||||||
strictEqual(view.el.id, 'id');
|
assert.strictEqual(new View().el.id, 'id');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: with attributes", 2, function() {
|
QUnit.test('with attributes', function(assert) {
|
||||||
var view = new Backbone.View({attributes : {'class': 'one', id: 'two'}});
|
assert.expect(2);
|
||||||
equal(view.el.className, 'one');
|
var View = Backbone.View.extend({
|
||||||
equal(view.el.id, 'two');
|
attributes: {
|
||||||
|
'id': 'id',
|
||||||
|
'class': 'class'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.strictEqual(new View().el.className, 'class');
|
||||||
|
assert.strictEqual(new View().el.id, 'id');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: with attributes as a function", 1, function() {
|
QUnit.test('with attributes as a function', function(assert) {
|
||||||
var viewClass = Backbone.View.extend({
|
assert.expect(1);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
attributes: function() {
|
attributes: function() {
|
||||||
return {'class': 'dynamic'};
|
return {'class': 'dynamic'};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
equal((new viewClass).el.className, 'dynamic');
|
|
||||||
|
assert.strictEqual(new View().el.className, 'dynamic');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: multiple views per element", 3, function() {
|
QUnit.test('should default to className/id properties', function(assert) {
|
||||||
var count = 0, ViewClass = Backbone.View.extend({
|
assert.expect(4);
|
||||||
el: $("body"),
|
var View = Backbone.View.extend({
|
||||||
events: {
|
className: 'backboneClass',
|
||||||
"click": "click"
|
id: 'backboneId',
|
||||||
},
|
attributes: {
|
||||||
click: function() {
|
'class': 'attributeClass',
|
||||||
count++;
|
'id': 'attributeId'
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var view1 = new ViewClass;
|
var myView = new View;
|
||||||
$("body").trigger("click");
|
assert.strictEqual(myView.el.className, 'backboneClass');
|
||||||
equal(1, count);
|
assert.strictEqual(myView.el.id, 'backboneId');
|
||||||
|
assert.strictEqual(myView.$el.attr('class'), 'backboneClass');
|
||||||
|
assert.strictEqual(myView.$el.attr('id'), 'backboneId');
|
||||||
|
});
|
||||||
|
|
||||||
var view2 = new ViewClass;
|
QUnit.test('multiple views per element', function(assert) {
|
||||||
$("body").trigger("click");
|
assert.expect(3);
|
||||||
equal(3, count);
|
var count = 0;
|
||||||
|
var $el = $('<p></p>');
|
||||||
|
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
el: $el,
|
||||||
|
events: {
|
||||||
|
click: function() {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var view1 = new View;
|
||||||
|
$el.trigger('click');
|
||||||
|
assert.equal(1, count);
|
||||||
|
|
||||||
|
var view2 = new View;
|
||||||
|
$el.trigger('click');
|
||||||
|
assert.equal(3, count);
|
||||||
|
|
||||||
view1.delegateEvents();
|
view1.delegateEvents();
|
||||||
$("body").trigger("click");
|
$el.trigger('click');
|
||||||
equal(5, count);
|
assert.equal(5, count);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("View: custom events, with namespaces", 2, function() {
|
QUnit.test('custom events', function(assert) {
|
||||||
var count = 0;
|
assert.expect(2);
|
||||||
var ViewClass = Backbone.View.extend({
|
var View = Backbone.View.extend({
|
||||||
el: $('body'),
|
el: $('body'),
|
||||||
events: function() {
|
events: {
|
||||||
return {"fake$event.namespaced": "run"};
|
fake$event: function() { assert.ok(true); }
|
||||||
},
|
|
||||||
run: function() {
|
|
||||||
count++;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var view = new ViewClass;
|
var myView = new View;
|
||||||
$('body').trigger('fake$event').trigger('fake$event');
|
$('body').trigger('fake$event').trigger('fake$event');
|
||||||
equal(count, 2);
|
|
||||||
$('body').unbind('.namespaced');
|
$('body').off('fake$event');
|
||||||
$('body').trigger('fake$event');
|
$('body').trigger('fake$event');
|
||||||
equal(count, 2);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("#1048 - setElement uses provided object.", 2, function() {
|
QUnit.test('#1048 - setElement uses provided object.', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
var $el = $('body');
|
var $el = $('body');
|
||||||
var view = new Backbone.View({el: $el});
|
|
||||||
ok(view.$el === $el);
|
var myView = new Backbone.View({el: $el});
|
||||||
view.setElement($el = $($el));
|
assert.ok(myView.$el === $el);
|
||||||
ok(view.$el === $el);
|
|
||||||
|
myView.setElement($el = $($el));
|
||||||
|
assert.ok(myView.$el === $el);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("#986 - Undelegate before changing element.", 1, function() {
|
QUnit.test('#986 - Undelegate before changing element.', function(assert) {
|
||||||
var a = $('<button></button>');
|
assert.expect(1);
|
||||||
var b = $('<button></button>');
|
var button1 = $('<button></button>');
|
||||||
|
var button2 = $('<button></button>');
|
||||||
|
|
||||||
var View = Backbone.View.extend({
|
var View = Backbone.View.extend({
|
||||||
events: {click: function(e) { ok(view.el === e.target); }}
|
events: {
|
||||||
});
|
click: function(e) {
|
||||||
var view = new View({el: a});
|
assert.ok(myView.el === e.target);
|
||||||
view.setElement(b);
|
}
|
||||||
a.trigger('click');
|
|
||||||
b.trigger('click');
|
|
||||||
});
|
|
||||||
|
|
||||||
test("#1172 - Clone attributes object", 2, function() {
|
|
||||||
var View = Backbone.View.extend({attributes: {foo: 'bar'}});
|
|
||||||
var v1 = new View({id: 'foo'});
|
|
||||||
strictEqual(v1.el.id, 'foo');
|
|
||||||
var v2 = new View();
|
|
||||||
ok(!v2.el.id);
|
|
||||||
});
|
|
||||||
|
|
||||||
test("#1228 - tagName can be provided as a function", 1, function() {
|
|
||||||
var View = Backbone.View.extend({tagName: function(){ return 'p'; }});
|
|
||||||
ok(new View().$el.is('p'));
|
|
||||||
});
|
|
||||||
|
|
||||||
test("dispose", 0, function() {
|
|
||||||
var View = Backbone.View.extend({
|
|
||||||
events: {click: function(){ ok(false); }},
|
|
||||||
initialize: function() {
|
|
||||||
this.model.on('all x', function(){ ok(false); }, this);
|
|
||||||
this.collection.on('all x', function(){ ok(false); }, this);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var view = new View({
|
|
||||||
|
var myView = new View({el: button1});
|
||||||
|
myView.setElement(button2);
|
||||||
|
|
||||||
|
button1.trigger('click');
|
||||||
|
button2.trigger('click');
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('#1172 - Clone attributes object', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
attributes: {foo: 'bar'}
|
||||||
|
});
|
||||||
|
|
||||||
|
var view1 = new View({id: 'foo'});
|
||||||
|
assert.strictEqual(view1.el.id, 'foo');
|
||||||
|
|
||||||
|
var view2 = new View();
|
||||||
|
assert.ok(!view2.el.id);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('views stopListening', function(assert) {
|
||||||
|
assert.expect(0);
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
initialize: function() {
|
||||||
|
this.listenTo(this.model, 'all x', function(){ assert.ok(false); });
|
||||||
|
this.listenTo(this.collection, 'all x', function(){ assert.ok(false); });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var myView = new View({
|
||||||
model: new Backbone.Model,
|
model: new Backbone.Model,
|
||||||
collection: new Backbone.Collection
|
collection: new Backbone.Collection
|
||||||
});
|
});
|
||||||
view.dispose();
|
|
||||||
view.model.trigger('x');
|
myView.stopListening();
|
||||||
view.collection.trigger('x');
|
myView.model.trigger('x');
|
||||||
view.$el.click();
|
myView.collection.trigger('x');
|
||||||
});
|
});
|
||||||
|
|
||||||
test("view#remove calls dispose.", 1, function() {
|
QUnit.test('Provide function for el.', function(assert) {
|
||||||
var view = new Backbone.View();
|
assert.expect(2);
|
||||||
view.dispose = function() { ok(true); };
|
var View = Backbone.View.extend({
|
||||||
view.remove();
|
el: function() {
|
||||||
|
return '<p><a></a></p>';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var myView = new View;
|
||||||
|
assert.ok(myView.$el.is('p'));
|
||||||
|
assert.ok(myView.$el.has('a'));
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
QUnit.test('events passed in options', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
var counter = 0;
|
||||||
|
|
||||||
|
var View = Backbone.View.extend({
|
||||||
|
el: '#testElement',
|
||||||
|
increment: function() {
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var myView = new View({
|
||||||
|
events: {
|
||||||
|
'click h1': 'increment'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
myView.$('h1').trigger('click').trigger('click');
|
||||||
|
assert.equal(counter, 2);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('remove', function(assert) {
|
||||||
|
assert.expect(2);
|
||||||
|
var myView = new Backbone.View;
|
||||||
|
document.body.appendChild(view.el);
|
||||||
|
|
||||||
|
myView.delegate('click', function() { assert.ok(false); });
|
||||||
|
myView.listenTo(myView, 'all x', function() { assert.ok(false); });
|
||||||
|
|
||||||
|
assert.equal(myView.remove(), myView, '#remove returns the view instance');
|
||||||
|
myView.$el.trigger('click');
|
||||||
|
myView.trigger('x');
|
||||||
|
|
||||||
|
// In IE8 and below, parentNode still exists but is not document.body.
|
||||||
|
assert.notEqual(myView.el.parentNode, document.body);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('setElement', function(assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
var myView = new Backbone.View({
|
||||||
|
events: {
|
||||||
|
click: function() { assert.ok(false); }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
myView.events = {
|
||||||
|
click: function() { assert.ok(true); }
|
||||||
|
};
|
||||||
|
var oldEl = myView.el;
|
||||||
|
var $oldEl = myView.$el;
|
||||||
|
|
||||||
|
myView.setElement(document.createElement('div'));
|
||||||
|
|
||||||
|
$oldEl.click();
|
||||||
|
myView.$el.click();
|
||||||
|
|
||||||
|
assert.notEqual(oldEl, myView.el);
|
||||||
|
assert.notEqual($oldEl, myView.$el);
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
||||||
|
|||||||
22
vendor/benchmark.js/LICENSE.txt
vendored
22
vendor/benchmark.js/LICENSE.txt
vendored
@@ -1,22 +0,0 @@
|
|||||||
Copyright 2010-2012 Mathias Bynens <http://mathiasbynens.be/>
|
|
||||||
Based on JSLitmus.js, copyright Robert Kieffer <http://broofa.com/>
|
|
||||||
Modified by John-David Dalton <http://allyoucanleet.com/>
|
|
||||||
|
|
||||||
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.
|
|
||||||
135
vendor/benchmark.js/README.md
vendored
135
vendor/benchmark.js/README.md
vendored
@@ -1,135 +0,0 @@
|
|||||||
# Benchmark.js <sup>v1.0.0</sup>
|
|
||||||
|
|
||||||
A [robust](http://calendar.perfplanet.com/2010/bulletproof-javascript-benchmarks/ "Bulletproof JavaScript benchmarks") benchmarking library that works on nearly all JavaScript platforms<sup><a name="fnref1" href="#fn1">1</a></sup>, supports high-resolution timers, and returns statistically significant results. As seen on [jsPerf](http://jsperf.com/).
|
|
||||||
|
|
||||||
## Download
|
|
||||||
|
|
||||||
* [Development source](https://raw.github.com/bestiejs/benchmark.js/v1.0.0/benchmark.js)
|
|
||||||
|
|
||||||
## Dive in
|
|
||||||
|
|
||||||
We’ve got [API docs](http://benchmarkjs.com/docs) and [unit tests](http://benchmarkjs.com/tests).
|
|
||||||
|
|
||||||
For a list of upcoming features, check out our [roadmap](https://github.com/bestiejs/benchmark.js/wiki/Roadmap).
|
|
||||||
|
|
||||||
## Support
|
|
||||||
|
|
||||||
Benchmark.js has been tested in at least Adobe AIR 3.1, Chrome 5-21, Firefox 1.5-13, IE 6-9, Opera 9.25-12.01, Safari 3-6, Node.js 0.8.7, Narwhal 0.3.2, RingoJS 0.8, and Rhino 1.7RC5.
|
|
||||||
|
|
||||||
## Installation and usage
|
|
||||||
|
|
||||||
In a browser or Adobe AIR:
|
|
||||||
|
|
||||||
```html
|
|
||||||
<script src="benchmark.js"></script>
|
|
||||||
```
|
|
||||||
|
|
||||||
Optionally, expose Java’s nanosecond timer by adding the `nano` applet to the `<body>`:
|
|
||||||
|
|
||||||
```html
|
|
||||||
<applet code="nano" archive="nano.jar"></applet>
|
|
||||||
```
|
|
||||||
|
|
||||||
Or enable Chrome’s microsecond timer by using the [command line switch](http://peter.sh/experiments/chromium-command-line-switches/#enable-benchmarking):
|
|
||||||
|
|
||||||
--enable-benchmarking
|
|
||||||
|
|
||||||
Via [npm](http://npmjs.org/):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm install benchmark
|
|
||||||
```
|
|
||||||
|
|
||||||
In [Node.js](http://nodejs.org/) and [RingoJS v0.8.0+](http://ringojs.org/):
|
|
||||||
|
|
||||||
```js
|
|
||||||
var Benchmark = require('benchmark');
|
|
||||||
```
|
|
||||||
|
|
||||||
Optionally, use the [microtime module](https://github.com/wadey/node-microtime) by Wade Simmons:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm install microtime
|
|
||||||
```
|
|
||||||
|
|
||||||
In [RingoJS v0.7.0-](http://ringojs.org/):
|
|
||||||
|
|
||||||
```js
|
|
||||||
var Benchmark = require('benchmark').Benchmark;
|
|
||||||
```
|
|
||||||
|
|
||||||
In [Rhino](http://www.mozilla.org/rhino/):
|
|
||||||
|
|
||||||
```js
|
|
||||||
load('benchmark.js');
|
|
||||||
```
|
|
||||||
|
|
||||||
In an AMD loader like [RequireJS](http://requirejs.org/):
|
|
||||||
|
|
||||||
```js
|
|
||||||
require({
|
|
||||||
'paths': {
|
|
||||||
'benchmark': 'path/to/benchmark'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
['benchmark'], function(Benchmark) {
|
|
||||||
console.log(Benchmark.version);
|
|
||||||
});
|
|
||||||
|
|
||||||
// or with platform.js
|
|
||||||
// https://github.com/bestiejs/platform.js
|
|
||||||
require({
|
|
||||||
'paths': {
|
|
||||||
'benchmark': 'path/to/benchmark',
|
|
||||||
'platform': 'path/to/platform'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
['benchmark', 'platform'], function(Benchmark, platform) {
|
|
||||||
Benchmark.platform = platform;
|
|
||||||
console.log(Benchmark.platform.name);
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
Usage example:
|
|
||||||
|
|
||||||
```js
|
|
||||||
var suite = new Benchmark.Suite;
|
|
||||||
|
|
||||||
// add tests
|
|
||||||
suite.add('RegExp#test', function() {
|
|
||||||
/o/.test('Hello World!');
|
|
||||||
})
|
|
||||||
.add('String#indexOf', function() {
|
|
||||||
'Hello World!'.indexOf('o') > -1;
|
|
||||||
})
|
|
||||||
// add listeners
|
|
||||||
.on('cycle', function(event) {
|
|
||||||
console.log(String(event.target));
|
|
||||||
})
|
|
||||||
.on('complete', function() {
|
|
||||||
console.log('Fastest is ' + this.filter('fastest').pluck('name'));
|
|
||||||
})
|
|
||||||
// run async
|
|
||||||
.run({ 'async': true });
|
|
||||||
|
|
||||||
// logs:
|
|
||||||
// > RegExp#test x 4,161,532 +-0.99% (59 cycles)
|
|
||||||
// > String#indexOf x 6,139,623 +-1.00% (131 cycles)
|
|
||||||
// > Fastest is String#indexOf
|
|
||||||
```
|
|
||||||
|
|
||||||
## BestieJS
|
|
||||||
|
|
||||||
Benchmark.js is part of the BestieJS *"Best in Class"* module collection. This means we promote solid browser/environment support, ES5 precedents, unit testing, and plenty of documentation.
|
|
||||||
|
|
||||||
## Authors
|
|
||||||
|
|
||||||
* [Mathias Bynens](http://mathiasbynens.be/)
|
|
||||||
[](https://twitter.com/mathias "Follow @mathias on Twitter")
|
|
||||||
* [John-David Dalton](http://allyoucanleet.com/)
|
|
||||||
[](https://twitter.com/jdalton "Follow @jdalton on Twitter")
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
* [Kit Cambridge](http://kitcambridge.github.com/)
|
|
||||||
[](https://twitter.com/kitcambridge "Follow @kitcambridge on Twitter")
|
|
||||||
3919
vendor/benchmark.js/benchmark.js
vendored
3919
vendor/benchmark.js/benchmark.js
vendored
File diff suppressed because it is too large
Load Diff
BIN
vendor/benchmark.js/nano.jar
vendored
BIN
vendor/benchmark.js/nano.jar
vendored
Binary file not shown.
20
vendor/docdown/LICENSE.txt
vendored
20
vendor/docdown/LICENSE.txt
vendored
@@ -1,20 +0,0 @@
|
|||||||
Copyright 2011-2012 John-David Dalton <http://allyoucanleet.com/>
|
|
||||||
|
|
||||||
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.
|
|
||||||
33
vendor/docdown/README.md
vendored
33
vendor/docdown/README.md
vendored
@@ -1,33 +0,0 @@
|
|||||||
# Docdown <sup>v1.0.0</sup>
|
|
||||||
|
|
||||||
A simple JSDoc to Markdown documentation generator.
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
The documentation for Docdown can be viewed here: [/doc/README.md](https://github.com/jdalton/docdown/blob/master/doc/README.md#readme)
|
|
||||||
|
|
||||||
For a list of upcoming features, check out our [roadmap](https://github.com/jdalton/docdown/wiki/Roadmap).
|
|
||||||
|
|
||||||
## Installation and usage
|
|
||||||
|
|
||||||
Usage example:
|
|
||||||
|
|
||||||
```php
|
|
||||||
require("docdown.php");
|
|
||||||
|
|
||||||
// generate Markdown
|
|
||||||
$markdown = docdown(array(
|
|
||||||
"path" => $filepath,
|
|
||||||
"url" => "https://github.com/username/project/blob/master/my.js"
|
|
||||||
));
|
|
||||||
```
|
|
||||||
|
|
||||||
## Author
|
|
||||||
|
|
||||||
* [John-David Dalton](http://allyoucanleet.com/)
|
|
||||||
[](https://twitter.com/jdalton "Follow @jdalton on Twitter")
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
* [Mathias Bynens](http://mathiasbynens.be/)
|
|
||||||
[](https://twitter.com/mathias "Follow @mathias on Twitter")
|
|
||||||
38
vendor/docdown/docdown.php
vendored
38
vendor/docdown/docdown.php
vendored
@@ -1,38 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*!
|
|
||||||
* Docdown v1.0.0-pre
|
|
||||||
* Copyright 2011-2012 John-David Dalton <http://allyoucanleet.com/>
|
|
||||||
* Available under MIT license <http://mths.be/mit>
|
|
||||||
*/
|
|
||||||
require(dirname(__FILE__) . '/src/DocDown/Generator.php');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates Markdown from JSDoc entries in a given file.
|
|
||||||
*
|
|
||||||
* @param {Array} [$options=array()] The options array.
|
|
||||||
* @returns {String} The generated Markdown.
|
|
||||||
* @example
|
|
||||||
*
|
|
||||||
* // specify a file path
|
|
||||||
* $markdown = docdown(array(
|
|
||||||
* // path to js file
|
|
||||||
* 'path' => $filepath,
|
|
||||||
* // url used to reference line numbers in code
|
|
||||||
* 'url' => 'https://github.com/username/project/blob/master/my.js'
|
|
||||||
* ));
|
|
||||||
*
|
|
||||||
* // or pass raw js
|
|
||||||
* $markdown = docdown(array(
|
|
||||||
* // raw JavaScript source
|
|
||||||
* 'source' => $rawJS,
|
|
||||||
* // documentation title
|
|
||||||
* 'title' => 'My API Documentation',
|
|
||||||
* // url used to reference line numbers in code
|
|
||||||
* 'url' => 'https://github.com/username/project/blob/master/my.js'
|
|
||||||
* ));
|
|
||||||
*/
|
|
||||||
function docdown( $options = array() ) {
|
|
||||||
$gen = new Generator($options);
|
|
||||||
return $gen->generate();
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
304
vendor/docdown/src/DocDown/Entry.php
vendored
304
vendor/docdown/src/DocDown/Entry.php
vendored
@@ -1,304 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A class to simplify parsing a single JSDoc entry.
|
|
||||||
*/
|
|
||||||
class Entry {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The documentation entry.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @type String
|
|
||||||
*/
|
|
||||||
public $entry = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The language highlighter used for code examples.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @type String
|
|
||||||
*/
|
|
||||||
public $lang = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The source code.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @type String
|
|
||||||
*/
|
|
||||||
public $source = '';
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Entry constructor.
|
|
||||||
*
|
|
||||||
* @constructor
|
|
||||||
* @param {String} $entry The documentation entry to analyse.
|
|
||||||
* @param {String} $source The source code.
|
|
||||||
* @param {String} $lang The language highlighter used for code examples.
|
|
||||||
*/
|
|
||||||
public function __construct( $entry, $source, $lang = 'js' ) {
|
|
||||||
$this->entry = $entry;
|
|
||||||
$this->lang = $lang;
|
|
||||||
$this->source = str_replace(PHP_EOL, "\n", $source);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the documentation entries from source code.
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
* @memberOf Entry
|
|
||||||
* @param {String} $source The source code.
|
|
||||||
* @returns {Array} The array of entries.
|
|
||||||
*/
|
|
||||||
public static function getEntries( $source ) {
|
|
||||||
preg_match_all('#/\*\*(?![-!])[\s\S]*?\*/\s*[^\n]+#', $source, $result);
|
|
||||||
return array_pop($result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the entry is a function reference.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {Boolean} Returns `true` if the entry is a function reference, else `false`.
|
|
||||||
*/
|
|
||||||
private function isFunction() {
|
|
||||||
return !!(
|
|
||||||
$this->isCtor() ||
|
|
||||||
count($this->getParams()) ||
|
|
||||||
count($this->getReturns()) ||
|
|
||||||
preg_match('/\*\s*@function\b/', $this->entry)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the function call from the entry.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {String} The function call.
|
|
||||||
*/
|
|
||||||
public function getCall() {
|
|
||||||
preg_match('#\*/\s*(?:function ([^(]*)|(.*?)(?=[:=,]|return\b))#', $this->entry, $result);
|
|
||||||
if ($result = array_pop($result)) {
|
|
||||||
$result = array_pop(explode('var ', trim(trim(array_pop(explode('.', $result))), "'")));
|
|
||||||
}
|
|
||||||
// resolve name
|
|
||||||
// avoid $this->getName() because it calls $this->getCall()
|
|
||||||
preg_match('#\*\s*@name\s+([^\n]+)#', $this->entry, $name);
|
|
||||||
if (count($name)) {
|
|
||||||
$name = trim($name[1]);
|
|
||||||
} else {
|
|
||||||
$name = $result;
|
|
||||||
}
|
|
||||||
// compile function call syntax
|
|
||||||
if ($this->isFunction()) {
|
|
||||||
// compose parts
|
|
||||||
$result = array($result);
|
|
||||||
$params = $this->getParams();
|
|
||||||
foreach ($params as $param) {
|
|
||||||
$result[] = $param[1];
|
|
||||||
}
|
|
||||||
// format
|
|
||||||
$result = $name .'('. implode(array_slice($result, 1), ', ') .')';
|
|
||||||
$result = str_replace(', [', ' [, ', str_replace('], [', ', ', $result));
|
|
||||||
}
|
|
||||||
return $result ? $result : $name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the entry description.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {String} The entry description.
|
|
||||||
*/
|
|
||||||
public function getDesc() {
|
|
||||||
preg_match('#/\*\*(?:\s*\*)?([\s\S]*?)(?=\*\s\@[a-z]|\*/)#', $this->entry, $result);
|
|
||||||
if (count($result)) {
|
|
||||||
$type = $this->getType();
|
|
||||||
$result = trim(preg_replace('/(?:^|\n)\s*\* ?/', ' ', $result[1]));
|
|
||||||
$result = ($type == 'Function' ? '' : '(' . str_replace('|', ', ', trim($type, '{}')) . '): ') . $result;
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the entry `example` data.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {String} The entry `example` data.
|
|
||||||
*/
|
|
||||||
public function getExample() {
|
|
||||||
preg_match('#\*\s*@example\s+([\s\S]*?)(?=\*\s\@[a-z]|\*/)#', $this->entry, $result);
|
|
||||||
if (count($result)) {
|
|
||||||
$result = trim(preg_replace('/(?:^|\n)\s*\* ?/', "\n", $result[1]));
|
|
||||||
$result = '```' . $this->lang . "\n" . $result . "\n```";
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resolves the line number of the entry.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {Number} The line number.
|
|
||||||
*/
|
|
||||||
public function getLineNumber() {
|
|
||||||
preg_match_all('/\n/', substr($this->source, 0, strrpos($this->source, $this->entry) + strlen($this->entry)), $lines);
|
|
||||||
return count(array_pop($lines)) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the entry `member` data.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @param {Number} $index The index of the array value to return.
|
|
||||||
* @returns {Array|String} The entry `member` data.
|
|
||||||
*/
|
|
||||||
public function getMembers( $index = null ) {
|
|
||||||
preg_match('#\*\s*@member(?:Of)?\s+([^\n]+)#', $this->entry, $result);
|
|
||||||
if (count($result)) {
|
|
||||||
$result = trim(preg_replace('/(?:^|\n)\s*\* ?/', ' ', $result[1]));
|
|
||||||
$result = preg_split('/,\s*/', $result);
|
|
||||||
}
|
|
||||||
return $index !== null ? @$result[$index] : $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the entry `name` data.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {String} The entry `name` data.
|
|
||||||
*/
|
|
||||||
public function getName() {
|
|
||||||
preg_match('#\*\s*@name\s+([^\n]+)#', $this->entry, $result);
|
|
||||||
if (count($result)) {
|
|
||||||
$result = trim(preg_replace('/(?:^|\n)\s*\* ?/', ' ', $result[1]));
|
|
||||||
} else {
|
|
||||||
$result = array_shift(explode('(', $this->getCall()));
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the entry `param` data.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @param {Number} $index The index of the array value to return.
|
|
||||||
* @returns {Array} The entry `param` data.
|
|
||||||
*/
|
|
||||||
public function getParams( $index = null ) {
|
|
||||||
preg_match_all('#\*\s*@param\s+\{([^}]+)\}\s+(\[.+\]|[$\w]+)\s+([\s\S]*?)(?=\*\s\@[a-z]|\*/)#i', $this->entry, $result);
|
|
||||||
if (count($result = array_filter(array_slice($result, 1)))) {
|
|
||||||
// repurpose array
|
|
||||||
foreach ($result as $param) {
|
|
||||||
foreach ($param as $key => $value) {
|
|
||||||
if (!is_array($result[0][$key])) {
|
|
||||||
$result[0][$key] = array();
|
|
||||||
}
|
|
||||||
$result[0][$key][] = trim(preg_replace('/(?:^|\n)\s*\* ?/', ' ', $value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$result = $result[0];
|
|
||||||
}
|
|
||||||
return $index !== null ? @$result[$index] : $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the entry `returns` data.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {String} The entry `returns` data.
|
|
||||||
*/
|
|
||||||
public function getReturns() {
|
|
||||||
preg_match('#\*\s*@returns\s+\{([^}]+)\}\s+([\s\S]*?)(?=\*\s\@[a-z]|\*/)#', $this->entry, $result);
|
|
||||||
if (count($result)) {
|
|
||||||
$result = array_map('trim', array_slice($result, 1));
|
|
||||||
$result[0] = str_replace('|', ', ', $result[0]);
|
|
||||||
$result[1] = preg_replace('/(?:^|\n)\s*\* ?/', ' ', $result[1]);
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the entry `type` data.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {String} The entry `type` data.
|
|
||||||
*/
|
|
||||||
public function getType() {
|
|
||||||
preg_match('#\*\s*@type\s+([^\n]+)#', $this->entry, $result);
|
|
||||||
if (count($result)) {
|
|
||||||
$result = trim(preg_replace('/(?:^|\n)\s*\* ?/', ' ', $result[1]));
|
|
||||||
} else {
|
|
||||||
$result = $this->isFunction() ? 'Function' : 'Unknown';
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if an entry is a constructor.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {Boolean} Returns true if a constructor, else false.
|
|
||||||
*/
|
|
||||||
public function isCtor() {
|
|
||||||
return !!preg_match('/\*\s*@constructor\b/', $this->entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if an entry *is* assigned to a prototype.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {Boolean} Returns true if assigned to a prototype, else false.
|
|
||||||
*/
|
|
||||||
public function isPlugin() {
|
|
||||||
return !$this->isCtor() && !$this->isPrivate() && !$this->isStatic();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if an entry is private.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {Boolean} Returns true if private, else false.
|
|
||||||
*/
|
|
||||||
public function isPrivate() {
|
|
||||||
return !!preg_match('/\*\s*@private\b/', $this->entry) || strrpos($this->entry, '@') === false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if an entry is *not* assigned to a prototype.
|
|
||||||
*
|
|
||||||
* @memberOf Entry
|
|
||||||
* @returns {Boolean} Returns true if not assigned to a prototype, else false.
|
|
||||||
*/
|
|
||||||
public function isStatic() {
|
|
||||||
$public = !$this->isPrivate();
|
|
||||||
$result = $public && !!preg_match('/\*\s*@static\b/', $this->entry);
|
|
||||||
|
|
||||||
// set in cases where it isn't explicitly stated
|
|
||||||
if ($public && !$result) {
|
|
||||||
if ($parent = array_pop(preg_split('/[#.]/', $this->getMembers(0)))) {
|
|
||||||
foreach (Entry::getEntries($this->source) as $entry) {
|
|
||||||
$entry = new Entry($entry, $this->source);
|
|
||||||
if ($entry->getName() == $parent) {
|
|
||||||
$result = !$entry->isCtor();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$result = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
416
vendor/docdown/src/DocDown/Generator.php
vendored
416
vendor/docdown/src/DocDown/Generator.php
vendored
@@ -1,416 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
require(dirname(__FILE__) . "/Entry.php");
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates Markdown from JSDoc entries.
|
|
||||||
*/
|
|
||||||
class Generator {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An array of JSDoc entries.
|
|
||||||
*
|
|
||||||
* @memberOf Generator
|
|
||||||
* @type Array
|
|
||||||
*/
|
|
||||||
public $entries = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An options array used to configure the generator.
|
|
||||||
*
|
|
||||||
* @memberOf Generator
|
|
||||||
* @type Array
|
|
||||||
*/
|
|
||||||
public $options = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The entire file's source code.
|
|
||||||
*
|
|
||||||
* @memberOf Generator
|
|
||||||
* @type String
|
|
||||||
*/
|
|
||||||
public $source = '';
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Generator constructor.
|
|
||||||
*
|
|
||||||
* @constructor
|
|
||||||
* @param {String} $source The source code to parse.
|
|
||||||
* @param {Array} $options The options array.
|
|
||||||
*/
|
|
||||||
public function __construct( $source, $options = array() ) {
|
|
||||||
// juggle arguments
|
|
||||||
if (is_array($source)) {
|
|
||||||
$options = $source;
|
|
||||||
} else {
|
|
||||||
$options['source'] = $source;
|
|
||||||
}
|
|
||||||
if (isset($options['source']) && realpath($options['source'])) {
|
|
||||||
$options['path'] = $options['source'];
|
|
||||||
}
|
|
||||||
if (isset($options['path'])) {
|
|
||||||
preg_match('/(?<=\.)[a-z]+$/', $options['path'], $ext);
|
|
||||||
$options['source'] = file_get_contents($options['path']);
|
|
||||||
$ext = array_pop($ext);
|
|
||||||
|
|
||||||
if (!isset($options['lang']) && $ext) {
|
|
||||||
$options['lang'] = $ext;
|
|
||||||
}
|
|
||||||
if (!isset($options['title'])) {
|
|
||||||
$options['title'] = ucfirst(basename($options['path'])) . ' API documentation';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!isset($options['lang'])) {
|
|
||||||
$options['lang'] = 'js';
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->options = $options;
|
|
||||||
$this->source = str_replace(PHP_EOL, "\n", $options['source']);
|
|
||||||
$this->entries = Entry::getEntries($this->source);
|
|
||||||
|
|
||||||
foreach ($this->entries as $index => $value) {
|
|
||||||
$this->entries[$index] = new Entry($value, $this->source, $options['lang']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Performs common string formatting operations.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @static
|
|
||||||
* @memberOf Generator
|
|
||||||
* @param {String} $string The string to format.
|
|
||||||
* @returns {String} The formatted string.
|
|
||||||
*/
|
|
||||||
private static function format($string) {
|
|
||||||
$counter = 0;
|
|
||||||
|
|
||||||
// tokenize inline code snippets
|
|
||||||
preg_match_all('/`[^`]+`/', $string, $tokenized);
|
|
||||||
$tokenized = $tokenized[0];
|
|
||||||
foreach ($tokenized as $snippet) {
|
|
||||||
$string = str_replace($snippet, '__token' . ($counter++) .'__', $string);
|
|
||||||
}
|
|
||||||
|
|
||||||
// italicize parentheses
|
|
||||||
$string = preg_replace('/(^|\s)(\([^)]+\))/', '$1*$2*', $string);
|
|
||||||
|
|
||||||
// mark numbers as inline code
|
|
||||||
$string = preg_replace('/ (-?\d+(?:.\d+)?)(?!\.[^\n])/', ' `$1`', $string);
|
|
||||||
|
|
||||||
// detokenize inline code snippets
|
|
||||||
$counter = 0;
|
|
||||||
foreach ($tokenized as $snippet) {
|
|
||||||
$string = str_replace('__token' . ($counter++) . '__', $snippet, $string);
|
|
||||||
}
|
|
||||||
|
|
||||||
return trim($string);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Modify a string by replacing named tokens with matching assoc. array values.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @static
|
|
||||||
* @memberOf Generator
|
|
||||||
* @param {String} $string The string to modify.
|
|
||||||
* @param {Array|Object} $object The template object.
|
|
||||||
* @returns {String} The modified string.
|
|
||||||
*/
|
|
||||||
private static function interpolate($string, $object) {
|
|
||||||
preg_match_all('/#\{([^}]+)\}/', $string, $tokens);
|
|
||||||
$tokens = array_unique(array_pop($tokens));
|
|
||||||
|
|
||||||
foreach ($tokens as $token) {
|
|
||||||
$pattern = '/#\{' . $token . '\}/';
|
|
||||||
$replacement = '';
|
|
||||||
|
|
||||||
if (is_object($object)) {
|
|
||||||
preg_match('/\(([^)]+?)\)$/', $token, $args);
|
|
||||||
$args = preg_split('/,\s*/', array_pop($args));
|
|
||||||
$method = 'get' . ucfirst(str_replace('/\([^)]+?\)$/', '', $token));
|
|
||||||
|
|
||||||
if (method_exists($object, $method)) {
|
|
||||||
$replacement = (string) call_user_func_array(array($object, $method), $args);
|
|
||||||
} else if (isset($object->{$token})) {
|
|
||||||
$replacement = (string) $object->{$token};
|
|
||||||
}
|
|
||||||
} else if (isset($object[$token])) {
|
|
||||||
$replacement = (string) $object[$token];
|
|
||||||
}
|
|
||||||
$string = preg_replace($pattern, trim($replacement), $string);
|
|
||||||
}
|
|
||||||
return Generator::format($string);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resolves the entry's hash used to navigate the documentation.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @memberOf Generator
|
|
||||||
* @param {Number|Object} $entry The entry object.
|
|
||||||
* @param {String} $member The name of the member.
|
|
||||||
* @returns {String} The url hash.
|
|
||||||
*/
|
|
||||||
private function getHash( $entry, $member = '' ) {
|
|
||||||
$entry = is_numeric($entry) ? $this->entries[$entry] : $entry;
|
|
||||||
$member = !$member ? $entry->getMembers(0) : $member;
|
|
||||||
$result = ($member ? $member . ($entry->isPlugin() ? 'prototype' : '') : '') . $entry->getCall();
|
|
||||||
$result = preg_replace('/\(\[|\[\]/', '', $result);
|
|
||||||
$result = preg_replace('/[ =\'"{}.()\]]/', '', $result);
|
|
||||||
$result = preg_replace('/[[#,]/', '-', $result);
|
|
||||||
return strtolower($result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resolves the entry's url for the specific line number.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @memberOf Generator
|
|
||||||
* @param {Number|Object} $entry The entry object.
|
|
||||||
* @returns {String} The url.
|
|
||||||
*/
|
|
||||||
private function getLineUrl( $entry ) {
|
|
||||||
$entry = is_numeric($entry) ? $this->entries($entry) : $entry;
|
|
||||||
return $this->options['url'] . '#L' . $entry->getLineNumber();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the character used to separate the entry's name from its member.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @memberOf Generator
|
|
||||||
* @param {Number|Object} $entry The entry object.
|
|
||||||
* @returns {String} The separator.
|
|
||||||
*/
|
|
||||||
private function getSeparator( $entry ) {
|
|
||||||
$entry = is_numeric($entry) ? $this->entries($entry) : $entry;
|
|
||||||
return $entry->isPlugin() ? '.prototype.' : '.';
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates Markdown from JSDoc entries.
|
|
||||||
*
|
|
||||||
* @memberOf Generator
|
|
||||||
* @returns {String} The rendered Markdown.
|
|
||||||
*/
|
|
||||||
public function generate() {
|
|
||||||
$api = array();
|
|
||||||
$compiling = false;
|
|
||||||
$openTag = "\n<!-- div -->\n";
|
|
||||||
$closeTag = "\n<!-- /div -->\n";
|
|
||||||
$result = array('# ' . $this->options['title']);
|
|
||||||
$toc = 'toc';
|
|
||||||
|
|
||||||
// initialize $api array
|
|
||||||
foreach ($this->entries as $entry) {
|
|
||||||
|
|
||||||
if (!$entry->isPrivate()) {
|
|
||||||
$name = $entry->getName();
|
|
||||||
$members = $entry->getMembers();
|
|
||||||
$members = count($members) ? $members : array('');
|
|
||||||
|
|
||||||
foreach ($members as $member) {
|
|
||||||
// create api category arrays
|
|
||||||
if (!isset($api[$member]) && $member) {
|
|
||||||
$api[$member] = new Entry('', '', $entry->lang);
|
|
||||||
$api[$member]->static = array();
|
|
||||||
$api[$member]->plugin = array();
|
|
||||||
}
|
|
||||||
// append entry to api category
|
|
||||||
if (!$member || $entry->isCtor() || ($entry->getType() == 'Object' &&
|
|
||||||
!preg_match('/[=:]\s*null\s*[,;]?$/', $entry->entry))) {
|
|
||||||
$member = ($member ? $member . ($entry->isPlugin() ? '#' : '.') : '') . $name;
|
|
||||||
$entry->static = @$api[$member] ? $api[$member]->static : array();
|
|
||||||
$entry->plugin = @$api[$member] ? $api[$member]->plugin : array();
|
|
||||||
$api[$member] = $entry;
|
|
||||||
}
|
|
||||||
else if ($entry->isStatic()) {
|
|
||||||
$api[$member]->static[] = $entry;
|
|
||||||
} else if (!$entry->isCtor()) {
|
|
||||||
$api[$member]->plugin[] = $entry;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// custom sort for root level entries
|
|
||||||
// TODO: see how well it handles deeper namespace traversal
|
|
||||||
function sortCompare($a, $b) {
|
|
||||||
$score = array( 'a' => 0, 'b' => 0);
|
|
||||||
foreach (array( 'a' => $a, 'b' => $b) as $key => $value) {
|
|
||||||
// capitalized keys that represent constructor properties are last
|
|
||||||
if (preg_match('/[#.][A-Z]/', $value)) {
|
|
||||||
$score[$key] = 0;
|
|
||||||
}
|
|
||||||
// lowercase keys with prototype properties are next to last
|
|
||||||
else if (preg_match('/#[a-z]/', $value)) {
|
|
||||||
$score[$key] = 1;
|
|
||||||
}
|
|
||||||
// lowercase keys with static properties next to first
|
|
||||||
else if (preg_match('/\.[a-z]/', $value)) {
|
|
||||||
$score[$key] = 2;
|
|
||||||
}
|
|
||||||
// lowercase keys with no properties are first
|
|
||||||
else if (preg_match('/^[^#.]+$/', $value)) {
|
|
||||||
$score[$key] = 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$score = $score['b'] - $score['a'];
|
|
||||||
return $score ? $score : strcasecmp($a, $b);
|
|
||||||
}
|
|
||||||
|
|
||||||
uksort($api, 'sortCompare');
|
|
||||||
|
|
||||||
// sort static and plugin sub-entries
|
|
||||||
foreach ($api as $entry) {
|
|
||||||
foreach (array('static', 'plugin') as $kind) {
|
|
||||||
$sortBy = array( 'a' => array(), 'b' => array(), 'c' => array() );
|
|
||||||
foreach ($entry->{$kind} as $subentry) {
|
|
||||||
$name = $subentry->getName();
|
|
||||||
// functions w/o ALL-CAPs names are last
|
|
||||||
$sortBy['a'][] = $subentry->getType() == 'Function' && !preg_match('/^[A-Z_]+$/', $name);
|
|
||||||
// ALL-CAPs properties first
|
|
||||||
$sortBy['b'][] = preg_match('/^[A-Z_]+$/', $name);
|
|
||||||
// lowercase alphanumeric sort
|
|
||||||
$sortBy['c'][] = strtolower($name);
|
|
||||||
}
|
|
||||||
array_multisort($sortBy['a'], SORT_ASC, $sortBy['b'], SORT_DESC, $sortBy['c'], SORT_ASC, $entry->{$kind});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// compile TOC
|
|
||||||
$result[] = $openTag;
|
|
||||||
|
|
||||||
foreach ($api as $key => $entry) {
|
|
||||||
$entry->hash = $this->getHash($entry);
|
|
||||||
$entry->href = $this->getLineUrl($entry);
|
|
||||||
|
|
||||||
$member = $entry->getMembers(0);
|
|
||||||
$member = ($member ? $member . ($entry->isPlugin() ? '.prototype.' : '.') : '') . $entry->getName();
|
|
||||||
|
|
||||||
$entry->member = preg_replace('/' . $entry->getName() . '$/', '', $member);
|
|
||||||
|
|
||||||
$compiling = $compiling ? ($result[] = $closeTag) : true;
|
|
||||||
|
|
||||||
// assign TOC hash
|
|
||||||
if (count($result) == 2) {
|
|
||||||
$toc = $member;
|
|
||||||
}
|
|
||||||
|
|
||||||
// add root entry
|
|
||||||
array_push(
|
|
||||||
$result,
|
|
||||||
$openTag, '## ' . (count($result) == 2 ? '<a id="' . $toc . '"></a>' : '') . '`' . $member . '`',
|
|
||||||
Generator::interpolate('* [`' . $member . '`](##{hash})', $entry)
|
|
||||||
);
|
|
||||||
|
|
||||||
// add static and plugin sub-entries
|
|
||||||
foreach (array('static', 'plugin') as $kind) {
|
|
||||||
if ($kind == 'plugin' && count($entry->plugin)) {
|
|
||||||
array_push(
|
|
||||||
$result,
|
|
||||||
$closeTag,
|
|
||||||
$openTag,
|
|
||||||
'## `' . $member . ($entry->isCtor() ? '.prototype`' : '`')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
foreach ($entry->{$kind} as $subentry) {
|
|
||||||
$subentry->hash = $this->getHash($subentry);
|
|
||||||
$subentry->href = $this->getLineUrl($subentry);
|
|
||||||
$subentry->member = $member;
|
|
||||||
$subentry->separator = $this->getSeparator($subentry);
|
|
||||||
$result[] = Generator::interpolate('* [`#{member}#{separator}#{name}`](##{hash})', $subentry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
array_push($result, $closeTag, $closeTag);
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// compile content
|
|
||||||
$compiling = false;
|
|
||||||
$result[] = $openTag;
|
|
||||||
|
|
||||||
foreach ($api as $entry) {
|
|
||||||
// add root entry
|
|
||||||
$member = $entry->member . $entry->getName();
|
|
||||||
$compiling = $compiling ? ($result[] = $closeTag) : true;
|
|
||||||
|
|
||||||
array_push($result, $openTag, '## `' . $member . '`');
|
|
||||||
|
|
||||||
foreach (array($entry, 'static', 'plugin') as $kind) {
|
|
||||||
$subentries = is_string($kind) ? $entry->{$kind} : array($kind);
|
|
||||||
|
|
||||||
// title
|
|
||||||
if ($kind != 'static' && $entry->getType() != 'Object' &&
|
|
||||||
count($subentries) && $subentries[0] != $kind) {
|
|
||||||
if ($kind == 'plugin') {
|
|
||||||
$result[] = $closeTag;
|
|
||||||
}
|
|
||||||
array_push(
|
|
||||||
$result,
|
|
||||||
$openTag,
|
|
||||||
'## `' . $member . ($kind == 'plugin' ? '.prototype`' : '`')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// body
|
|
||||||
foreach ($subentries as $subentry) {
|
|
||||||
// description
|
|
||||||
array_push(
|
|
||||||
$result,
|
|
||||||
$openTag,
|
|
||||||
Generator::interpolate("### <a id=\"#{hash}\"></a>`#{member}#{separator}#{call}`\n<a href=\"##{hash}\">#</a> [Ⓢ](#{href} \"View in source\") [Ⓣ][1]\n\n#{desc}", $subentry)
|
|
||||||
);
|
|
||||||
|
|
||||||
// @param
|
|
||||||
if (count($params = $subentry->getParams())) {
|
|
||||||
array_push($result, '', '#### Arguments');
|
|
||||||
foreach ($params as $index => $param) {
|
|
||||||
$result[] = Generator::interpolate('#{num}. `#{name}` (#{type}): #{desc}', array(
|
|
||||||
'desc' => $param[2],
|
|
||||||
'name' => $param[1],
|
|
||||||
'num' => $index + 1,
|
|
||||||
'type' => $param[0]
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// @returns
|
|
||||||
if (count($returns = $subentry->getReturns())) {
|
|
||||||
array_push(
|
|
||||||
$result, '',
|
|
||||||
'#### Returns',
|
|
||||||
Generator::interpolate('(#{type}): #{desc}', array('desc' => $returns[1], 'type' => $returns[0]))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// @example
|
|
||||||
if ($example = $subentry->getExample()) {
|
|
||||||
array_push($result, '', '#### Example', $example);
|
|
||||||
}
|
|
||||||
array_push($result, "\n* * *", $closeTag);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// close tags add TOC link reference
|
|
||||||
array_push($result, $closeTag, $closeTag, '', ' [1]: #' . $toc . ' "Jump back to the TOC."');
|
|
||||||
|
|
||||||
// cleanup whitespace
|
|
||||||
return trim(preg_replace('/ +\n/', "\n", join($result, "\n")));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
1049
vendor/firebug-lite/changelog.txt
vendored
1049
vendor/firebug-lite/changelog.txt
vendored
File diff suppressed because it is too large
Load Diff
@@ -6258,7 +6258,7 @@ FBL.Firebug =
|
|||||||
{
|
{
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
version: "Firebug Lite 1.4.0",
|
version: "Firebug Lite 1.4.0",
|
||||||
revision: "$Revision: 11967 $",
|
revision: "$Revision$",
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
modules: modules,
|
modules: modules,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
http://www.JSON.org/json2.js
|
json2.js
|
||||||
2009-09-29
|
2015-05-03
|
||||||
|
|
||||||
Public Domain.
|
Public Domain.
|
||||||
|
|
||||||
@@ -17,7 +17,9 @@
|
|||||||
|
|
||||||
|
|
||||||
This file creates a global JSON object containing two methods: stringify
|
This file creates a global JSON object containing two methods: stringify
|
||||||
and parse.
|
and parse. This file is provides the ES5 JSON capability to ES3 systems.
|
||||||
|
If a project might run on IE8 or earlier, then this file should be included.
|
||||||
|
This file does nothing on ES5 systems.
|
||||||
|
|
||||||
JSON.stringify(value, replacer, space)
|
JSON.stringify(value, replacer, space)
|
||||||
value any JavaScript value, usually an object or array.
|
value any JavaScript value, usually an object or array.
|
||||||
@@ -48,7 +50,9 @@
|
|||||||
Date.prototype.toJSON = function (key) {
|
Date.prototype.toJSON = function (key) {
|
||||||
function f(n) {
|
function f(n) {
|
||||||
// Format integers to have at least two digits.
|
// Format integers to have at least two digits.
|
||||||
return n < 10 ? '0' + n : n;
|
return n < 10
|
||||||
|
? '0' + n
|
||||||
|
: n;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.getUTCFullYear() + '-' +
|
return this.getUTCFullYear() + '-' +
|
||||||
@@ -94,8 +98,9 @@
|
|||||||
// text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
|
// text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
|
||||||
|
|
||||||
text = JSON.stringify([new Date()], function (key, value) {
|
text = JSON.stringify([new Date()], function (key, value) {
|
||||||
return this[key] instanceof Date ?
|
return this[key] instanceof Date
|
||||||
'Date(' + this[key] + ')' : value;
|
? 'Date(' + this[key] + ')'
|
||||||
|
: value;
|
||||||
});
|
});
|
||||||
// text is '["Date(---current time---)"]'
|
// text is '["Date(---current time---)"]'
|
||||||
|
|
||||||
@@ -146,10 +151,12 @@
|
|||||||
redistribute.
|
redistribute.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*jslint evil: true, strict: false */
|
/*jslint
|
||||||
|
eval, for, this
|
||||||
|
*/
|
||||||
|
|
||||||
/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
|
/*property
|
||||||
call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
|
JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
|
||||||
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
|
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
|
||||||
lastIndex, length, parse, prototype, push, replace, slice, stringify,
|
lastIndex, length, parse, prototype, push, replace, slice, stringify,
|
||||||
test, toJSON, toString, valueOf
|
test, toJSON, toString, valueOf
|
||||||
@@ -159,50 +166,53 @@
|
|||||||
// Create a JSON object only if one does not already exist. We create the
|
// Create a JSON object only if one does not already exist. We create the
|
||||||
// methods in a closure to avoid creating global variables.
|
// methods in a closure to avoid creating global variables.
|
||||||
|
|
||||||
if (!this.JSON) {
|
if (typeof JSON !== 'object') {
|
||||||
this.JSON = {};
|
JSON = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var rx_one = /^[\],:{}\s]*$/,
|
||||||
|
rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
|
||||||
|
rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
|
||||||
|
rx_four = /(?:^|:|,)(?:\s*\[)+/g,
|
||||||
|
rx_escapable = /[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
||||||
|
rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
|
||||||
|
|
||||||
function f(n) {
|
function f(n) {
|
||||||
// Format integers to have at least two digits.
|
// Format integers to have at least two digits.
|
||||||
return n < 10 ? '0' + n : n;
|
return n < 10
|
||||||
|
? '0' + n
|
||||||
|
: n;
|
||||||
|
}
|
||||||
|
|
||||||
|
function this_value() {
|
||||||
|
return this.valueOf();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof Date.prototype.toJSON !== 'function') {
|
if (typeof Date.prototype.toJSON !== 'function') {
|
||||||
|
|
||||||
Date.prototype.toJSON = function (key) {
|
Date.prototype.toJSON = function () {
|
||||||
|
|
||||||
return isFinite(this.valueOf()) ?
|
return isFinite(this.valueOf())
|
||||||
this.getUTCFullYear() + '-' +
|
? this.getUTCFullYear() + '-' +
|
||||||
f(this.getUTCMonth() + 1) + '-' +
|
f(this.getUTCMonth() + 1) + '-' +
|
||||||
f(this.getUTCDate()) + 'T' +
|
f(this.getUTCDate()) + 'T' +
|
||||||
f(this.getUTCHours()) + ':' +
|
f(this.getUTCHours()) + ':' +
|
||||||
f(this.getUTCMinutes()) + ':' +
|
f(this.getUTCMinutes()) + ':' +
|
||||||
f(this.getUTCSeconds()) + 'Z' : null;
|
f(this.getUTCSeconds()) + 'Z'
|
||||||
|
: null;
|
||||||
};
|
};
|
||||||
|
|
||||||
String.prototype.toJSON =
|
Boolean.prototype.toJSON = this_value;
|
||||||
Number.prototype.toJSON =
|
Number.prototype.toJSON = this_value;
|
||||||
Boolean.prototype.toJSON = function (key) {
|
String.prototype.toJSON = this_value;
|
||||||
return this.valueOf();
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
var gap,
|
||||||
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
|
||||||
gap,
|
|
||||||
indent,
|
indent,
|
||||||
meta = { // table of character substitutions
|
meta,
|
||||||
'\b': '\\b',
|
|
||||||
'\t': '\\t',
|
|
||||||
'\n': '\\n',
|
|
||||||
'\f': '\\f',
|
|
||||||
'\r': '\\r',
|
|
||||||
'"' : '\\"',
|
|
||||||
'\\': '\\\\'
|
|
||||||
},
|
|
||||||
rep;
|
rep;
|
||||||
|
|
||||||
|
|
||||||
@@ -213,14 +223,15 @@ if (!this.JSON) {
|
|||||||
// Otherwise we must also replace the offending characters with safe escape
|
// Otherwise we must also replace the offending characters with safe escape
|
||||||
// sequences.
|
// sequences.
|
||||||
|
|
||||||
escapable.lastIndex = 0;
|
rx_escapable.lastIndex = 0;
|
||||||
return escapable.test(string) ?
|
return rx_escapable.test(string)
|
||||||
'"' + string.replace(escapable, function (a) {
|
? '"' + string.replace(rx_escapable, function (a) {
|
||||||
var c = meta[a];
|
var c = meta[a];
|
||||||
return typeof c === 'string' ? c :
|
return typeof c === 'string'
|
||||||
'\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
? c
|
||||||
}) + '"' :
|
: '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||||
'"' + string + '"';
|
}) + '"'
|
||||||
|
: '"' + string + '"';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -260,7 +271,9 @@ if (!this.JSON) {
|
|||||||
|
|
||||||
// JSON numbers must be finite. Encode non-finite numbers as null.
|
// JSON numbers must be finite. Encode non-finite numbers as null.
|
||||||
|
|
||||||
return isFinite(value) ? String(value) : 'null';
|
return isFinite(value)
|
||||||
|
? String(value)
|
||||||
|
: 'null';
|
||||||
|
|
||||||
case 'boolean':
|
case 'boolean':
|
||||||
case 'null':
|
case 'null':
|
||||||
@@ -303,11 +316,11 @@ if (!this.JSON) {
|
|||||||
// Join all of the elements together, separated with commas, and wrap them in
|
// Join all of the elements together, separated with commas, and wrap them in
|
||||||
// brackets.
|
// brackets.
|
||||||
|
|
||||||
v = partial.length === 0 ? '[]' :
|
v = partial.length === 0
|
||||||
gap ? '[\n' + gap +
|
? '[]'
|
||||||
partial.join(',\n' + gap) + '\n' +
|
: gap
|
||||||
mind + ']' :
|
? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']'
|
||||||
'[' + partial.join(',') + ']';
|
: '[' + partial.join(',') + ']';
|
||||||
gap = mind;
|
gap = mind;
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
@@ -317,11 +330,15 @@ if (!this.JSON) {
|
|||||||
if (rep && typeof rep === 'object') {
|
if (rep && typeof rep === 'object') {
|
||||||
length = rep.length;
|
length = rep.length;
|
||||||
for (i = 0; i < length; i += 1) {
|
for (i = 0; i < length; i += 1) {
|
||||||
k = rep[i];
|
if (typeof rep[i] === 'string') {
|
||||||
if (typeof k === 'string') {
|
k = rep[i];
|
||||||
v = str(k, value);
|
v = str(k, value);
|
||||||
if (v) {
|
if (v) {
|
||||||
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
partial.push(quote(k) + (
|
||||||
|
gap
|
||||||
|
? ': '
|
||||||
|
: ':'
|
||||||
|
) + v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -330,10 +347,14 @@ if (!this.JSON) {
|
|||||||
// Otherwise, iterate through all of the keys in the object.
|
// Otherwise, iterate through all of the keys in the object.
|
||||||
|
|
||||||
for (k in value) {
|
for (k in value) {
|
||||||
if (Object.hasOwnProperty.call(value, k)) {
|
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
||||||
v = str(k, value);
|
v = str(k, value);
|
||||||
if (v) {
|
if (v) {
|
||||||
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
partial.push(quote(k) + (
|
||||||
|
gap
|
||||||
|
? ': '
|
||||||
|
: ':'
|
||||||
|
) + v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -342,9 +363,11 @@ if (!this.JSON) {
|
|||||||
// Join all of the member texts together, separated with commas,
|
// Join all of the member texts together, separated with commas,
|
||||||
// and wrap them in braces.
|
// and wrap them in braces.
|
||||||
|
|
||||||
v = partial.length === 0 ? '{}' :
|
v = partial.length === 0
|
||||||
gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
|
? '{}'
|
||||||
mind + '}' : '{' + partial.join(',') + '}';
|
: gap
|
||||||
|
? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}'
|
||||||
|
: '{' + partial.join(',') + '}';
|
||||||
gap = mind;
|
gap = mind;
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
@@ -353,6 +376,15 @@ if (!this.JSON) {
|
|||||||
// If the JSON object does not yet have a stringify method, give it one.
|
// If the JSON object does not yet have a stringify method, give it one.
|
||||||
|
|
||||||
if (typeof JSON.stringify !== 'function') {
|
if (typeof JSON.stringify !== 'function') {
|
||||||
|
meta = { // table of character substitutions
|
||||||
|
'\b': '\\b',
|
||||||
|
'\t': '\\t',
|
||||||
|
'\n': '\\n',
|
||||||
|
'\f': '\\f',
|
||||||
|
'\r': '\\r',
|
||||||
|
'"': '\\"',
|
||||||
|
'\\': '\\\\'
|
||||||
|
};
|
||||||
JSON.stringify = function (value, replacer, space) {
|
JSON.stringify = function (value, replacer, space) {
|
||||||
|
|
||||||
// The stringify method takes a value and an optional replacer, and an optional
|
// The stringify method takes a value and an optional replacer, and an optional
|
||||||
@@ -385,7 +417,7 @@ if (!this.JSON) {
|
|||||||
rep = replacer;
|
rep = replacer;
|
||||||
if (replacer && typeof replacer !== 'function' &&
|
if (replacer && typeof replacer !== 'function' &&
|
||||||
(typeof replacer !== 'object' ||
|
(typeof replacer !== 'object' ||
|
||||||
typeof replacer.length !== 'number')) {
|
typeof replacer.length !== 'number')) {
|
||||||
throw new Error('JSON.stringify');
|
throw new Error('JSON.stringify');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -415,7 +447,7 @@ if (!this.JSON) {
|
|||||||
var k, v, value = holder[key];
|
var k, v, value = holder[key];
|
||||||
if (value && typeof value === 'object') {
|
if (value && typeof value === 'object') {
|
||||||
for (k in value) {
|
for (k in value) {
|
||||||
if (Object.hasOwnProperty.call(value, k)) {
|
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
||||||
v = walk(value, k);
|
v = walk(value, k);
|
||||||
if (v !== undefined) {
|
if (v !== undefined) {
|
||||||
value[k] = v;
|
value[k] = v;
|
||||||
@@ -433,11 +465,12 @@ if (!this.JSON) {
|
|||||||
// Unicode characters with escape sequences. JavaScript handles many characters
|
// Unicode characters with escape sequences. JavaScript handles many characters
|
||||||
// incorrectly, either silently deleting them, or treating them as line endings.
|
// incorrectly, either silently deleting them, or treating them as line endings.
|
||||||
|
|
||||||
cx.lastIndex = 0;
|
text = String(text);
|
||||||
if (cx.test(text)) {
|
rx_dangerous.lastIndex = 0;
|
||||||
text = text.replace(cx, function (a) {
|
if (rx_dangerous.test(text)) {
|
||||||
|
text = text.replace(rx_dangerous, function (a) {
|
||||||
return '\\u' +
|
return '\\u' +
|
||||||
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -454,10 +487,14 @@ if (!this.JSON) {
|
|||||||
// we look to see that the remaining characters are only whitespace or ']' or
|
// we look to see that the remaining characters are only whitespace or ']' or
|
||||||
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
|
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
|
||||||
|
|
||||||
if (/^[\],:{}\s]*$/.
|
if (
|
||||||
test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
|
rx_one.test(
|
||||||
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
|
text
|
||||||
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
|
.replace(rx_two, '@')
|
||||||
|
.replace(rx_three, ']')
|
||||||
|
.replace(rx_four, '')
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
|
||||||
// In the third stage we use the eval function to compile the text into a
|
// In the third stage we use the eval function to compile the text into a
|
||||||
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
|
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
|
||||||
@@ -469,8 +506,9 @@ replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
|
|||||||
// In the optional fourth stage, we recursively walk the new structure, passing
|
// In the optional fourth stage, we recursively walk the new structure, passing
|
||||||
// each name/value pair to a reviver function for possible transformation.
|
// each name/value pair to a reviver function for possible transformation.
|
||||||
|
|
||||||
return typeof reviver === 'function' ?
|
return typeof reviver === 'function'
|
||||||
walk({'': j}, '') : j;
|
? walk({'': j}, '')
|
||||||
|
: j;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the text is not JSON parseable, then a SyntaxError is thrown.
|
// If the text is not JSON parseable, then a SyntaxError is thrown.
|
||||||
20
vendor/platform.js/LICENSE.txt
vendored
20
vendor/platform.js/LICENSE.txt
vendored
@@ -1,20 +0,0 @@
|
|||||||
Copyright 2011-2012 John-David Dalton <http://allyoucanleet.com/>
|
|
||||||
|
|
||||||
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.
|
|
||||||
98
vendor/platform.js/README.md
vendored
98
vendor/platform.js/README.md
vendored
@@ -1,98 +0,0 @@
|
|||||||
# Platform.js <sup>v1.0.0</sup>
|
|
||||||
|
|
||||||
A platform detection library that works on nearly all JavaScript platforms<sup><a name="fnref1" href="#fn1">1</a></sup>.
|
|
||||||
|
|
||||||
## Disclaimer
|
|
||||||
|
|
||||||
Platform.js is for informational purposes only and **not** intended as a substitution for [feature detection/inference](http://allyoucanleet.com/post/18087210413/feature-testing-costs#screencast2) checks.
|
|
||||||
|
|
||||||
## BestieJS
|
|
||||||
|
|
||||||
Platform.js is part of the BestieJS *"Best in Class"* module collection. This means we promote solid browser/environment support, ES5 precedents, unit testing, and plenty of documentation.
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
The documentation for Platform.js can be viewed here: [/doc/README.md](https://github.com/bestiejs/platform.js/blob/master/doc/README.md#readme)
|
|
||||||
|
|
||||||
For a list of upcoming features, check out our [roadmap](https://github.com/bestiejs/platform.js/wiki/Roadmap).
|
|
||||||
|
|
||||||
## Support
|
|
||||||
|
|
||||||
Platform.js has been tested in at least Adobe AIR 3.1, Chrome 5-21, Firefox 1.5-13, IE 6-9, Opera 9.25-12.01, Safari 3-6, Node.js 0.8.6, Narwhal 0.3.2, RingoJS 0.8, and Rhino 1.7RC5.
|
|
||||||
|
|
||||||
## Installation and usage
|
|
||||||
|
|
||||||
In a browser or Adobe AIR:
|
|
||||||
|
|
||||||
```html
|
|
||||||
<script src="platform.js"></script>
|
|
||||||
```
|
|
||||||
|
|
||||||
Via [npm](http://npmjs.org/):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm install platform
|
|
||||||
```
|
|
||||||
|
|
||||||
In [Node.js](http://nodejs.org/) and [RingoJS](http://ringojs.org/):
|
|
||||||
|
|
||||||
```js
|
|
||||||
var platform = require('platform');
|
|
||||||
```
|
|
||||||
|
|
||||||
In [Rhino](http://www.mozilla.org/rhino/):
|
|
||||||
|
|
||||||
```js
|
|
||||||
load('platform.js');
|
|
||||||
```
|
|
||||||
|
|
||||||
In an AMD loader like [RequireJS](http://requirejs.org/):
|
|
||||||
|
|
||||||
```js
|
|
||||||
require({
|
|
||||||
'paths': {
|
|
||||||
'platform': 'path/to/platform'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
['platform'], function(platform) {
|
|
||||||
console.log(platform.name);
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
Usage example:
|
|
||||||
|
|
||||||
```js
|
|
||||||
// on IE10 x86 platform preview running in IE7 compatibility mode on Windows 7 64 bit edition
|
|
||||||
platform.name; // 'IE'
|
|
||||||
platform.version; // '10.0'
|
|
||||||
platform.layout; // 'Trident'
|
|
||||||
platform.os; // 'Windows Server 2008 R2 / 7 x64'
|
|
||||||
platform.description; // 'IE 10.0 x86 (platform preview; running in IE 7 mode) on Windows Server 2008 R2 / 7 x64'
|
|
||||||
|
|
||||||
// or on an iPad
|
|
||||||
platform.name; // 'Safari'
|
|
||||||
platform.version; // '5.1'
|
|
||||||
platform.product; // 'iPad'
|
|
||||||
platform.manufacturer; // 'Apple'
|
|
||||||
platform.layout; // 'WebKit'
|
|
||||||
platform.os; // 'iOS 5.0'
|
|
||||||
platform.description; // 'Safari 5.1 on Apple iPad (iOS 5.0)'
|
|
||||||
|
|
||||||
// or parsing a given UA string
|
|
||||||
var info = platform.parse('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7.2; en; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 11.52');
|
|
||||||
info.name; // 'Opera'
|
|
||||||
info.version; // '11.52'
|
|
||||||
info.layout; // 'Presto'
|
|
||||||
info.os; // 'Mac OS X 10.7.2'
|
|
||||||
info.description; // 'Opera 11.52 (identifying as Firefox 4.0) on Mac OS X 10.7.2'
|
|
||||||
```
|
|
||||||
|
|
||||||
## Author
|
|
||||||
|
|
||||||
* [John-David Dalton](http://allyoucanleet.com/)
|
|
||||||
[](https://twitter.com/jdalton "Follow @jdalton on Twitter")
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
* [Mathias Bynens](http://mathiasbynens.be/)
|
|
||||||
[](https://twitter.com/mathias "Follow @mathias on Twitter")
|
|
||||||
996
vendor/platform.js/platform.js
vendored
996
vendor/platform.js/platform.js
vendored
@@ -1,996 +0,0 @@
|
|||||||
/*!
|
|
||||||
* Platform.js v1.0.0 <http://mths.be/platform>
|
|
||||||
* Copyright 2010-2012 John-David Dalton <http://allyoucanleet.com/>
|
|
||||||
* Available under MIT license <http://mths.be/mit>
|
|
||||||
*/
|
|
||||||
;(function(window) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/** Backup possible window/global object */
|
|
||||||
var oldWin = window;
|
|
||||||
|
|
||||||
/** Detect free variable `exports` */
|
|
||||||
var freeExports = typeof exports == 'object' && exports;
|
|
||||||
|
|
||||||
/** Detect free variable `global` */
|
|
||||||
var freeGlobal = typeof global == 'object' && global &&
|
|
||||||
(global == global.global ? (window = global) : global);
|
|
||||||
|
|
||||||
/** Opera regexp */
|
|
||||||
var reOpera = /Opera/;
|
|
||||||
|
|
||||||
/** Used to resolve a value's internal [[Class]] */
|
|
||||||
var toString = {}.toString;
|
|
||||||
|
|
||||||
/** Detect Java environment */
|
|
||||||
var java = /Java/.test(getClassOf(window.java)) && window.java;
|
|
||||||
|
|
||||||
/** A character to represent alpha */
|
|
||||||
var alpha = java ? 'a' : '\u03b1';
|
|
||||||
|
|
||||||
/** A character to represent beta */
|
|
||||||
var beta = java ? 'b' : '\u03b2';
|
|
||||||
|
|
||||||
/** Browser document object */
|
|
||||||
var doc = window.document || {};
|
|
||||||
|
|
||||||
/** Used to check for own properties of an object */
|
|
||||||
var hasOwnProperty = {}.hasOwnProperty;
|
|
||||||
|
|
||||||
/** Browser navigator object */
|
|
||||||
var nav = window.navigator || {};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Detect Opera browser
|
|
||||||
* http://www.howtocreate.co.uk/operaStuff/operaObject.html
|
|
||||||
* http://dev.opera.com/articles/view/opera-mini-web-content-authoring-guidelines/#operamini
|
|
||||||
*/
|
|
||||||
var opera = window.operamini || window.opera;
|
|
||||||
|
|
||||||
/** Opera [[Class]] */
|
|
||||||
var operaClass = reOpera.test(operaClass = getClassOf(opera)) ? operaClass : (opera = null);
|
|
||||||
|
|
||||||
/** Possible global object */
|
|
||||||
var thisBinding = this;
|
|
||||||
|
|
||||||
/** Browser user agent string */
|
|
||||||
var userAgent = nav.userAgent || '';
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Capitalizes a string value.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} string The string to capitalize.
|
|
||||||
* @returns {String} The capitalized string.
|
|
||||||
*/
|
|
||||||
function capitalize(string) {
|
|
||||||
string = String(string);
|
|
||||||
return string.charAt(0).toUpperCase() + string.slice(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An iteration utility for arrays and objects.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Array|Object} object The object to iterate over.
|
|
||||||
* @param {Function} callback The function called per iteration.
|
|
||||||
*/
|
|
||||||
function each(object, callback) {
|
|
||||||
var index = -1,
|
|
||||||
length = object.length;
|
|
||||||
|
|
||||||
if (length == length >>> 0) {
|
|
||||||
while (++index < length) {
|
|
||||||
callback(object[index], index, object);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
forOwn(object, callback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Trim and conditionally capitalize string values.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} string The string to format.
|
|
||||||
* @returns {String} The formatted string.
|
|
||||||
*/
|
|
||||||
function format(string) {
|
|
||||||
string = trim(string);
|
|
||||||
return /^(?:webOS|i(?:OS|P))/.test(string)
|
|
||||||
? string
|
|
||||||
: capitalize(string);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Iterates over an object's own properties, executing the `callback` for each.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object} object The object to iterate over.
|
|
||||||
* @param {Function} callback The function executed per own property.
|
|
||||||
*/
|
|
||||||
function forOwn(object, callback) {
|
|
||||||
for (var key in object) {
|
|
||||||
hasKey(object, key) && callback(object[key], key, object);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the internal [[Class]] of a value.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Mixed} value The value.
|
|
||||||
* @returns {String} The [[Class]].
|
|
||||||
*/
|
|
||||||
function getClassOf(value) {
|
|
||||||
return value == null
|
|
||||||
? capitalize(value)
|
|
||||||
: toString.call(value).slice(8, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if an object has the specified key as a direct property.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Object} object The object to check.
|
|
||||||
* @param {String} key The key to check for.
|
|
||||||
* @returns {Boolean} Returns `true` if key is a direct property, else `false`.
|
|
||||||
*/
|
|
||||||
function hasKey() {
|
|
||||||
// lazy define for others (not as accurate)
|
|
||||||
hasKey = function(object, key) {
|
|
||||||
var parent = object != null && (object.constructor || Object).prototype;
|
|
||||||
return !!parent && key in Object(object) && !(key in parent && object[key] === parent[key]);
|
|
||||||
};
|
|
||||||
// for modern browsers
|
|
||||||
if (getClassOf(hasOwnProperty) == 'Function') {
|
|
||||||
hasKey = function(object, key) {
|
|
||||||
return object != null && hasOwnProperty.call(object, key);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
// for Safari 2
|
|
||||||
else if ({}.__proto__ == Object.prototype) {
|
|
||||||
hasKey = function(object, key) {
|
|
||||||
var result = false;
|
|
||||||
if (object != null) {
|
|
||||||
object = Object(object);
|
|
||||||
object.__proto__ = [object.__proto__, object.__proto__ = null, result = key in object][0];
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return hasKey.apply(this, arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Host objects can return type values that are different from their actual
|
|
||||||
* data type. The objects we are concerned with usually return non-primitive
|
|
||||||
* types of object, function, or unknown.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Mixed} object The owner of the property.
|
|
||||||
* @param {String} property The property to check.
|
|
||||||
* @returns {Boolean} Returns `true` if the property value is a non-primitive, else `false`.
|
|
||||||
*/
|
|
||||||
function isHostType(object, property) {
|
|
||||||
var type = object != null ? typeof object[property] : 'number';
|
|
||||||
return !/^(?:boolean|number|string|undefined)$/.test(type) &&
|
|
||||||
(type == 'object' ? !!object[property] : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prepares a string for use in a RegExp constructor by making hyphens and
|
|
||||||
* spaces optional.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} string The string to qualify.
|
|
||||||
* @returns {String} The qualified string.
|
|
||||||
*/
|
|
||||||
function qualify(string) {
|
|
||||||
return String(string).replace(/([ -])(?!$)/g, '$1?');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A bare-bones` Array#reduce` like utility function.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Array} array The array to iterate over.
|
|
||||||
* @param {Function} callback The function called per iteration.
|
|
||||||
* @param {Mixed} accumulator Initial value of the accumulator.
|
|
||||||
* @returns {Mixed} The accumulator.
|
|
||||||
*/
|
|
||||||
function reduce(array, callback) {
|
|
||||||
var accumulator = null;
|
|
||||||
each(array, function(value, index) {
|
|
||||||
accumulator = callback(accumulator, value, index, array);
|
|
||||||
});
|
|
||||||
return accumulator;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes leading and trailing whitespace from a string.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {String} string The string to trim.
|
|
||||||
* @returns {String} The trimmed string.
|
|
||||||
*/
|
|
||||||
function trim(string) {
|
|
||||||
return String(string).replace(/^ +| +$/g, '');
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new platform object.
|
|
||||||
*
|
|
||||||
* @memberOf platform
|
|
||||||
* @param {String} [ua = navigator.userAgent] The user agent string.
|
|
||||||
* @returns {Object} A platform object.
|
|
||||||
*/
|
|
||||||
function parse(ua) {
|
|
||||||
|
|
||||||
ua || (ua = userAgent);
|
|
||||||
|
|
||||||
/** Temporary variable used over the script's lifetime */
|
|
||||||
var data;
|
|
||||||
|
|
||||||
/** The CPU architecture */
|
|
||||||
var arch = ua;
|
|
||||||
|
|
||||||
/** Platform description array */
|
|
||||||
var description = [];
|
|
||||||
|
|
||||||
/** Platform alpha/beta indicator */
|
|
||||||
var prerelease = null;
|
|
||||||
|
|
||||||
/** A flag to indicate that environment features should be used to resolve the platform */
|
|
||||||
var useFeatures = ua == userAgent;
|
|
||||||
|
|
||||||
/** The browser/environment version */
|
|
||||||
var version = useFeatures && opera && typeof opera.version == 'function' && opera.version();
|
|
||||||
|
|
||||||
/* Detectable layout engines (order is important) */
|
|
||||||
var layout = getLayout([
|
|
||||||
{ 'label': 'WebKit', 'pattern': 'AppleWebKit' },
|
|
||||||
'iCab',
|
|
||||||
'Presto',
|
|
||||||
'NetFront',
|
|
||||||
'Tasman',
|
|
||||||
'Trident',
|
|
||||||
'KHTML',
|
|
||||||
'Gecko'
|
|
||||||
]);
|
|
||||||
|
|
||||||
/* Detectable browser names (order is important) */
|
|
||||||
var name = getName([
|
|
||||||
'Adobe AIR',
|
|
||||||
'Arora',
|
|
||||||
'Avant Browser',
|
|
||||||
'Camino',
|
|
||||||
'Epiphany',
|
|
||||||
'Fennec',
|
|
||||||
'Flock',
|
|
||||||
'Galeon',
|
|
||||||
'GreenBrowser',
|
|
||||||
'iCab',
|
|
||||||
'Iceweasel',
|
|
||||||
'Iron',
|
|
||||||
'K-Meleon',
|
|
||||||
'Konqueror',
|
|
||||||
'Lunascape',
|
|
||||||
'Maxthon',
|
|
||||||
'Midori',
|
|
||||||
'Nook Browser',
|
|
||||||
'PhantomJS',
|
|
||||||
'Raven',
|
|
||||||
'Rekonq',
|
|
||||||
'RockMelt',
|
|
||||||
'SeaMonkey',
|
|
||||||
{ 'label': 'Silk', 'pattern': '(?:Cloud9|Silk-Accelerated)' },
|
|
||||||
'Sleipnir',
|
|
||||||
'SlimBrowser',
|
|
||||||
'Sunrise',
|
|
||||||
'Swiftfox',
|
|
||||||
'WebPositive',
|
|
||||||
'Opera Mini',
|
|
||||||
'Opera',
|
|
||||||
'Chrome',
|
|
||||||
{ 'label': 'Chrome Mobile', 'pattern': '(?:CriOS|CrMo)' },
|
|
||||||
{ 'label': 'Firefox', 'pattern': '(?:Firefox|Minefield)' },
|
|
||||||
{ 'label': 'IE', 'pattern': 'MSIE' },
|
|
||||||
'Safari'
|
|
||||||
]);
|
|
||||||
|
|
||||||
/* Detectable products (order is important) */
|
|
||||||
var product = getProduct([
|
|
||||||
'BlackBerry',
|
|
||||||
{ 'label': 'Galaxy S', 'pattern': 'GT-I9000' },
|
|
||||||
{ 'label': 'Galaxy S2', 'pattern': 'GT-I9100' },
|
|
||||||
'Google TV',
|
|
||||||
'iPad',
|
|
||||||
'iPod',
|
|
||||||
'iPhone',
|
|
||||||
'Kindle',
|
|
||||||
{ 'label': 'Kindle Fire', 'pattern': '(?:Cloud9|Silk-Accelerated)' },
|
|
||||||
'Nook',
|
|
||||||
'PlayBook',
|
|
||||||
'PlayStation Vita',
|
|
||||||
'TouchPad',
|
|
||||||
'Transformer',
|
|
||||||
'Xoom'
|
|
||||||
]);
|
|
||||||
|
|
||||||
/* Detectable manufacturers */
|
|
||||||
var manufacturer = getManufacturer({
|
|
||||||
'Apple': { 'iPad': 1, 'iPhone': 1, 'iPod': 1 },
|
|
||||||
'Amazon': { 'Kindle': 1, 'Kindle Fire': 1 },
|
|
||||||
'Asus': { 'Transformer': 1 },
|
|
||||||
'Barnes & Noble': { 'Nook': 1 },
|
|
||||||
'BlackBerry': { 'PlayBook': 1 },
|
|
||||||
'Google': { 'Google TV': 1 },
|
|
||||||
'HP': { 'TouchPad': 1 },
|
|
||||||
'LG': { },
|
|
||||||
'Motorola': { 'Xoom': 1 },
|
|
||||||
'Nokia': { },
|
|
||||||
'Samsung': { 'Galaxy S': 1, 'Galaxy S2': 1 },
|
|
||||||
'Sony': { 'PlayStation Vita': 1 }
|
|
||||||
});
|
|
||||||
|
|
||||||
/* Detectable OSes (order is important) */
|
|
||||||
var os = getOS([
|
|
||||||
'Android',
|
|
||||||
'CentOS',
|
|
||||||
'Debian',
|
|
||||||
'Fedora',
|
|
||||||
'FreeBSD',
|
|
||||||
'Gentoo',
|
|
||||||
'Haiku',
|
|
||||||
'Kubuntu',
|
|
||||||
'Linux Mint',
|
|
||||||
'Red Hat',
|
|
||||||
'SuSE',
|
|
||||||
'Ubuntu',
|
|
||||||
'Xubuntu',
|
|
||||||
'Cygwin',
|
|
||||||
'Symbian OS',
|
|
||||||
'hpwOS',
|
|
||||||
'webOS ',
|
|
||||||
'webOS',
|
|
||||||
'Tablet OS',
|
|
||||||
'Linux',
|
|
||||||
'Mac OS X',
|
|
||||||
'Macintosh',
|
|
||||||
'Mac',
|
|
||||||
'Windows 98;',
|
|
||||||
'Windows '
|
|
||||||
]);
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Picks the layout engine from an array of guesses.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Array} guesses An array of guesses.
|
|
||||||
* @returns {String|Null} The detected layout engine.
|
|
||||||
*/
|
|
||||||
function getLayout(guesses) {
|
|
||||||
return reduce(guesses, function(result, guess) {
|
|
||||||
return result || RegExp('\\b' + (
|
|
||||||
guess.pattern || qualify(guess)
|
|
||||||
) + '\\b', 'i').exec(ua) && (guess.label || guess);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Picks the manufacturer from an array of guesses.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Array} guesses An array of guesses.
|
|
||||||
* @returns {String|Null} The detected manufacturer.
|
|
||||||
*/
|
|
||||||
function getManufacturer(guesses) {
|
|
||||||
return reduce(guesses, function(result, value, key) {
|
|
||||||
// lookup the manufacturer by product or scan the UA for the manufacturer
|
|
||||||
return result || (
|
|
||||||
value[product] ||
|
|
||||||
value[0/*Opera 9.25 fix*/, /^[a-z]+(?: +[a-z]+\b)*/i.exec(product)] ||
|
|
||||||
RegExp('\\b' + (key.pattern || qualify(key)) + '(?:\\b|\\w*\\d)', 'i').exec(ua)
|
|
||||||
) && (key.label || key);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Picks the browser name from an array of guesses.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Array} guesses An array of guesses.
|
|
||||||
* @returns {String|Null} The detected browser name.
|
|
||||||
*/
|
|
||||||
function getName(guesses) {
|
|
||||||
return reduce(guesses, function(result, guess) {
|
|
||||||
return result || RegExp('\\b' + (
|
|
||||||
guess.pattern || qualify(guess)
|
|
||||||
) + '\\b', 'i').exec(ua) && (guess.label || guess);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Picks the OS name from an array of guesses.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Array} guesses An array of guesses.
|
|
||||||
* @returns {String|Null} The detected OS name.
|
|
||||||
*/
|
|
||||||
function getOS(guesses) {
|
|
||||||
return reduce(guesses, function(result, guess) {
|
|
||||||
var pattern = guess.pattern || qualify(guess);
|
|
||||||
if (!result && (result =
|
|
||||||
RegExp('\\b' + pattern + '(?:/[\\d.]+|[ \\w.]*)', 'i').exec(ua))) {
|
|
||||||
// platform tokens defined at
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx
|
|
||||||
// http://web.archive.org/web/20081122053950/http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx
|
|
||||||
data = {
|
|
||||||
'6.2': '8',
|
|
||||||
'6.1': 'Server 2008 R2 / 7',
|
|
||||||
'6.0': 'Server 2008 / Vista',
|
|
||||||
'5.2': 'Server 2003 / XP 64-bit',
|
|
||||||
'5.1': 'XP',
|
|
||||||
'5.01': '2000 SP1',
|
|
||||||
'5.0': '2000',
|
|
||||||
'4.0': 'NT',
|
|
||||||
'4.90': 'ME'
|
|
||||||
};
|
|
||||||
// detect Windows version from platform tokens
|
|
||||||
if (/^Win/i.test(result) &&
|
|
||||||
(data = data[0/*Opera 9.25 fix*/, /[\d.]+$/.exec(result)])) {
|
|
||||||
result = 'Windows ' + data;
|
|
||||||
}
|
|
||||||
// correct character case and cleanup
|
|
||||||
result = format(String(result)
|
|
||||||
.replace(RegExp(pattern, 'i'), guess.label || guess)
|
|
||||||
.replace(/ ce$/i, ' CE')
|
|
||||||
.replace(/hpw/i, 'web')
|
|
||||||
.replace(/Macintosh/, 'Mac OS')
|
|
||||||
.replace(/_PowerPC/i, ' OS')
|
|
||||||
.replace(/(OS X) [^ \d]+/i, '$1')
|
|
||||||
.replace(/\/(\d)/, ' $1')
|
|
||||||
.replace(/_/g, '.')
|
|
||||||
.replace(/(?: BePC|[ .]*fc[ \d.]+)$/i, '')
|
|
||||||
.replace(/x86\.64/gi, 'x86_64')
|
|
||||||
.split(' on ')[0]);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Picks the product name from an array of guesses.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Array} guesses An array of guesses.
|
|
||||||
* @returns {String|Null} The detected product name.
|
|
||||||
*/
|
|
||||||
function getProduct(guesses) {
|
|
||||||
return reduce(guesses, function(result, guess) {
|
|
||||||
var pattern = guess.pattern || qualify(guess);
|
|
||||||
if (!result && (result =
|
|
||||||
RegExp('\\b' + pattern + ' *\\d+[.\\w_]*', 'i').exec(ua) ||
|
|
||||||
RegExp('\\b' + pattern + '(?:; *(?:[a-z]+[_-])?[a-z]+\\d+|[^ ();-]*)', 'i').exec(ua)
|
|
||||||
)) {
|
|
||||||
// split by forward slash and append product version if needed
|
|
||||||
if ((result = String(guess.label || result).split('/'))[1] && !/[\d.]+/.test(result[0])) {
|
|
||||||
result[0] += ' ' + result[1];
|
|
||||||
}
|
|
||||||
// correct character case and cleanup
|
|
||||||
guess = guess.label || guess;
|
|
||||||
result = format(result[0]
|
|
||||||
.replace(RegExp(pattern, 'i'), guess)
|
|
||||||
.replace(RegExp('; *(?:' + guess + '[_-])?', 'i'), ' ')
|
|
||||||
.replace(RegExp('(' + guess + ')(\\w)', 'i'), '$1 $2'));
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resolves the version using an array of UA patterns.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Array} patterns An array of UA patterns.
|
|
||||||
* @returns {String|Null} The detected version.
|
|
||||||
*/
|
|
||||||
function getVersion(patterns) {
|
|
||||||
return reduce(patterns, function(result, pattern) {
|
|
||||||
return result || (RegExp(pattern +
|
|
||||||
'(?:-[\\d.]+/|(?: for [\\w-]+)?[ /-])([\\d.]+[^ ();/_-]*)', 'i').exec(ua) || 0)[1] || null;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns `platform.description` when the platform object is coerced to a string.
|
|
||||||
*
|
|
||||||
* @name toString
|
|
||||||
* @memberOf platform
|
|
||||||
* @returns {String} Returns `platform.description` if available, else an empty string.
|
|
||||||
*/
|
|
||||||
function toStringPlatform() {
|
|
||||||
return this.description || '';
|
|
||||||
}
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// convert layout to an array so we can add extra details
|
|
||||||
layout && (layout = [layout]);
|
|
||||||
|
|
||||||
// detect product names that contain their manufacturer's name
|
|
||||||
if (manufacturer && !product) {
|
|
||||||
product = getProduct([manufacturer]);
|
|
||||||
}
|
|
||||||
// clean up Google TV
|
|
||||||
if ((data = /Google TV/.exec(product))) {
|
|
||||||
product = data[0];
|
|
||||||
}
|
|
||||||
// detect simulators
|
|
||||||
if (/\bSimulator\b/i.test(ua)) {
|
|
||||||
product = (product ? product + ' ' : '') + 'Simulator';
|
|
||||||
}
|
|
||||||
// detect iOS
|
|
||||||
if (/^iP/.test(product)) {
|
|
||||||
name || (name = 'Safari');
|
|
||||||
os = 'iOS' + ((data = / OS ([\d_]+)/i.exec(ua))
|
|
||||||
? ' ' + data[1].replace(/_/g, '.')
|
|
||||||
: '');
|
|
||||||
}
|
|
||||||
// detect Kubuntu
|
|
||||||
else if (name == 'Konqueror' && !/buntu/i.test(os)) {
|
|
||||||
os = 'Kubuntu';
|
|
||||||
}
|
|
||||||
// detect Android browsers
|
|
||||||
else if (manufacturer && manufacturer != 'Google' &&
|
|
||||||
/Chrome|Vita/.test(name + ';' + product)) {
|
|
||||||
name = 'Android Browser';
|
|
||||||
os = /Android/.test(os) ? os : 'Android';
|
|
||||||
}
|
|
||||||
// detect false positives for Firefox/Safari
|
|
||||||
else if (!name || (data = !/\bMinefield\b/i.test(ua) && /Firefox|Safari/.exec(name))) {
|
|
||||||
// escape the `/` for Firefox 1
|
|
||||||
if (name && !product && /[\/,]|^[^(]+?\)/.test(ua.slice(ua.indexOf(data + '/') + 8))) {
|
|
||||||
// clear name of false positives
|
|
||||||
name = null;
|
|
||||||
}
|
|
||||||
// reassign a generic name
|
|
||||||
if ((data = product || manufacturer || os) &&
|
|
||||||
(product || manufacturer || /Android|Symbian OS|Tablet OS|webOS/.test(os))) {
|
|
||||||
name = /[a-z]+(?: Hat)?/i.exec(/Android/.test(os) ? os : data) + ' Browser';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// detect non-Opera versions (order is important)
|
|
||||||
if (!version) {
|
|
||||||
version = getVersion([
|
|
||||||
'(?:Cloud9|CriOS|CrMo|Opera ?Mini|Raven|Silk(?!/[\\d.]+$))',
|
|
||||||
'Version',
|
|
||||||
qualify(name),
|
|
||||||
'(?:Firefox|Minefield|NetFront)'
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
// detect stubborn layout engines
|
|
||||||
if (layout == 'iCab' && parseFloat(version) > 3) {
|
|
||||||
layout = ['WebKit'];
|
|
||||||
} else if (data =
|
|
||||||
/Opera/.test(name) && 'Presto' ||
|
|
||||||
/\b(?:Midori|Nook|Safari)\b/i.test(ua) && 'WebKit' ||
|
|
||||||
!layout && /\bMSIE\b/i.test(ua) && (/^Mac/.test(os) ? 'Tasman' : 'Trident')) {
|
|
||||||
layout = [data];
|
|
||||||
}
|
|
||||||
// leverage environment features
|
|
||||||
if (useFeatures) {
|
|
||||||
// detect server-side environments
|
|
||||||
// Rhino has a global function while others have a global object
|
|
||||||
if (isHostType(window, 'global')) {
|
|
||||||
if (java) {
|
|
||||||
data = java.lang.System;
|
|
||||||
arch = data.getProperty('os.arch');
|
|
||||||
os = os || data.getProperty('os.name') + ' ' + data.getProperty('os.version');
|
|
||||||
}
|
|
||||||
if (typeof exports == 'object' && exports) {
|
|
||||||
// if `thisBinding` is the [ModuleScope]
|
|
||||||
if (thisBinding == oldWin && typeof system == 'object' && (data = [system])[0]) {
|
|
||||||
os || (os = data[0].os || null);
|
|
||||||
try {
|
|
||||||
data[1] = require('ringo/engine').version;
|
|
||||||
version = data[1].join('.');
|
|
||||||
name = 'RingoJS';
|
|
||||||
} catch(e) {
|
|
||||||
if (data[0].global == freeGlobal) {
|
|
||||||
name = 'Narwhal';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (typeof process == 'object' && (data = process)) {
|
|
||||||
name = 'Node.js';
|
|
||||||
arch = data.arch;
|
|
||||||
os = data.platform;
|
|
||||||
version = /[\d.]+/.exec(data.version)[0];
|
|
||||||
}
|
|
||||||
} else if (getClassOf(window.environment) == 'Environment') {
|
|
||||||
name = 'Rhino';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// detect Adobe AIR
|
|
||||||
else if (getClassOf(data = window.runtime) == 'ScriptBridgingProxyObject') {
|
|
||||||
name = 'Adobe AIR';
|
|
||||||
os = data.flash.system.Capabilities.os;
|
|
||||||
}
|
|
||||||
// detect PhantomJS
|
|
||||||
else if (getClassOf(data = window.phantom) == 'RuntimeObject') {
|
|
||||||
name = 'PhantomJS';
|
|
||||||
version = (data = data.version || null) && (data.major + '.' + data.minor + '.' + data.patch);
|
|
||||||
}
|
|
||||||
// detect IE compatibility modes
|
|
||||||
else if (typeof doc.documentMode == 'number' && (data = /\bTrident\/(\d+)/i.exec(ua))) {
|
|
||||||
// we're in compatibility mode when the Trident version + 4 doesn't
|
|
||||||
// equal the document mode
|
|
||||||
version = [version, doc.documentMode];
|
|
||||||
if ((data = +data[1] + 4) != version[1]) {
|
|
||||||
description.push('IE ' + version[1] + ' mode');
|
|
||||||
layout[1] = '';
|
|
||||||
version[1] = data;
|
|
||||||
}
|
|
||||||
version = name == 'IE' ? String(version[1].toFixed(1)) : version[0];
|
|
||||||
}
|
|
||||||
os = os && format(os);
|
|
||||||
}
|
|
||||||
// detect prerelease phases
|
|
||||||
if (version && (data =
|
|
||||||
/(?:[ab]|dp|pre|[ab]\d+pre)(?:\d+\+?)?$/i.exec(version) ||
|
|
||||||
/(?:alpha|beta)(?: ?\d)?/i.exec(ua + ';' + (useFeatures && nav.appMinorVersion)) ||
|
|
||||||
/\bMinefield\b/i.test(ua) && 'a')) {
|
|
||||||
prerelease = /b/i.test(data) ? 'beta' : 'alpha';
|
|
||||||
version = version.replace(RegExp(data + '\\+?$'), '') +
|
|
||||||
(prerelease == 'beta' ? beta : alpha) + (/\d+\+?/.exec(data) || '');
|
|
||||||
}
|
|
||||||
// rename code name "Fennec"
|
|
||||||
if (name == 'Fennec') {
|
|
||||||
name = 'Firefox Mobile';
|
|
||||||
}
|
|
||||||
// obscure Maxthon's unreliable version
|
|
||||||
else if (name == 'Maxthon' && version) {
|
|
||||||
version = version.replace(/\.[\d.]+/, '.x');
|
|
||||||
}
|
|
||||||
// detect Silk desktop/accelerated modes
|
|
||||||
else if (name == 'Silk') {
|
|
||||||
if (!/Mobi/i.test(ua)) {
|
|
||||||
os = 'Android';
|
|
||||||
description.unshift('desktop mode');
|
|
||||||
}
|
|
||||||
if (/Accelerated *= *true/i.test(ua)) {
|
|
||||||
description.unshift('accelerated');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// detect Windows Phone desktop mode
|
|
||||||
else if (name == 'IE' && (data = (/; *(?:XBLWP|ZuneWP)(\d+)/i.exec(ua) || 0)[1])) {
|
|
||||||
name += ' Mobile';
|
|
||||||
os = 'Windows Phone OS ' + data + '.x';
|
|
||||||
description.unshift('desktop mode');
|
|
||||||
}
|
|
||||||
// add mobile postfix
|
|
||||||
else if ((name == 'IE' || name && !product && !/Browser|Mobi/.test(name)) &&
|
|
||||||
(os == 'Windows CE' || /Mobi/i.test(ua))) {
|
|
||||||
name += ' Mobile';
|
|
||||||
}
|
|
||||||
// detect IE platform preview
|
|
||||||
else if (name == 'IE' && useFeatures && typeof external == 'object' && !external) {
|
|
||||||
description.unshift('platform preview');
|
|
||||||
}
|
|
||||||
// detect BlackBerry OS version
|
|
||||||
// http://docs.blackberry.com/en/developers/deliverables/18169/HTTP_headers_sent_by_BB_Browser_1234911_11.jsp
|
|
||||||
else if (/BlackBerry/.test(product) && (data =
|
|
||||||
(RegExp(product.replace(/ +/g, ' *') + '/([.\\d]+)', 'i').exec(ua) || 0)[1] ||
|
|
||||||
version)) {
|
|
||||||
os = 'Device Software ' + data;
|
|
||||||
version = null;
|
|
||||||
}
|
|
||||||
// detect Opera identifying/masking itself as another browser
|
|
||||||
// http://www.opera.com/support/kb/view/843/
|
|
||||||
else if (this != forOwn && (
|
|
||||||
(useFeatures && opera) ||
|
|
||||||
(/Opera/.test(name) && /\b(?:MSIE|Firefox)\b/i.test(ua)) ||
|
|
||||||
(name == 'Firefox' && /OS X (?:\d+\.){2,}/.test(os)) ||
|
|
||||||
(name == 'IE' && (
|
|
||||||
(os && !/^Win/.test(os) && version > 5.5) ||
|
|
||||||
/Windows XP/.test(os) && version > 8 ||
|
|
||||||
version == 8 && !/Trident/.test(ua)
|
|
||||||
))
|
|
||||||
) && !reOpera.test(data = parse.call(forOwn, ua.replace(reOpera, '') + ';')) && data.name) {
|
|
||||||
|
|
||||||
// when "indentifying", the UA contains both Opera and the other browser's name
|
|
||||||
data = 'ing as ' + data.name + ((data = data.version) ? ' ' + data : '');
|
|
||||||
if (reOpera.test(name)) {
|
|
||||||
if (/IE/.test(data) && os == 'Mac OS') {
|
|
||||||
os = null;
|
|
||||||
}
|
|
||||||
data = 'identify' + data;
|
|
||||||
}
|
|
||||||
// when "masking", the UA contains only the other browser's name
|
|
||||||
else {
|
|
||||||
data = 'mask' + data;
|
|
||||||
if (operaClass) {
|
|
||||||
name = format(operaClass.replace(/([a-z])([A-Z])/g, '$1 $2'));
|
|
||||||
} else {
|
|
||||||
name = 'Opera';
|
|
||||||
}
|
|
||||||
if (/IE/.test(data)) {
|
|
||||||
os = null;
|
|
||||||
}
|
|
||||||
if (!useFeatures) {
|
|
||||||
version = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
layout = ['Presto'];
|
|
||||||
description.push(data);
|
|
||||||
}
|
|
||||||
// detect WebKit Nightly and approximate Chrome/Safari versions
|
|
||||||
if ((data = (/\bAppleWebKit\/([\d.]+\+?)/i.exec(ua) || 0)[1])) {
|
|
||||||
// correct build for numeric comparison
|
|
||||||
// (e.g. "532.5" becomes "532.05")
|
|
||||||
data = [parseFloat(data.replace(/\.(\d)$/, '.0$1')), data];
|
|
||||||
// nightly builds are postfixed with a `+`
|
|
||||||
if (name == 'Safari' && data[1].slice(-1) == '+') {
|
|
||||||
name = 'WebKit Nightly';
|
|
||||||
prerelease = 'alpha';
|
|
||||||
version = data[1].slice(0, -1);
|
|
||||||
}
|
|
||||||
// clear incorrect browser versions
|
|
||||||
else if (version == data[1] ||
|
|
||||||
version == (/\bSafari\/([\d.]+\+?)/i.exec(ua) || 0)[1]) {
|
|
||||||
version = null;
|
|
||||||
}
|
|
||||||
// use the full Chrome version when available
|
|
||||||
data = [data[0], (/\bChrome\/([\d.]+)/i.exec(ua) || 0)[1]];
|
|
||||||
|
|
||||||
// detect JavaScriptCore
|
|
||||||
// http://stackoverflow.com/questions/6768474/how-can-i-detect-which-javascript-engine-v8-or-jsc-is-used-at-runtime-in-androi
|
|
||||||
if (!useFeatures || (/internal|\n/i.test(toString.toString()) && !data[1])) {
|
|
||||||
layout[1] = 'like Safari';
|
|
||||||
data = (data = data[0], data < 400 ? 1 : data < 500 ? 2 : data < 526 ? 3 : data < 533 ? 4 : data < 534 ? '4+' : data < 535 ? 5 : '5');
|
|
||||||
} else {
|
|
||||||
layout[1] = 'like Chrome';
|
|
||||||
data = data[1] || (data = data[0], data < 530 ? 1 : data < 532 ? 2 : data < 532.05 ? 3 : data < 533 ? 4 : data < 534.03 ? 5 : data < 534.07 ? 6 : data < 534.10 ? 7 : data < 534.13 ? 8 : data < 534.16 ? 9 : data < 534.24 ? 10 : data < 534.30 ? 11 : data < 535.01 ? 12 : data < 535.02 ? '13+' : data < 535.07 ? 15 : data < 535.11 ? 16 : data < 535.19 ? 17 : data < 536.05 ? 18 : data < 536.10 ? 19 : data < 537.01 ? 20 : '21');
|
|
||||||
}
|
|
||||||
// add the postfix of ".x" or "+" for approximate versions
|
|
||||||
layout[1] += ' ' + (data += typeof data == 'number' ? '.x' : /[.+]/.test(data) ? '' : '+');
|
|
||||||
// obscure version for some Safari 1-2 releases
|
|
||||||
if (name == 'Safari' && (!version || parseInt(version) > 45)) {
|
|
||||||
version = data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// detect Opera desktop modes
|
|
||||||
if (name == 'Opera' && (data = /(?:zbov|zvav)$/.exec(os))) {
|
|
||||||
name += ' ';
|
|
||||||
description.unshift('desktop mode');
|
|
||||||
if (data == 'zvav') {
|
|
||||||
name += 'Mini';
|
|
||||||
version = null;
|
|
||||||
} else {
|
|
||||||
name += 'Mobile';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// detect Chrome desktop mode
|
|
||||||
else if (name == 'Safari' && /Chrome/.exec(layout[1])) {
|
|
||||||
description.unshift('desktop mode');
|
|
||||||
name = 'Chrome Mobile';
|
|
||||||
version = null;
|
|
||||||
|
|
||||||
if (/Mac OS X/.test(os)) {
|
|
||||||
manufacturer = 'Apple';
|
|
||||||
os = 'iOS 4.3+';
|
|
||||||
} else {
|
|
||||||
os = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// strip incorrect OS versions
|
|
||||||
if (version && version.indexOf(data = /[\d.]+$/.exec(os)) == 0 &&
|
|
||||||
ua.indexOf('/' + data + '-') > -1) {
|
|
||||||
os = trim(os.replace(data, ''));
|
|
||||||
}
|
|
||||||
// add layout engine
|
|
||||||
if (layout && !/Avant|Nook/.test(name) && (
|
|
||||||
/Browser|Lunascape|Maxthon/.test(name) ||
|
|
||||||
/^(?:Adobe|Arora|Midori|Phantom|Rekonq|Rock|Sleipnir|Web)/.test(name) && layout[1])) {
|
|
||||||
// don't add layout details to description if they are falsey
|
|
||||||
(data = layout[layout.length - 1]) && description.push(data);
|
|
||||||
}
|
|
||||||
// combine contextual information
|
|
||||||
if (description.length) {
|
|
||||||
description = ['(' + description.join('; ') + ')'];
|
|
||||||
}
|
|
||||||
// append manufacturer
|
|
||||||
if (manufacturer && product && product.indexOf(manufacturer) < 0) {
|
|
||||||
description.push('on ' + manufacturer);
|
|
||||||
}
|
|
||||||
// append product
|
|
||||||
if (product) {
|
|
||||||
description.push((/^on /.test(description[description.length -1]) ? '' : 'on ') + product);
|
|
||||||
}
|
|
||||||
// parse OS into an object
|
|
||||||
if (os) {
|
|
||||||
data = / ([\d.+]+)$/.exec(os);
|
|
||||||
os = {
|
|
||||||
'architecture': 32,
|
|
||||||
'family': data ? os.replace(data[0], '') : os,
|
|
||||||
'version': data ? data[1] : null,
|
|
||||||
'toString': function() {
|
|
||||||
var version = this.version;
|
|
||||||
return this.family + (version ? ' ' + version : '') + (this.architecture == 64 ? ' 64-bit' : '');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
// add browser/OS architecture
|
|
||||||
if ((data = / (?:AMD|IA|Win|WOW|x86_|x)64\b/i.exec(arch)) && !/\bi686\b/i.test(arch)) {
|
|
||||||
if (os) {
|
|
||||||
os.architecture = 64;
|
|
||||||
os.family = os.family.replace(data, '');
|
|
||||||
}
|
|
||||||
if (name && (/WOW64/i.test(ua) ||
|
|
||||||
(useFeatures && /\w(?:86|32)$/.test(nav.cpuClass || nav.platform)))) {
|
|
||||||
description.unshift('32-bit');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ua || (ua = null);
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The platform object.
|
|
||||||
*
|
|
||||||
* @name platform
|
|
||||||
* @type Object
|
|
||||||
*/
|
|
||||||
return {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The browser/environment version.
|
|
||||||
*
|
|
||||||
* @memberOf platform
|
|
||||||
* @type String|Null
|
|
||||||
*/
|
|
||||||
'version': name && version && (description.unshift(version), version),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The name of the browser/environment.
|
|
||||||
*
|
|
||||||
* @memberOf platform
|
|
||||||
* @type String|Null
|
|
||||||
*/
|
|
||||||
'name': name && (description.unshift(name), name),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The name of the operating system.
|
|
||||||
*
|
|
||||||
* @memberOf platform
|
|
||||||
* @type Object
|
|
||||||
*/
|
|
||||||
'os': os
|
|
||||||
? (name &&
|
|
||||||
!(os == String(os).split(' ')[0] && (os == name.split(' ')[0] || product)) &&
|
|
||||||
description.push(product ? '(' + os + ')' : 'on ' + os), os)
|
|
||||||
: {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The CPU architecture the OS is built for.
|
|
||||||
*
|
|
||||||
* @memberOf platform.os
|
|
||||||
* @type String|Null
|
|
||||||
*/
|
|
||||||
'architecture': null,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The family of the OS.
|
|
||||||
*
|
|
||||||
* @memberOf platform.os
|
|
||||||
* @type String|Null
|
|
||||||
*/
|
|
||||||
'family': null,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The version of the OS.
|
|
||||||
*
|
|
||||||
* @memberOf platform.os
|
|
||||||
* @type String|Null
|
|
||||||
*/
|
|
||||||
'version': null,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the OS string.
|
|
||||||
*
|
|
||||||
* @memberOf platform.os
|
|
||||||
* @returns {String} The OS string.
|
|
||||||
*/
|
|
||||||
'toString': function() { return 'null'; }
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The platform description.
|
|
||||||
*
|
|
||||||
* @memberOf platform
|
|
||||||
* @type String|Null
|
|
||||||
*/
|
|
||||||
'description': description.length ? description.join(' ') : ua,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The name of the browser layout engine.
|
|
||||||
*
|
|
||||||
* @memberOf platform
|
|
||||||
* @type String|Null
|
|
||||||
*/
|
|
||||||
'layout': layout && layout[0],
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The name of the product's manufacturer.
|
|
||||||
*
|
|
||||||
* @memberOf platform
|
|
||||||
* @type String|Null
|
|
||||||
*/
|
|
||||||
'manufacturer': manufacturer,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The alpha/beta release indicator.
|
|
||||||
*
|
|
||||||
* @memberOf platform
|
|
||||||
* @type String|Null
|
|
||||||
*/
|
|
||||||
'prerelease': prerelease,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The name of the product hosting the browser.
|
|
||||||
*
|
|
||||||
* @memberOf platform
|
|
||||||
* @type String|Null
|
|
||||||
*/
|
|
||||||
'product': product,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The browser's user agent string.
|
|
||||||
*
|
|
||||||
* @memberOf platform
|
|
||||||
* @type String|Null
|
|
||||||
*/
|
|
||||||
'ua': ua,
|
|
||||||
|
|
||||||
// parses a user agent string into a platform object
|
|
||||||
'parse': parse,
|
|
||||||
|
|
||||||
// returns the platform description
|
|
||||||
'toString': toStringPlatform
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// expose platform
|
|
||||||
// some AMD build optimizers, like r.js, check for specific condition patterns like the following:
|
|
||||||
if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
|
|
||||||
// define as an anonymous module so, through path mapping, it can be aliased
|
|
||||||
define(function() {
|
|
||||||
return parse();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
// check for `exports` after `define` in case a build optimizer adds an `exports` object
|
|
||||||
else if (freeExports) {
|
|
||||||
// in Narwhal, Node.js, or RingoJS
|
|
||||||
forOwn(parse(), function(value, key) {
|
|
||||||
freeExports[key] = value;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
// in a browser or Rhino
|
|
||||||
else {
|
|
||||||
// use square bracket notation so Closure Compiler won't munge `platform`
|
|
||||||
// http://code.google.com/closure/compiler/docs/api-tutorial3.html#export
|
|
||||||
window['platform'] = parse();
|
|
||||||
}
|
|
||||||
}(this));
|
|
||||||
20
vendor/qunit-clib/LICENSE.txt
vendored
20
vendor/qunit-clib/LICENSE.txt
vendored
@@ -1,20 +0,0 @@
|
|||||||
Copyright 2011-2012 John-David Dalton <http://allyoucanleet.com/>
|
|
||||||
|
|
||||||
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.
|
|
||||||
57
vendor/qunit-clib/README.md
vendored
57
vendor/qunit-clib/README.md
vendored
@@ -1,57 +0,0 @@
|
|||||||
# QUnit CLIB <sup>v1.0.0</sup>
|
|
||||||
## command-line interface boilerplate
|
|
||||||
|
|
||||||
QUnit CLIB helps extend QUnit's CLI support to many common CLI environments.
|
|
||||||
|
|
||||||
## Screenshot
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Support
|
|
||||||
|
|
||||||
QUnit CLIB has been tested in at least Node.js 0.4.8-0.8.6, Narwhal v0.3.2, RingoJS v0.8.0, and Rhino v1.7RC3-RC5.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```js
|
|
||||||
(function(window) {
|
|
||||||
|
|
||||||
// use a single load function
|
|
||||||
var load = typeof require == 'function' ? require : window.load;
|
|
||||||
|
|
||||||
// load QUnit and CLIB if needed
|
|
||||||
var QUnit =
|
|
||||||
window.QUnit || (
|
|
||||||
window.setTimeout || (window.addEventListener = window.setTimeout = / /),
|
|
||||||
window.QUnit = load('path/to/qunit.js') || window.QUnit,
|
|
||||||
load('path/to/qunit-clib.js'),
|
|
||||||
(window.addEventListener || 0).test && delete window.addEventListener,
|
|
||||||
window.QUnit
|
|
||||||
);
|
|
||||||
|
|
||||||
// explicitly call `QUnit.module()` instead of `module()`
|
|
||||||
// in case we are in a CLI environment
|
|
||||||
QUnit.module('A Test Module');
|
|
||||||
|
|
||||||
test('A Test', function() {
|
|
||||||
// ...
|
|
||||||
});
|
|
||||||
|
|
||||||
// must call `QUnit.start()` if using QUnit < 1.3.0 with Node.js or any
|
|
||||||
// version of QUnit with Narwhal, Rhino, or RingoJS
|
|
||||||
if (!window.document) {
|
|
||||||
QUnit.start();
|
|
||||||
}
|
|
||||||
}(typeof global == 'object' && global || this));
|
|
||||||
```
|
|
||||||
|
|
||||||
## Footnotes
|
|
||||||
|
|
||||||
1. QUnit v1.3.0 does not work with Narwhal or Ringo < v0.8.0
|
|
||||||
|
|
||||||
2. Rhino v1.7RC4 does not support timeout fallbacks `clearTimeout` and `setTimeout`
|
|
||||||
|
|
||||||
## Author
|
|
||||||
|
|
||||||
* [John-David Dalton](http://allyoucanleet.com/)
|
|
||||||
[](https://twitter.com/jdalton "Follow @jdalton on Twitter")
|
|
||||||
319
vendor/qunit-clib/qunit-clib.js
vendored
319
vendor/qunit-clib/qunit-clib.js
vendored
@@ -1,319 +0,0 @@
|
|||||||
/*!
|
|
||||||
* QUnit CLI Boilerplate v1.0.0
|
|
||||||
* Copyright 2011-2012 John-David Dalton <http://allyoucanleet.com/>
|
|
||||||
* Based on a gist by Jörn Zaefferer <https://gist.github.com/722381>
|
|
||||||
* Available under MIT license <http://mths.be/mit>
|
|
||||||
*/
|
|
||||||
;(function(global) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/** Add `console.log()` support for Narwhal, Rhino, and RingoJS */
|
|
||||||
global.console || (global.console = { 'log': global.print });
|
|
||||||
|
|
||||||
/** Reduce global.QUnit.QUnit -> global.QUnit */
|
|
||||||
global.QUnit && (QUnit = QUnit.QUnit || QUnit);
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/** Used as a horizontal rule in console output */
|
|
||||||
var hr = '----------------------------------------';
|
|
||||||
|
|
||||||
/** Shortcut used to convert array-like objects to arrays */
|
|
||||||
var slice = [].slice;
|
|
||||||
|
|
||||||
/** Used to resolve a value's internal [[Class]] */
|
|
||||||
var toString = {}.toString;
|
|
||||||
|
|
||||||
/** Used by timer methods */
|
|
||||||
var doneCalled,
|
|
||||||
timer,
|
|
||||||
counter = 0,
|
|
||||||
ids = {};
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An iteration utility for arrays.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Array} array The array to iterate over.
|
|
||||||
* @param {Function} callback The function called per iteration.
|
|
||||||
*/
|
|
||||||
function each(array, callback) {
|
|
||||||
var index = -1,
|
|
||||||
length = array.length;
|
|
||||||
|
|
||||||
while (++index < length) {
|
|
||||||
callback(array[index], index, array);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the specified `value` is a function.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Mixed} value The value to check.
|
|
||||||
* @returns {Boolean} Returns `true` if `value` is a function, else `false`.
|
|
||||||
*/
|
|
||||||
function isFunction(value) {
|
|
||||||
return toString.call(value) == '[object Function]';
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Timeout fallbacks based on the work of Andrea Giammarchi and Weston C.
|
|
||||||
* https://github.com/WebReflection/wru/blob/master/src/rhinoTimers.js
|
|
||||||
* http://stackoverflow.com/questions/2261705/how-to-run-a-javascript-function-asynchronously-without-using-settimeout
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clears the delay set by `setInterval` or `setTimeout`.
|
|
||||||
*
|
|
||||||
* @memberOf global
|
|
||||||
* @param {Number} id The ID of the timeout to be cleared.
|
|
||||||
*/
|
|
||||||
function clearTimer(id) {
|
|
||||||
if (ids[id]) {
|
|
||||||
ids[id].cancel();
|
|
||||||
timer.purge();
|
|
||||||
delete ids[id];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Schedules timer-based callbacks.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {Function} fn The function to call.
|
|
||||||
* @oaram {Number} delay The number of milliseconds to delay the `fn` call.
|
|
||||||
* @param [arg1, arg2, ...] Arguments to invoke `fn` with.
|
|
||||||
* @param {Boolean} repeated A flag to specify whether `fn` is called repeatedly.
|
|
||||||
* @returns {Number} The the ID of the timeout.
|
|
||||||
*/
|
|
||||||
function schedule(fn, delay, args, repeated) {
|
|
||||||
// Rhino 1.7RC4 will error assigning `task` below
|
|
||||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=775566
|
|
||||||
var task = ids[++counter] = new JavaAdapter(java.util.TimerTask, {
|
|
||||||
'run': function() {
|
|
||||||
fn.apply(global, args);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// support non-functions
|
|
||||||
if (!isFunction(fn)) {
|
|
||||||
fn = (function(code) {
|
|
||||||
code = String(code);
|
|
||||||
return function() { eval(code); };
|
|
||||||
}(fn));
|
|
||||||
}
|
|
||||||
// used by setInterval
|
|
||||||
if (repeated) {
|
|
||||||
timer.schedule(task, delay, delay);
|
|
||||||
}
|
|
||||||
// used by setTimeout
|
|
||||||
else {
|
|
||||||
timer.schedule(task, delay);
|
|
||||||
}
|
|
||||||
return counter;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Executes a code snippet or function repeatedly, with a delay between each call.
|
|
||||||
*
|
|
||||||
* @memberOf global
|
|
||||||
* @param {Function|String} fn The function to call or string to evaluate.
|
|
||||||
* @oaram {Number} delay The number of milliseconds to delay each `fn` call.
|
|
||||||
* @param [arg1, arg2, ...] Arguments to invoke `fn` with.
|
|
||||||
* @returns {Number} The the ID of the timeout.
|
|
||||||
*/
|
|
||||||
function setInterval(fn, delay) {
|
|
||||||
return schedule(fn, delay, slice.call(arguments, 2), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Executes a code snippet or a function after specified delay.
|
|
||||||
*
|
|
||||||
* @memberOf global
|
|
||||||
* @param {Function|String} fn The function to call or string to evaluate.
|
|
||||||
* @oaram {Number} delay The number of milliseconds to delay the `fn` call.
|
|
||||||
* @param [arg1, arg2, ...] Arguments to invoke `fn` with.
|
|
||||||
* @returns {Number} The the ID of the timeout.
|
|
||||||
*/
|
|
||||||
function setTimeout(fn, delay) {
|
|
||||||
return schedule(fn, delay, slice.call(arguments, 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A logging callback triggered when all testing is completed.
|
|
||||||
*
|
|
||||||
* @memberOf QUnit
|
|
||||||
* @param {Object} details An object with properties `failed`, `passed`,
|
|
||||||
* `runtime`, and `total`.
|
|
||||||
*/
|
|
||||||
function done(details) {
|
|
||||||
// stop `asyncTest()` from erroneously calling `done()` twice in
|
|
||||||
// environments w/o timeouts
|
|
||||||
if (doneCalled) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
doneCalled = true;
|
|
||||||
console.log(hr);
|
|
||||||
console.log(' PASS: ' + details.passed + ' FAIL: ' + details.failed + ' TOTAL: ' + details.total);
|
|
||||||
console.log(' Finished in ' + details.runtime + ' milliseconds.');
|
|
||||||
console.log(hr);
|
|
||||||
|
|
||||||
// exit out of Rhino
|
|
||||||
try {
|
|
||||||
quit();
|
|
||||||
} catch(e) { }
|
|
||||||
|
|
||||||
// exit out of Node.js
|
|
||||||
try {
|
|
||||||
process.exit();
|
|
||||||
} catch(e) { }
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A logging callback triggered after every assertion.
|
|
||||||
*
|
|
||||||
* @memberOf QUnit
|
|
||||||
* @param {Object} details An object with properties `actual`, `expected`,
|
|
||||||
* `message`, and `result`.
|
|
||||||
*/
|
|
||||||
function log(details) {
|
|
||||||
var expected = details.expected,
|
|
||||||
result = details.result,
|
|
||||||
type = typeof expected != 'undefined' ? 'EQ' : 'OK';
|
|
||||||
|
|
||||||
var assertion = [
|
|
||||||
result ? 'PASS' : 'FAIL',
|
|
||||||
type,
|
|
||||||
details.message || 'ok'
|
|
||||||
];
|
|
||||||
|
|
||||||
if (!result && type == 'EQ') {
|
|
||||||
assertion.push('Expected: ' + expected + ', Actual: ' + details.actual);
|
|
||||||
}
|
|
||||||
QUnit.config.testStats.assertions.push(assertion.join(' | '));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A logging callback triggered at the start of every test module.
|
|
||||||
*
|
|
||||||
* @memberOf QUnit
|
|
||||||
* @param {Object} details An object with property `name`.
|
|
||||||
*/
|
|
||||||
function moduleStart(details) {
|
|
||||||
console.log(hr);
|
|
||||||
console.log(details.name);
|
|
||||||
console.log(hr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts an object into a string representation.
|
|
||||||
*
|
|
||||||
* @memberOf QUnit
|
|
||||||
* @type Function
|
|
||||||
* @param {Object} object The object to stringify.
|
|
||||||
* @returns {String} The result string.
|
|
||||||
*/
|
|
||||||
var parseObject = (function() {
|
|
||||||
var func = QUnit.jsDump.parsers.object;
|
|
||||||
return function(object) {
|
|
||||||
// fork to support Rhino's error objects
|
|
||||||
if (typeof object.rhinoException == 'object') {
|
|
||||||
return object.name +
|
|
||||||
' { message: "' + object.message +
|
|
||||||
'", fileName: "' + object.fileName +
|
|
||||||
'", lineNumber: ' + object.lineNumber + ' }';
|
|
||||||
}
|
|
||||||
return func(object);
|
|
||||||
};
|
|
||||||
}());
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A logging callback triggered after a test is completed.
|
|
||||||
*
|
|
||||||
* @memberOf QUnit
|
|
||||||
* @param {Object} details An object with properties `failed`, `name`,
|
|
||||||
* `passed`, and `total`.
|
|
||||||
*/
|
|
||||||
function testDone(details) {
|
|
||||||
var assertions = QUnit.config.testStats.assertions,
|
|
||||||
testName = details.name;
|
|
||||||
|
|
||||||
if (details.failed > 0) {
|
|
||||||
console.log(' FAIL - '+ testName);
|
|
||||||
each(assertions, function(value) {
|
|
||||||
console.log(' ' + value);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
console.log(' PASS - ' + testName);
|
|
||||||
}
|
|
||||||
assertions.length = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An object used to hold information about the current running test.
|
|
||||||
*
|
|
||||||
* @memberOf QUnit.config
|
|
||||||
* @type Object
|
|
||||||
*/
|
|
||||||
QUnit.config.testStats = {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An array of test summaries (pipe separated).
|
|
||||||
*
|
|
||||||
* @memberOf QUnit.config.testStats
|
|
||||||
* @type Array
|
|
||||||
*/
|
|
||||||
'assertions': []
|
|
||||||
};
|
|
||||||
|
|
||||||
// add shortcuts to the global
|
|
||||||
// exclude `module` because some environments have it as a built-in object
|
|
||||||
each(['asyncTest', 'deepEqual', 'equal', 'equals', 'expect', 'notDeepEqual',
|
|
||||||
'notEqual', 'notStrictEqual', 'ok', 'raises', 'same', 'start', 'stop',
|
|
||||||
'strictEqual', 'test', 'throws'], function(funcName) {
|
|
||||||
var func = QUnit[funcName];
|
|
||||||
if (func) {
|
|
||||||
global[funcName] = func;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// expose timer methods to global
|
|
||||||
try {
|
|
||||||
timer = new java.util.Timer;
|
|
||||||
if (!isFunction(global.clearInterval)) {
|
|
||||||
global.clearInterval = clearTimer;
|
|
||||||
}
|
|
||||||
if (!isFunction(global.clearTimeout)) {
|
|
||||||
global.clearTimeout = clearTimer;
|
|
||||||
}
|
|
||||||
if (!isFunction(global.setInterval)) {
|
|
||||||
global.setInterval = setInterval;
|
|
||||||
}
|
|
||||||
if (!isFunction(global.setTimeout)) {
|
|
||||||
global.setTimeout = setTimeout;
|
|
||||||
}
|
|
||||||
} catch(e) { }
|
|
||||||
|
|
||||||
// add callbacks
|
|
||||||
QUnit.done(done);
|
|
||||||
QUnit.log(log);
|
|
||||||
QUnit.moduleStart(moduleStart);
|
|
||||||
QUnit.testDone(testDone);
|
|
||||||
|
|
||||||
// add wrapped function
|
|
||||||
QUnit.jsDump.parsers.object = parseObject;
|
|
||||||
|
|
||||||
// must call `QUnit.start()` in the test file if using QUnit < 1.3.0 with
|
|
||||||
// Node.js or any version of QUnit with Narwhal, Rhino, or RingoJS
|
|
||||||
QUnit.init();
|
|
||||||
|
|
||||||
}(typeof global == 'object' && global || this));
|
|
||||||
49
vendor/qunit/README.md
vendored
49
vendor/qunit/README.md
vendored
@@ -1,49 +0,0 @@
|
|||||||
[QUnit](http://docs.jquery.com/QUnit) - A JavaScript Unit Testing framework.
|
|
||||||
================================
|
|
||||||
|
|
||||||
QUnit is a powerful, easy-to-use, JavaScript test suite. It's used by the jQuery
|
|
||||||
project to test its code and plugins but is capable of testing any generic
|
|
||||||
JavaScript code (and even capable of testing JavaScript code on the server-side).
|
|
||||||
|
|
||||||
QUnit is especially useful for regression testing: Whenever a bug is reported,
|
|
||||||
write a test that asserts the existence of that particular bug. Then fix it and
|
|
||||||
commit both. Every time you work on the code again, run the tests. If the bug
|
|
||||||
comes up again - a regression - you'll spot it immediately and know how to fix
|
|
||||||
it, because you know what code you just changed.
|
|
||||||
|
|
||||||
Having good unit test coverage makes safe refactoring easy and cheap. You can
|
|
||||||
run the tests after each small refactoring step and always know what change
|
|
||||||
broke something.
|
|
||||||
|
|
||||||
QUnit is similar to other unit testing frameworks like JUnit, but makes use of
|
|
||||||
the features JavaScript provides and helps with testing code in the browser, e.g.
|
|
||||||
with its stop/start facilities for testing asynchronous code.
|
|
||||||
|
|
||||||
If you are interested in helping developing QUnit, you are in the right place.
|
|
||||||
For related discussions, visit the
|
|
||||||
[QUnit and Testing forum](http://forum.jquery.com/qunit-and-testing).
|
|
||||||
|
|
||||||
Planning for a qunitjs.com site and other testing tools related work now happens
|
|
||||||
on the [jQuery Testing Team planning wiki](http://jquerytesting.pbworks.com/w/page/41556026/FrontPage).
|
|
||||||
|
|
||||||
Development
|
|
||||||
-----------
|
|
||||||
|
|
||||||
To submit patches, fork the repository, create a branch for the change. Then implement
|
|
||||||
the change, run `grunt` to lint and test it, then commit, push and create a pull request.
|
|
||||||
|
|
||||||
Include some background for the change in the commit message and `Fixes #nnn`, referring
|
|
||||||
to the issue number you're addressing.
|
|
||||||
|
|
||||||
To run `grunt`, you need `node` and `npm`, then `npm install grunt -g`.
|
|
||||||
|
|
||||||
Releases
|
|
||||||
--------
|
|
||||||
|
|
||||||
Install git-extras and run `git changelog` to update History.md.
|
|
||||||
Update qunit/qunit.js|css and package.json to the release version, commit and
|
|
||||||
tag, update them again to the next version, commit and push commits and tags
|
|
||||||
(`git push --tags origin master`).
|
|
||||||
|
|
||||||
Put the 'v' in front of the tag, e.g. `v1.8.0`. Clean up the changelog, removing merge commits
|
|
||||||
or whitespace cleanups.
|
|
||||||
1863
vendor/qunit/qunit/qunit-1.8.0.js
vendored
1863
vendor/qunit/qunit/qunit-1.8.0.js
vendored
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user