Compare commits
3312 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1a2cd2a9c3 | ||
|
|
062aed38a0 | ||
|
|
d0d72412d6 | ||
|
|
3450d832d4 | ||
|
|
79eda1681b | ||
|
|
1360359bba | ||
|
|
1a10c1b4f9 | ||
|
|
ae08b810bb | ||
|
|
2baaa1f20e | ||
|
|
25f0ba19ca | ||
|
|
32d873f41d | ||
|
|
772387a27a | ||
|
|
0dd17cc175 | ||
|
|
16e56c4edb | ||
|
|
f46b876fd6 | ||
|
|
1181ab67ba | ||
|
|
014c26be25 | ||
|
|
99eb9429fd | ||
|
|
d3b10d0d4d | ||
|
|
d9597d5ad5 | ||
|
|
55272e5ea2 | ||
|
|
d17fc86fa4 | ||
|
|
0b391584d4 | ||
|
|
e3e02aa30b | ||
|
|
403f53a397 | ||
|
|
bfd79e1af2 | ||
|
|
5745a984aa | ||
|
|
d2f1f67a22 | ||
|
|
d98cb50d7a | ||
|
|
cc4864976a | ||
|
|
92fa8b7421 | ||
|
|
aad2e8012b | ||
|
|
b3eae80ece | ||
|
|
b58d5b6066 | ||
|
|
f1b6e6570c | ||
|
|
8e758507b1 | ||
|
|
2601d8b702 | ||
|
|
fa0545e4b3 | ||
|
|
690208fd4e | ||
|
|
3272575f70 | ||
|
|
fad3142a47 | ||
|
|
1f74dcff14 | ||
|
|
62c7183922 | ||
|
|
ef73b0a07f | ||
|
|
ec7d42d1fd | ||
|
|
256a17f2c9 | ||
|
|
165ffed9e6 | ||
|
|
b89d6d78ef | ||
|
|
6890561723 | ||
|
|
849ce04def | ||
|
|
a29baf19d0 | ||
|
|
10d6a1fa54 | ||
|
|
6ea181c286 | ||
|
|
2d890603c6 | ||
|
|
d1ca30a28f | ||
|
|
35fccf8af8 | ||
|
|
f5baa56e05 | ||
|
|
d2c1be5c2d | ||
|
|
fd6525a9de | ||
|
|
ba03a134da | ||
|
|
9184c64ecb | ||
|
|
653a9664e4 | ||
|
|
51d0cedb29 | ||
|
|
fa6d1bb23c | ||
|
|
0f3b154699 | ||
|
|
d6e2b096ca | ||
|
|
2104a1250e | ||
|
|
ca99f60964 | ||
|
|
147c08bd71 | ||
|
|
ad440f70fa | ||
|
|
bb22155482 | ||
|
|
5c1999b3d0 | ||
|
|
87f0fcfd52 | ||
|
|
f6d53bc337 | ||
|
|
720fad80c3 | ||
|
|
196055e50e | ||
|
|
73125574e6 | ||
|
|
27a35a0388 | ||
|
|
8c6085b933 | ||
|
|
bef14f551e | ||
|
|
e56c2eb6ca | ||
|
|
165365473f | ||
|
|
3bdd9a850f | ||
|
|
b84ea020f2 | ||
|
|
90efc5740f | ||
|
|
c78e6588ad | ||
|
|
a21a3827fd | ||
|
|
2effbd0baf | ||
|
|
7ed03c8b90 | ||
|
|
59ce90e924 | ||
|
|
da38e6a23d | ||
|
|
698e5ec6ea | ||
|
|
7f25e3ba97 | ||
|
|
1a3500cad3 | ||
|
|
31c30a7602 | ||
|
|
014f3b9873 | ||
|
|
49cbcf01c6 | ||
|
|
f8cc129f04 | ||
|
|
236c1208e6 | ||
|
|
4c70e75bfc | ||
|
|
e8c5f3a882 | ||
|
|
302df56ee1 | ||
|
|
ccfc4d68f3 | ||
|
|
071ea1dc97 | ||
|
|
670033c4da | ||
|
|
fa7e4cc817 | ||
|
|
67c8d80190 | ||
|
|
792ce53992 | ||
|
|
b0a25f59d9 | ||
|
|
d76234c112 | ||
|
|
6fdfd3b9e7 | ||
|
|
38350a1ae4 | ||
|
|
ce2bba751c | ||
|
|
f149736a20 | ||
|
|
40330be123 | ||
|
|
93af4fc6b0 | ||
|
|
b574d4e388 | ||
|
|
eb4b429e19 | ||
|
|
21929b1db2 | ||
|
|
a5197ee039 | ||
|
|
e974981725 | ||
|
|
9ae4dd3dfe | ||
|
|
d0e4dabe90 | ||
|
|
a3c569137e | ||
|
|
3edb360d79 | ||
|
|
f5285b48b1 | ||
|
|
c01b76e098 | ||
|
|
6adb47c447 | ||
|
|
b0b2d3a727 | ||
|
|
8410d7b08e | ||
|
|
e6408a0c37 | ||
|
|
e96c82b171 | ||
|
|
ee31813a0d | ||
|
|
ac62fd6204 | ||
|
|
25fbcc144c | ||
|
|
30cb7e62fd | ||
|
|
7c7ccc3a07 | ||
|
|
fb3f4fa0a8 | ||
|
|
2b62244806 | ||
|
|
f5dc197e8b | ||
|
|
e6060048bd | ||
|
|
f83ff068ae | ||
|
|
b21a6b76e0 | ||
|
|
70527022d9 | ||
|
|
8cddd595d4 | ||
|
|
96b79d5f06 | ||
|
|
1c7b07d614 | ||
|
|
0d59de5767 | ||
|
|
e3613c54e9 | ||
|
|
5956e6d9c1 | ||
|
|
ec895f271b | ||
|
|
751f30e316 | ||
|
|
cee8253cd3 | ||
|
|
ae4cb6e372 | ||
|
|
398f976f3e | ||
|
|
5f049beb04 | ||
|
|
a8d67a1c60 | ||
|
|
26aa9727a1 | ||
|
|
3cef696a65 | ||
|
|
397b1533f0 | ||
|
|
5680a34ec1 | ||
|
|
84a197299f | ||
|
|
4307882fa8 | ||
|
|
d2dfbff832 | ||
|
|
8cc58d0b89 | ||
|
|
971fc462ab | ||
|
|
8d2256d359 | ||
|
|
8f3b863edd | ||
|
|
4cc6c5ec35 | ||
|
|
cf53614721 | ||
|
|
efe84e58d7 | ||
|
|
cf59ad76fb | ||
|
|
2216cda2f1 | ||
|
|
595b15fcd9 | ||
|
|
a104c7f0f8 | ||
|
|
059392d257 | ||
|
|
5a1b3da394 | ||
|
|
92d7c2926c | ||
|
|
8f39697e3d | ||
|
|
ff328381af | ||
|
|
3bb3c06456 | ||
|
|
1cbcd41b17 | ||
|
|
5ebd9eb577 | ||
|
|
850d9ee095 | ||
|
|
5db1f91b01 | ||
|
|
ac6b9712ad | ||
|
|
df93f4ba99 | ||
|
|
7c20d46eeb | ||
|
|
fe432fcca8 | ||
|
|
5b1638ea59 | ||
|
|
87a1d4088b | ||
|
|
038c346500 | ||
|
|
0bcaa13056 | ||
|
|
c0e62372e6 | ||
|
|
84169cce10 | ||
|
|
c2c163ac4e | ||
|
|
ecb5d2ae1c | ||
|
|
3d619f1670 | ||
|
|
3265549911 | ||
|
|
d5c3a3e5e8 | ||
|
|
30dff09d7e | ||
|
|
85f7d19eb2 | ||
|
|
6adda5c29c | ||
|
|
4a03756b5b | ||
|
|
b1554ebf37 | ||
|
|
b6307b4fd6 | ||
|
|
6f22c7ad19 | ||
|
|
bc9add783c | ||
|
|
ee67221068 | ||
|
|
71e528139c | ||
|
|
c674fe1f04 | ||
|
|
d047e95bb5 | ||
|
|
791518d6c4 | ||
|
|
83afd55e0e | ||
|
|
7870a66790 | ||
|
|
c923e96f3e | ||
|
|
dd79834137 | ||
|
|
8995f0af55 | ||
|
|
e75a74565b | ||
|
|
1792849b98 | ||
|
|
c7fb1f6d17 | ||
|
|
a856263081 | ||
|
|
582d1320a3 | ||
|
|
3789da4305 | ||
|
|
a36f97adfb | ||
|
|
2cda53d3af | ||
|
|
74007ea465 | ||
|
|
c88a7dba6b | ||
|
|
66b7863d43 | ||
|
|
19b318a488 | ||
|
|
c606e3db43 | ||
|
|
f89ab74b29 | ||
|
|
4bbdec5044 | ||
|
|
56a727cf0d | ||
|
|
32f74e41ef | ||
|
|
e249bc5856 | ||
|
|
32b8a344a6 | ||
|
|
61c0c35e92 | ||
|
|
2eecaf4570 | ||
|
|
8f59247acb | ||
|
|
eb3ec26279 | ||
|
|
f07d37ce0d | ||
|
|
2e8602eb43 | ||
|
|
4277041b0e | ||
|
|
6801190180 | ||
|
|
067a9cf54d | ||
|
|
d31a8c203f | ||
|
|
99e8a393b6 | ||
|
|
42ba0a2642 | ||
|
|
cc0cd51658 | ||
|
|
9d3014e39c | ||
|
|
1ac3a9da4f | ||
|
|
7c80bbecd9 | ||
|
|
d55e6191c2 | ||
|
|
3875603285 | ||
|
|
a62261343c | ||
|
|
8b0a995f23 | ||
|
|
4734cb3428 | ||
|
|
34f814717b | ||
|
|
d4b56f99ff | ||
|
|
f51d51abf4 | ||
|
|
a13a0ee5a9 | ||
|
|
19f4ad0361 | ||
|
|
93dc96f150 | ||
|
|
64d9e9054c | ||
|
|
b1ed7227d7 | ||
|
|
48215c1eae | ||
|
|
7399a978f5 | ||
|
|
3737ad6524 | ||
|
|
b37695bc6f | ||
|
|
6e97d588e4 | ||
|
|
17319b15b0 | ||
|
|
0692afcd90 | ||
|
|
91ac3f7931 | ||
|
|
9d5990311f | ||
|
|
6f38cdec5a | ||
|
|
7a1f3a0cb1 | ||
|
|
99356f7880 | ||
|
|
d38d7b8ff6 | ||
|
|
834ac42d24 | ||
|
|
e80fac4900 | ||
|
|
a13c8cb71e | ||
|
|
3dc61962de | ||
|
|
5c3acf61b4 | ||
|
|
953d835ded | ||
|
|
1537ca4e71 | ||
|
|
2d94ace89f | ||
|
|
ea9c0b919f | ||
|
|
d178fa5bdb | ||
|
|
01f11d94b0 | ||
|
|
58f1a8e916 | ||
|
|
688fefc4dd | ||
|
|
ce96e34d25 | ||
|
|
a1e1d663c3 | ||
|
|
245b52d8e2 | ||
|
|
1de93be0f0 | ||
|
|
e723e87c74 | ||
|
|
c9535749f5 | ||
|
|
497a66ea38 | ||
|
|
62d9735a7e | ||
|
|
0f8fbf6a1e | ||
|
|
66c2d1cba1 | ||
|
|
69cde6092b | ||
|
|
3e9face818 | ||
|
|
4dfac02065 | ||
|
|
7551509f41 | ||
|
|
5f42866cea | ||
|
|
50d91670ec | ||
|
|
8c04421387 | ||
|
|
c39be3dbc9 | ||
|
|
8aa8c296e1 | ||
|
|
592c55c524 | ||
|
|
eafaf35790 | ||
|
|
585c66a4d0 | ||
|
|
1ecedd5566 | ||
|
|
3a0a5a7754 | ||
|
|
d329406eb8 | ||
|
|
e654999fdf | ||
|
|
efe98f7fad | ||
|
|
87bc957662 | ||
|
|
15e93d6304 | ||
|
|
5471735419 | ||
|
|
6b2955f135 | ||
|
|
1ab0a5182f | ||
|
|
dad65998cc | ||
|
|
abd30f3e41 | ||
|
|
7f42d9784e | ||
|
|
1056dac070 | ||
|
|
c05622484d | ||
|
|
59659a13f1 | ||
|
|
73c6cbb562 | ||
|
|
9f724221fa | ||
|
|
dfcd86ea09 | ||
|
|
555393d328 | ||
|
|
febacfcb79 | ||
|
|
1891bd494c | ||
|
|
ba5d53914e | ||
|
|
2ae38e20ab | ||
|
|
5f14b2e738 | ||
|
|
bc53951648 | ||
|
|
9a323e3387 | ||
|
|
72fe972cc0 | ||
|
|
88dfd90e3b | ||
|
|
1f9c1ce8e4 | ||
|
|
b4d75e3240 | ||
|
|
def0d7a519 | ||
|
|
a9cc4dabb7 | ||
|
|
e29e8ca0a3 | ||
|
|
5cda4135b1 | ||
|
|
221e153f4c | ||
|
|
3a24e4703d | ||
|
|
2b158c2b4e | ||
|
|
8b715ad9cd | ||
|
|
07cf527ddf | ||
|
|
63f1429a69 | ||
|
|
d881fc2fe0 | ||
|
|
d5090ee24b | ||
|
|
56c0a78c64 | ||
|
|
47037220e0 | ||
|
|
640fade438 | ||
|
|
98ede836d4 | ||
|
|
e75916fd92 | ||
|
|
e01ed8ad3c | ||
|
|
3beea79b38 | ||
|
|
1a29870958 | ||
|
|
7f3fae5a02 | ||
|
|
c2adf56b2f | ||
|
|
7a8f5a606c | ||
|
|
462c17a0c3 | ||
|
|
e59e3019e3 | ||
|
|
d65e2ab2d4 | ||
|
|
3f6120e122 | ||
|
|
e66e5e6f6e | ||
|
|
b0bc57466e | ||
|
|
154dc555c5 | ||
|
|
36559d0264 | ||
|
|
a722ce460c | ||
|
|
67b2f28064 | ||
|
|
8b988409e2 | ||
|
|
57c4658021 | ||
|
|
283bfde3d9 | ||
|
|
41935aa9aa | ||
|
|
9206d1f5f1 | ||
|
|
f5381ae3e3 | ||
|
|
95c4bf5854 | ||
|
|
2b4b23f726 | ||
|
|
64c17767ed | ||
|
|
32d75749a0 | ||
|
|
e776f9c7d8 | ||
|
|
3bdcf1077b | ||
|
|
da550a4a67 | ||
|
|
1655594514 | ||
|
|
c4f884f104 | ||
|
|
855f3d74fe | ||
|
|
7fc140af01 | ||
|
|
d401474981 | ||
|
|
0f6563e8e0 | ||
|
|
6cd0f83496 | ||
|
|
b428fc97e9 | ||
|
|
c14c51f551 | ||
|
|
8e18104f38 | ||
|
|
06fcc2bf46 | ||
|
|
1656b4c5b9 | ||
|
|
431f7ab37c | ||
|
|
f44109abae | ||
|
|
8cb134f56b | ||
|
|
032aa2d1d6 | ||
|
|
cbe20d9c96 | ||
|
|
e6b74b10eb | ||
|
|
8c4dbbfbec | ||
|
|
9bde15d4ac | ||
|
|
fd32dad7eb | ||
|
|
64df515c63 | ||
|
|
8908bd9889 | ||
|
|
5c3159cbca | ||
|
|
9afe72d508 | ||
|
|
c002d2c99f | ||
|
|
c768b6bd0c | ||
|
|
7903fe52b4 | ||
|
|
313b1b39a7 | ||
|
|
648f3abcbd | ||
|
|
2db98715cc | ||
|
|
5e3da57e21 | ||
|
|
dceef35aac | ||
|
|
2d23952181 | ||
|
|
518da7e81d | ||
|
|
8db1eb69dc | ||
|
|
d16ebba9e0 | ||
|
|
ee0420188c | ||
|
|
b9d14d31ae | ||
|
|
c505875fef | ||
|
|
6029f0ed36 | ||
|
|
734bed4821 | ||
|
|
26b3185933 | ||
|
|
5efa9ff0b2 | ||
|
|
ac6a013bf5 | ||
|
|
d9c4abe0df | ||
|
|
ae9e257e56 | ||
|
|
bb82a9bcf4 | ||
|
|
df61ea0a62 | ||
|
|
371926b202 | ||
|
|
fe77a7e01a | ||
|
|
e6b43e19c2 | ||
|
|
96b2145ba1 | ||
|
|
feb950be3c | ||
|
|
5b02bda277 | ||
|
|
ce4643d650 | ||
|
|
55c311cd39 | ||
|
|
8f8bfb9446 | ||
|
|
8f2a33dcaa | ||
|
|
4946daeea4 | ||
|
|
38ecc82e97 | ||
|
|
7ec8d02c1f | ||
|
|
a047ff2228 | ||
|
|
3dd181c912 | ||
|
|
3753ecd8e5 | ||
|
|
eaf05aa31a | ||
|
|
ad0f965f3a | ||
|
|
53e68c0567 | ||
|
|
9f609ac80f | ||
|
|
2b04d7a92d | ||
|
|
8f7305e347 | ||
|
|
9d3720557e | ||
|
|
aa79325d76 | ||
|
|
15b7b20500 | ||
|
|
6290630787 | ||
|
|
ad9e7b5eae | ||
|
|
fa31fbb343 | ||
|
|
ca7b6f139f | ||
|
|
a6e8cbc50d | ||
|
|
368640b59b | ||
|
|
22cb0b6afb | ||
|
|
08a7394c1b | ||
|
|
8a2fd5bf5e | ||
|
|
7add40ae93 | ||
|
|
d4da98bae5 | ||
|
|
92bbd83b33 | ||
|
|
b0c647e50c | ||
|
|
1ddd94b95c | ||
|
|
845c6be95f | ||
|
|
63d989cab4 | ||
|
|
92daf156f5 | ||
|
|
d0822ab1fe | ||
|
|
65cda38cc8 | ||
|
|
dcc1d545e9 | ||
|
|
e13967cb83 | ||
|
|
46d1bc274c | ||
|
|
81551104ce | ||
|
|
8b10fe4053 | ||
|
|
b5bd2df814 | ||
|
|
32ddf3246c | ||
|
|
8ccc996e63 | ||
|
|
bd7150d676 | ||
|
|
c35e70173b | ||
|
|
86f209a302 | ||
|
|
44943feb8b | ||
|
|
4331e9ae80 | ||
|
|
9ae97de780 | ||
|
|
d941b31c45 | ||
|
|
fed254f355 | ||
|
|
7f53877283 | ||
|
|
ca3a436fe5 | ||
|
|
d48ef90fb0 | ||
|
|
29bbe84f69 | ||
|
|
d079f0ca44 | ||
|
|
394f52a725 | ||
|
|
5828508218 | ||
|
|
2f244bca85 | ||
|
|
064d638588 | ||
|
|
7856495d59 | ||
|
|
c3bded6947 | ||
|
|
3a584e318a | ||
|
|
48d744b6bd | ||
|
|
6eba8130ba | ||
|
|
5ac7eddd03 | ||
|
|
b5dfe6320d | ||
|
|
19ee55a303 | ||
|
|
b715a008c5 | ||
|
|
1d4b834204 | ||
|
|
aa271423f9 | ||
|
|
0354026292 | ||
|
|
93752fb6cb | ||
|
|
7da8689bf2 | ||
|
|
afd22768fc | ||
|
|
e9ecdb3f56 | ||
|
|
e14ef2c671 | ||
|
|
d45c4740ad | ||
|
|
62bae55fd1 | ||
|
|
dcee505f6b | ||
|
|
ddf800de10 | ||
|
|
325db535c0 | ||
|
|
af4678ff18 | ||
|
|
cae77ae291 | ||
|
|
cab5a97117 | ||
|
|
0417b6266a | ||
|
|
fc7103f56e | ||
|
|
ffe9ec1c76 | ||
|
|
3fc738b53a | ||
|
|
7e1f554c4e | ||
|
|
5cfa8889f4 | ||
|
|
0cbe7a16e3 | ||
|
|
0cf3c097fb | ||
|
|
15061af796 | ||
|
|
2cfcad6a50 | ||
|
|
13a8ac3e50 | ||
|
|
7c5993d75b | ||
|
|
10c0325f18 | ||
|
|
367cb41121 | ||
|
|
c37884bdb7 | ||
|
|
37a551ecd3 | ||
|
|
dafc514353 | ||
|
|
aa6cb7d650 | ||
|
|
67e6688e69 | ||
|
|
5d9b71b038 | ||
|
|
2077cd4864 | ||
|
|
65276f45f1 | ||
|
|
95eb17bdb7 | ||
|
|
a88d66b48b | ||
|
|
a200c5397a | ||
|
|
87fb6fc3d1 | ||
|
|
79fcd45d5f | ||
|
|
e0ddaa74d0 | ||
|
|
d584dc5632 | ||
|
|
86704efcec | ||
|
|
6bb0f18d53 | ||
|
|
77e4984468 | ||
|
|
4e18c67ec5 | ||
|
|
6fbed4ad5c | ||
|
|
0fb42c6129 | ||
|
|
41ab94fe13 | ||
|
|
3a46f4589b | ||
|
|
14441ec144 | ||
|
|
f589dd2f26 | ||
|
|
629ba763d7 | ||
|
|
e896e1b3dd | ||
|
|
b92a127200 | ||
|
|
e02b8e227d | ||
|
|
367a7309bc | ||
|
|
6ecd2ed186 | ||
|
|
0ada26ccc2 | ||
|
|
a39faeec32 | ||
|
|
4e35b58d59 | ||
|
|
d03be75184 | ||
|
|
59b0109918 | ||
|
|
154e5aab8e | ||
|
|
5c38b9109e | ||
|
|
70b4b33823 | ||
|
|
6419c6b1ba | ||
|
|
1f9d9c619e | ||
|
|
2aa9f4c079 | ||
|
|
70495d9ce9 | ||
|
|
b3b7f8b980 | ||
|
|
b7e6d8646f | ||
|
|
466522fb12 | ||
|
|
549d68d3e8 | ||
|
|
42a54648a1 | ||
|
|
dc9b338cb9 | ||
|
|
b7d0455377 | ||
|
|
df0b11a960 | ||
|
|
111956e2f3 | ||
|
|
52c12731cb | ||
|
|
cf54a4919b | ||
|
|
ac26818005 | ||
|
|
467cf919be | ||
|
|
f48040a4d7 | ||
|
|
90ddcb30bf | ||
|
|
b713083574 | ||
|
|
fc7e7074ce | ||
|
|
e88e9bdf11 | ||
|
|
bc4ea885dc | ||
|
|
723ace2724 | ||
|
|
aeb454f31d | ||
|
|
12c44dceb6 | ||
|
|
9d1b8fbd3e | ||
|
|
124e0412b2 | ||
|
|
3a46260937 | ||
|
|
7151d5eac2 | ||
|
|
5e28d39f09 | ||
|
|
c7774d3d6c | ||
|
|
a85b84fd56 | ||
|
|
443b3c8b82 | ||
|
|
d69383d78b | ||
|
|
c355a2b61e | ||
|
|
93415ee36c | ||
|
|
0648ecf2d2 | ||
|
|
17022d50d4 | ||
|
|
c4573e46a9 | ||
|
|
fa515604dc | ||
|
|
3b12d70e45 | ||
|
|
efb86f453c | ||
|
|
569c18c9f1 | ||
|
|
91223a8431 | ||
|
|
d95e49b535 | ||
|
|
4cb89b3fc2 | ||
|
|
5e56c66201 | ||
|
|
e6393c105b | ||
|
|
bb16313024 | ||
|
|
a5ce2a5a62 | ||
|
|
3885cbd045 | ||
|
|
00940d66b1 | ||
|
|
cafba71671 | ||
|
|
cb454734b0 | ||
|
|
4f29f998c5 | ||
|
|
c241d48df3 | ||
|
|
2afc268a04 | ||
|
|
94017c1e53 | ||
|
|
cea6b7067a | ||
|
|
89b44f5126 | ||
|
|
3015ffd950 | ||
|
|
8c465d22e0 | ||
|
|
f1951d0d5f | ||
|
|
a84be2ba60 | ||
|
|
4243feaf37 | ||
|
|
e004f96b65 | ||
|
|
a98cbc3a9d | ||
|
|
5877918fe8 | ||
|
|
b45b585edf | ||
|
|
983b2ebe0e | ||
|
|
2a0e92e4e2 | ||
|
|
b351e60d52 | ||
|
|
69e7a581fd | ||
|
|
0a20be85ab | ||
|
|
3f5a54f9f1 | ||
|
|
e2c7941542 | ||
|
|
8433119ac9 | ||
|
|
43589096c3 | ||
|
|
05d14166e4 | ||
|
|
0d0f7724b6 | ||
|
|
d28152566d | ||
|
|
fb805de552 | ||
|
|
5ade906a7b | ||
|
|
8f02cbc234 | ||
|
|
59a2415a0d | ||
|
|
c1b3686190 | ||
|
|
662eeafbb5 | ||
|
|
5ff146bc69 | ||
|
|
9380a243ba | ||
|
|
587291ab86 | ||
|
|
2cd62621df | ||
|
|
3630fc63d7 | ||
|
|
de42d9f310 | ||
|
|
f5ed9f1c33 | ||
|
|
01ec472314 | ||
|
|
9ddee84954 | ||
|
|
dc0715dc2a | ||
|
|
b6b9fad5da | ||
|
|
553922bef6 | ||
|
|
4b08c0b56b | ||
|
|
ba081c7837 | ||
|
|
f4a2741ba0 | ||
|
|
e6b926c87f | ||
|
|
4be1195e5d | ||
|
|
84ef245b56 | ||
|
|
7b39bae673 | ||
|
|
7c505fd02a | ||
|
|
11f7f9a231 | ||
|
|
4f1eedcf7c | ||
|
|
99f85b800c | ||
|
|
2e4f81f63d | ||
|
|
abbaca3c71 | ||
|
|
a9b6f976a2 | ||
|
|
64b2a8d4a5 | ||
|
|
2b550b104f | ||
|
|
564e76956a | ||
|
|
dd734c3c8a | ||
|
|
35e9091863 | ||
|
|
b9e437c6cd | ||
|
|
de5f7f9b05 | ||
|
|
44a9db1c2f | ||
|
|
d7dc4bf496 | ||
|
|
1a15a062ef | ||
|
|
5b02501038 | ||
|
|
c3a98b265f | ||
|
|
b92bcd1789 | ||
|
|
949e504ad5 | ||
|
|
293a8a8199 | ||
|
|
2806c386d3 | ||
|
|
75f3a30d38 | ||
|
|
7cfe74b384 | ||
|
|
38d537bb8a | ||
|
|
b6f927c454 | ||
|
|
57c616abfe | ||
|
|
ad6ca65d4b | ||
|
|
38490195e3 | ||
|
|
6a43b8b159 | ||
|
|
a760acc399 | ||
|
|
cea5668a9f | ||
|
|
d73ab36dc3 | ||
|
|
5c01e0e852 | ||
|
|
5a13850043 | ||
|
|
96fbc968ef | ||
|
|
cf26a5da3d | ||
|
|
3e21758aac | ||
|
|
942799637e | ||
|
|
07dd33f6de | ||
|
|
a924af79c1 | ||
|
|
2422ca0847 | ||
|
|
5b900e7b9c | ||
|
|
8539a297fa | ||
|
|
b6b873f699 | ||
|
|
94ccabd5ce | ||
|
|
ea18fa95ad | ||
|
|
b5f2c8b583 | ||
|
|
90a228619e | ||
|
|
a6b7ba41ee | ||
|
|
bef8c846f8 | ||
|
|
ce2bf5ac53 | ||
|
|
2fec555756 | ||
|
|
2faaad6d3d | ||
|
|
3a4b970c62 | ||
|
|
05491309c2 | ||
|
|
e122217101 | ||
|
|
81eb7de665 | ||
|
|
c9fe2f649a | ||
|
|
6dd13e4939 | ||
|
|
6cc00a5a0f | ||
|
|
5661be3ebd | ||
|
|
59a2c5ce9c | ||
|
|
73a7adea63 | ||
|
|
3896384339 | ||
|
|
3028e70a0f | ||
|
|
64416aef2b | ||
|
|
e0340dadf4 | ||
|
|
83e0cdfa1e | ||
|
|
22ed3c0ca5 | ||
|
|
f95bc17e39 | ||
|
|
64a4451868 | ||
|
|
ead47b2aa2 | ||
|
|
3e9e6c3e73 | ||
|
|
b8e957ff9a | ||
|
|
2aa12631f8 | ||
|
|
7feaa505c2 | ||
|
|
b0e6e31d92 | ||
|
|
068e803bc8 | ||
|
|
a4749d376a | ||
|
|
71992f5b17 | ||
|
|
3897fc5666 | ||
|
|
315b303b4f | ||
|
|
d665c37bc3 | ||
|
|
c5df7d4249 | ||
|
|
c5988e412d | ||
|
|
f2744493b9 | ||
|
|
a6793588c6 | ||
|
|
958198b65a | ||
|
|
5605256c75 | ||
|
|
35c7124617 | ||
|
|
f124cd9c7e | ||
|
|
f9a756d1ff | ||
|
|
0aeecc7a99 | ||
|
|
3646e6ea13 | ||
|
|
d2a60c7287 | ||
|
|
e794604cae | ||
|
|
60fa6071b9 | ||
|
|
cdad6f74cf | ||
|
|
549de55b57 | ||
|
|
686432aa8a | ||
|
|
c2e219b446 | ||
|
|
15cefc664a | ||
|
|
38fc9f00a2 | ||
|
|
2673b9dd03 | ||
|
|
ff6c86b932 | ||
|
|
c247e49c2a | ||
|
|
0c0dddab12 | ||
|
|
1c39b76b83 | ||
|
|
f72dd7fdb6 | ||
|
|
5a5b5292a1 | ||
|
|
d6fce7c099 | ||
|
|
93e2cc367b | ||
|
|
de3ee932b6 | ||
|
|
b051a3981d | ||
|
|
ed3b4088d9 | ||
|
|
2aae667e15 | ||
|
|
a6604172d9 | ||
|
|
e85427f1da | ||
|
|
572a121492 | ||
|
|
f8f7fe4f33 | ||
|
|
b835716e36 | ||
|
|
1476395829 | ||
|
|
8156279025 | ||
|
|
1822f36aba | ||
|
|
7f1a854769 | ||
|
|
0c8e3515fe | ||
|
|
5b5f48014b | ||
|
|
d9e1dce393 | ||
|
|
79fd5dc7b1 | ||
|
|
7183bea412 | ||
|
|
6e2ad28676 | ||
|
|
444b0b30c3 | ||
|
|
cdef2dee5a | ||
|
|
a1036577a2 | ||
|
|
badcccab76 | ||
|
|
9e8facaa6f | ||
|
|
7c0c75ca42 | ||
|
|
e32d619677 | ||
|
|
6f2801cea8 | ||
|
|
76d402fcfa | ||
|
|
a55b0aeb5f | ||
|
|
75e5b1c7cd | ||
|
|
7af2f4a98a | ||
|
|
f50bcb981a | ||
|
|
08bcebfc1c | ||
|
|
ae31ecf706 | ||
|
|
4dac1ae9f8 | ||
|
|
db253cdaf8 | ||
|
|
4b05929dd5 | ||
|
|
7c174b9c05 | ||
|
|
82596b9c3f | ||
|
|
6414fe8cf8 | ||
|
|
8e2b18ea1d | ||
|
|
c57b55ede6 | ||
|
|
72a0341a0e | ||
|
|
98b9503461 | ||
|
|
417310b5c5 | ||
|
|
08d0db87d1 | ||
|
|
18bf1400a7 | ||
|
|
3b3dca4a26 | ||
|
|
82ee5bf1fd | ||
|
|
398666a8b4 | ||
|
|
7d1e60a019 | ||
|
|
d7736f798b | ||
|
|
c20be3dbea | ||
|
|
e52c5d38d3 | ||
|
|
6662cf6245 | ||
|
|
0f78f1b333 | ||
|
|
2efe58209f | ||
|
|
d420fad489 | ||
|
|
49868d8f7c | ||
|
|
dee6dc1e6c | ||
|
|
35054c1f59 | ||
|
|
f507ef5e56 | ||
|
|
57f763b0b6 | ||
|
|
7a3c326442 | ||
|
|
1842c9ed3b | ||
|
|
855f092682 | ||
|
|
cafe267bf0 | ||
|
|
81710ff3b0 | ||
|
|
1c90107571 | ||
|
|
ff0c021162 | ||
|
|
ca916deda9 | ||
|
|
f0f044b766 | ||
|
|
69758b80a5 | ||
|
|
98ed178d7b | ||
|
|
419fc15d77 | ||
|
|
72eb76191f | ||
|
|
7164260f6e | ||
|
|
f5e474f250 | ||
|
|
9a84fc5b47 | ||
|
|
248a689de2 | ||
|
|
4da33b81fd | ||
|
|
657a1aaed5 | ||
|
|
415b7bf4d1 | ||
|
|
d8c1cb2629 | ||
|
|
ea75a56d33 | ||
|
|
8e45c41f20 | ||
|
|
dacd13ee30 | ||
|
|
f49727e0b6 | ||
|
|
1fc67984a2 | ||
|
|
2cc6d2ef11 | ||
|
|
40cc4f32d0 | ||
|
|
9537dd793d | ||
|
|
96a7e4f7ac | ||
|
|
16d1245b64 | ||
|
|
06eac367f2 | ||
|
|
78a6ab89f9 | ||
|
|
f77bacb8a6 | ||
|
|
94387e8698 | ||
|
|
aebdc0c5d6 | ||
|
|
113c39c11c | ||
|
|
078656fb8b | ||
|
|
c4b49ce6cd | ||
|
|
97e98d2725 | ||
|
|
02857d1b7f | ||
|
|
04027b9c32 | ||
|
|
969d71b264 | ||
|
|
174789e2e1 | ||
|
|
eb535acb95 | ||
|
|
5540c8b06f | ||
|
|
8c17d825d9 | ||
|
|
0af6348913 | ||
|
|
0ac6c01d65 | ||
|
|
4c1dfbaddd | ||
|
|
258acfdf5a | ||
|
|
d875dab29b | ||
|
|
1f9b2cd48c | ||
|
|
6ee4a6a5b4 | ||
|
|
4989396abc | ||
|
|
398b7a5a25 | ||
|
|
3e267bc77a | ||
|
|
d84cc370c9 | ||
|
|
7f12288b2c | ||
|
|
20e89f21ff | ||
|
|
bd2cf19ec1 | ||
|
|
de47efdda5 | ||
|
|
95231faa87 | ||
|
|
567b846de1 | ||
|
|
83ce8a2197 | ||
|
|
f170cef506 | ||
|
|
c2d8ed271b | ||
|
|
e38224d758 | ||
|
|
83901e5fbb | ||
|
|
db05cc48e8 | ||
|
|
4632224e9b | ||
|
|
5684c450f4 | ||
|
|
4bcf8215b6 | ||
|
|
36a3b6f479 | ||
|
|
b31215c257 | ||
|
|
1f558590a8 | ||
|
|
ad5e2a3d0e | ||
|
|
b26255e60a | ||
|
|
852689b3df | ||
|
|
197bc54ac6 | ||
|
|
013a58e634 | ||
|
|
4dbe535e1e | ||
|
|
7ac378dcd3 | ||
|
|
965b098d66 | ||
|
|
6379c3210b | ||
|
|
7653d5fec9 | ||
|
|
7e1f7bd7fd | ||
|
|
5581e25a21 | ||
|
|
52e08a2784 | ||
|
|
f6047b8733 | ||
|
|
bea8e647d9 | ||
|
|
1cf8634152 | ||
|
|
141b63587b | ||
|
|
2b91903129 | ||
|
|
32de0ae4a4 | ||
|
|
985a0b9bce | ||
|
|
9860e2bc75 | ||
|
|
db8472a6e5 | ||
|
|
8a22da0acb | ||
|
|
cf1b53831f | ||
|
|
92f64188d5 | ||
|
|
6a0061dde3 | ||
|
|
84fbdba9f5 | ||
|
|
39cac396f5 | ||
|
|
75ed3ce60c | ||
|
|
8373204c94 | ||
|
|
6787af413e | ||
|
|
0199b4e212 | ||
|
|
121be772df | ||
|
|
f3b3e3eded | ||
|
|
02c08c942d | ||
|
|
b2370f5c5f | ||
|
|
6556e1b4a2 | ||
|
|
28acd466b3 | ||
|
|
699921d464 | ||
|
|
5c84fbba9a | ||
|
|
0b02422e7d | ||
|
|
677bff55c2 | ||
|
|
3d03bea582 | ||
|
|
278a77247d | ||
|
|
b83a8dcb5d | ||
|
|
9bce103dad | ||
|
|
dfcc4e1b3a | ||
|
|
66892aea60 | ||
|
|
5c708b43c2 | ||
|
|
e2026aedbc | ||
|
|
3184f8d275 | ||
|
|
8ec78688b8 | ||
|
|
1911fc2e65 | ||
|
|
e0446a73fa | ||
|
|
16b1bfa4d0 | ||
|
|
f015995ac4 | ||
|
|
0016836022 | ||
|
|
c543b7585a | ||
|
|
b90f1fc237 | ||
|
|
f892338098 | ||
|
|
defead108a | ||
|
|
1f8f9aaf81 | ||
|
|
3b32a3164b | ||
|
|
e5cc2ccaab | ||
|
|
2f9b753c5b | ||
|
|
cbcca9cf5b | ||
|
|
b1ac1859be | ||
|
|
cecb65cd40 | ||
|
|
74b076e31f | ||
|
|
e3057b5e46 | ||
|
|
e1e7387c73 | ||
|
|
73705bec23 | ||
|
|
cb9e045c7f | ||
|
|
92a8b5aa4d | ||
|
|
9b7f92188d | ||
|
|
77301e2930 | ||
|
|
babfc9ade3 | ||
|
|
883bbf102a | ||
|
|
e21f83267a | ||
|
|
27f0782465 | ||
|
|
d45b0dee10 | ||
|
|
2c2a29cd91 | ||
|
|
607a297c4a | ||
|
|
e177c5c94c | ||
|
|
7fb3456e83 | ||
|
|
d37bb2c7f9 | ||
|
|
20519e3b81 | ||
|
|
733613ad28 | ||
|
|
604070763d | ||
|
|
93f88800b8 | ||
|
|
9607888fc5 | ||
|
|
1e6936a8c3 | ||
|
|
56c2964e96 | ||
|
|
d5f223fc88 | ||
|
|
cdf2f6b5b4 | ||
|
|
fa3ce8de64 | ||
|
|
59d218d623 | ||
|
|
49fa1b6762 | ||
|
|
a2fe4a0b80 | ||
|
|
86e7a19a98 | ||
|
|
8c86c3dc1b | ||
|
|
2bef7631ae | ||
|
|
550d76a447 | ||
|
|
679b26cde4 | ||
|
|
79c625d737 | ||
|
|
a1d277e771 | ||
|
|
bde0f2f0ba | ||
|
|
53f830bb38 | ||
|
|
a5e3207715 | ||
|
|
b357a085c8 | ||
|
|
9722d808f9 | ||
|
|
0fdc1d0a1f | ||
|
|
f963d28ba8 | ||
|
|
09d1af9c46 | ||
|
|
5d8e894802 | ||
|
|
0ecfbfad53 | ||
|
|
ed35a143ec | ||
|
|
5089729b18 | ||
|
|
b41d2d64cb | ||
|
|
25e882eb78 | ||
|
|
4ef8f3da2b | ||
|
|
b00ce8789f | ||
|
|
b4f81a0c2a | ||
|
|
aa714f7d80 | ||
|
|
ca203435d1 | ||
|
|
ee8893a884 | ||
|
|
bf89238bdf | ||
|
|
360f7cf9c3 | ||
|
|
482ad0e5ee | ||
|
|
cd6ac4f8c2 | ||
|
|
79ac2be617 | ||
|
|
9b4b7cf5d4 | ||
|
|
9b970ae1a4 | ||
|
|
fec7912870 | ||
|
|
8bb855e657 | ||
|
|
9488864f47 | ||
|
|
beefc6a86e | ||
|
|
cc99abcd14 | ||
|
|
f8bcf52741 | ||
|
|
1a10366ab7 | ||
|
|
925b6694ac | ||
|
|
1ad16ade86 | ||
|
|
45e3f02832 | ||
|
|
ba1a681aab | ||
|
|
23bba969dd | ||
|
|
9c743acd2d | ||
|
|
62da7c7be4 | ||
|
|
07310c7714 | ||
|
|
ee93f7e018 | ||
|
|
21fae1f457 | ||
|
|
653a84d3a9 | ||
|
|
8132bbac2e | ||
|
|
197286c21e | ||
|
|
bf48729354 | ||
|
|
a504a75166 | ||
|
|
44ac22c0de | ||
|
|
df1c6b9b0b | ||
|
|
7ce45d2b11 | ||
|
|
bde0e0b86a | ||
|
|
c1232a7001 | ||
|
|
12c4dbf0e5 | ||
|
|
31a01ab227 | ||
|
|
5dc60b9f35 | ||
|
|
588f134de8 | ||
|
|
2ae867a7e0 | ||
|
|
c77b029ee2 | ||
|
|
d0648d1754 | ||
|
|
1e3486af94 | ||
|
|
8f2b2aba12 | ||
|
|
0b1232b65d | ||
|
|
969abe015c | ||
|
|
f39144cc51 | ||
|
|
725df15012 | ||
|
|
9e296cdb46 | ||
|
|
b07627611f | ||
|
|
6cad4bc986 | ||
|
|
504c08a0fc | ||
|
|
592f1cafdb | ||
|
|
71d8c2080c | ||
|
|
6095933847 | ||
|
|
92febf0b00 | ||
|
|
1c711aef3c | ||
|
|
0bec780a1b | ||
|
|
ed01a46a3f | ||
|
|
4f8fa9f9eb | ||
|
|
2f99ccdd4a | ||
|
|
2dd1013075 | ||
|
|
6552aeaa3b | ||
|
|
b92b93e233 | ||
|
|
10036b148c | ||
|
|
cccec8382f | ||
|
|
5e30721e01 | ||
|
|
d03690cffd | ||
|
|
dad732b7e6 | ||
|
|
d74b5c8764 | ||
|
|
0f19010e52 | ||
|
|
ac6ee28c5f | ||
|
|
c509c02546 | ||
|
|
1258c44bad | ||
|
|
fe65e7a0c4 | ||
|
|
76727d09bf | ||
|
|
2a49b3899a | ||
|
|
49b85d150c | ||
|
|
b54241a5b2 | ||
|
|
78a2086535 | ||
|
|
24cc5dbaa0 | ||
|
|
0093838a75 | ||
|
|
dde658a514 | ||
|
|
13996740e0 | ||
|
|
e4b017b304 | ||
|
|
a2a683d31e | ||
|
|
5040f09f0c | ||
|
|
19911d9f1f | ||
|
|
04b0f8b2a4 | ||
|
|
e453dceacd | ||
|
|
42a938b50b | ||
|
|
4cf3cff74d | ||
|
|
3ffd007cc0 | ||
|
|
28b098cfb7 | ||
|
|
fd59088528 | ||
|
|
05bd32f750 | ||
|
|
e80147d24e | ||
|
|
72e1a19ea5 | ||
|
|
b14d6c9216 | ||
|
|
c894d72b52 | ||
|
|
220dbd7e30 | ||
|
|
84d6fc2787 | ||
|
|
f6d0738c79 | ||
|
|
52615c6f52 | ||
|
|
34342599b9 | ||
|
|
42edb20b07 | ||
|
|
a14784cfd4 | ||
|
|
32440567ad | ||
|
|
25f1dc325d | ||
|
|
38feeee464 | ||
|
|
b2701ad911 | ||
|
|
d41962f9d1 | ||
|
|
ec5d01545a | ||
|
|
03ddadc1ed | ||
|
|
3e55b61ac0 | ||
|
|
5a7f022e40 | ||
|
|
f651e10684 | ||
|
|
b753f920e1 | ||
|
|
415a0cdf28 | ||
|
|
9708961654 | ||
|
|
47bcb117b4 | ||
|
|
3eb38e558e | ||
|
|
a321eb8737 | ||
|
|
62c65659cc | ||
|
|
249addebff | ||
|
|
860087d291 | ||
|
|
c63e8d32c9 | ||
|
|
91e4603917 | ||
|
|
276278db41 | ||
|
|
b58d4e306a | ||
|
|
21a57a0c58 | ||
|
|
06b1e43492 | ||
|
|
2c1ffde3ed | ||
|
|
918ebc62a2 | ||
|
|
465de438ce | ||
|
|
6ee848b279 | ||
|
|
db5f1622bd | ||
|
|
5e2f681761 | ||
|
|
ad506d78ba | ||
|
|
48b89609e2 | ||
|
|
0fd0a8b7cc | ||
|
|
2e922019d7 | ||
|
|
303d1fef6b | ||
|
|
619ed234a9 | ||
|
|
fd8fc679be | ||
|
|
5a3c852b32 | ||
|
|
4c7de77bfb | ||
|
|
b08c1eeaa9 | ||
|
|
7e91121a33 | ||
|
|
cb78e10a76 | ||
|
|
9d031c1600 | ||
|
|
7efe6f1d53 | ||
|
|
bf33c82b19 | ||
|
|
2330454838 | ||
|
|
0d0aa49eb9 | ||
|
|
c279f405cf | ||
|
|
725eee726d | ||
|
|
4c2a09369d | ||
|
|
e6e1aab098 | ||
|
|
511f71c369 | ||
|
|
3dfccea522 | ||
|
|
ced0faf916 | ||
|
|
d284ecdab4 | ||
|
|
be77bf94aa | ||
|
|
2c87c00906 | ||
|
|
0ff2e212d5 | ||
|
|
92e4b5cc16 | ||
|
|
4e3228628a | ||
|
|
dde03eca7c | ||
|
|
107595fcb2 | ||
|
|
32fb634a4d | ||
|
|
51fbcc736e | ||
|
|
360a22c537 | ||
|
|
63cb5ab883 | ||
|
|
151a937c10 | ||
|
|
4c88c9b029 | ||
|
|
24664cc859 | ||
|
|
a187456ac3 | ||
|
|
9e4752b114 | ||
|
|
de64b33bb8 | ||
|
|
e66b64650d | ||
|
|
5139bc326a | ||
|
|
826858c170 | ||
|
|
f2400ee089 | ||
|
|
6e3587dd43 | ||
|
|
7a61db9a70 | ||
|
|
da798e7a5a | ||
|
|
f385e46927 | ||
|
|
c31262b97e | ||
|
|
2e9acc1fa8 | ||
|
|
0f9da7f519 | ||
|
|
971e1cdbec | ||
|
|
9fad2d68af | ||
|
|
51180adeb4 | ||
|
|
8ded683796 | ||
|
|
31c4ab8ac0 | ||
|
|
4f9d31e832 | ||
|
|
22e13e8c40 | ||
|
|
bec52b81fd | ||
|
|
7fc168532c | ||
|
|
69b55bcbd3 | ||
|
|
c6e839271a | ||
|
|
f3a1e09042 | ||
|
|
b157ec1b28 | ||
|
|
695be89656 | ||
|
|
3f3deb8e2a | ||
|
|
06b9d68eb7 | ||
|
|
bcc9379ebc | ||
|
|
9855e2edee | ||
|
|
e60e574902 | ||
|
|
c22ab4afdf | ||
|
|
b123d95b71 | ||
|
|
1760af50c8 | ||
|
|
73e33d7ba9 | ||
|
|
201c26f7c8 | ||
|
|
1fd31d83bf | ||
|
|
7d5c827dec | ||
|
|
ce89ff3c85 | ||
|
|
e60797cd0f | ||
|
|
49c5c5bbde | ||
|
|
78f243651e | ||
|
|
776a4d657d | ||
|
|
8f0b962507 | ||
|
|
8dc8431c0e | ||
|
|
5aa15ef731 | ||
|
|
1519843f6f | ||
|
|
37a4eefc46 | ||
|
|
1efcb2f80b | ||
|
|
0acb4f5aed | ||
|
|
4f38a953ac | ||
|
|
f05767afe8 | ||
|
|
ddbf23df68 | ||
|
|
6c4ab3b7f4 | ||
|
|
4d902c01a6 | ||
|
|
d1a5ba2b8e | ||
|
|
982cac3472 | ||
|
|
431f22283d | ||
|
|
7e61b1ecad | ||
|
|
a2d685815f | ||
|
|
014c2c5249 | ||
|
|
add63d2dde | ||
|
|
81bed3d3d5 | ||
|
|
f22a30ca87 | ||
|
|
946e74a918 | ||
|
|
3cd3cf9830 | ||
|
|
bc634c5f8f | ||
|
|
7357e40d3f | ||
|
|
92bde25a49 | ||
|
|
e714cb9e8b | ||
|
|
fed81c8e22 | ||
|
|
3a65d5ce23 | ||
|
|
6d482cd934 | ||
|
|
02511b7785 | ||
|
|
b3fdc4bb96 | ||
|
|
c90dd0e818 | ||
|
|
0e2d93c630 | ||
|
|
de328c9dfd | ||
|
|
f4a2f67db3 | ||
|
|
601d6f37af | ||
|
|
a004ef65af | ||
|
|
8997c27819 | ||
|
|
2aeceb7ea8 | ||
|
|
627e99859d | ||
|
|
6ebca7fa7c | ||
|
|
3d55ad783e | ||
|
|
05f66f9bea | ||
|
|
434ba82705 | ||
|
|
cbe6d19c79 | ||
|
|
b47e7f068c | ||
|
|
20a59a2c58 | ||
|
|
57845a2739 | ||
|
|
9a8ab29330 | ||
|
|
406cc71f96 | ||
|
|
132d0631d2 | ||
|
|
3095ade94c | ||
|
|
221df3d26d | ||
|
|
40db3a5d7d | ||
|
|
ee1a1fd614 | ||
|
|
8e8be502fd | ||
|
|
ae4413d0aa | ||
|
|
51b791f9c0 | ||
|
|
767c3c942b | ||
|
|
3fcace6660 | ||
|
|
4c600f5748 | ||
|
|
d84342733d | ||
|
|
d6f0f9ec0e | ||
|
|
fbc922fe97 | ||
|
|
4be84e035f | ||
|
|
254474d12d | ||
|
|
5615987ea2 | ||
|
|
3a93246f08 | ||
|
|
633784fae2 | ||
|
|
af127468a6 | ||
|
|
f892c1284b | ||
|
|
d762b5a017 | ||
|
|
28d7835327 | ||
|
|
03438f9192 | ||
|
|
09c7955149 | ||
|
|
9a2a88a703 | ||
|
|
820ae7d6e3 | ||
|
|
9c69f22f79 | ||
|
|
85ad6b12ba | ||
|
|
79706b4a1a | ||
|
|
72180d4248 | ||
|
|
8446c9563d | ||
|
|
4df1d2093f | ||
|
|
9d98d26cc7 | ||
|
|
0c762e610f | ||
|
|
62a019cc5d | ||
|
|
36c78e9686 | ||
|
|
dcb9e34d59 | ||
|
|
cb13cfdda7 | ||
|
|
0082f56b58 | ||
|
|
b490a72c1d | ||
|
|
3c0b479669 | ||
|
|
c9ad09226b | ||
|
|
4e771ecfb7 | ||
|
|
be86cd4028 | ||
|
|
3ddbe92f37 | ||
|
|
ca67ea9b4c | ||
|
|
9f78af29bf | ||
|
|
6821a05f76 | ||
|
|
e328c5d505 | ||
|
|
f814d26a4a | ||
|
|
3fc06e6f4f | ||
|
|
d876c267d6 | ||
|
|
1268a463ac | ||
|
|
e64d75a297 | ||
|
|
1960262435 | ||
|
|
c227062a37 | ||
|
|
e9376af13c | ||
|
|
8edebb9f75 | ||
|
|
8abe31341d | ||
|
|
7900edc96c | ||
|
|
c1eca93609 | ||
|
|
cd953bc7b9 | ||
|
|
692421ee13 | ||
|
|
1e89054897 | ||
|
|
ae1112ae11 | ||
|
|
205b505242 | ||
|
|
f77cd9bd52 | ||
|
|
11948c1cce | ||
|
|
d7e6f97d9c | ||
|
|
e324856301 | ||
|
|
8fb873b085 | ||
|
|
c17eb5fce5 | ||
|
|
91e9bdfc31 | ||
|
|
c83edc1689 | ||
|
|
dcbd4f3356 | ||
|
|
3929043eec | ||
|
|
23712ce590 | ||
|
|
adb2582856 | ||
|
|
3e292d7604 | ||
|
|
b565d1ab76 | ||
|
|
2debabe664 | ||
|
|
e1fc11218f | ||
|
|
ed59d6acf5 | ||
|
|
800984489d | ||
|
|
997ea3a2f5 | ||
|
|
b9b60a1346 | ||
|
|
e8edbd5394 | ||
|
|
f3e25ae3e6 | ||
|
|
93c952b344 | ||
|
|
d818a15aea | ||
|
|
6a664d976f | ||
|
|
5b7a71fb08 | ||
|
|
b29d83968b | ||
|
|
3e14c8e80d | ||
|
|
62bbe39bb4 | ||
|
|
4305ec34d0 | ||
|
|
a9518c2e55 | ||
|
|
c4fc67301c | ||
|
|
c92db272e0 | ||
|
|
46274acb3e | ||
|
|
8a676c573a | ||
|
|
39cbc59c12 | ||
|
|
96aa6ae3ef | ||
|
|
94d07833c5 | ||
|
|
1d3acbe40b | ||
|
|
389590e45d | ||
|
|
ea3cb026c7 | ||
|
|
1efe5bff9f | ||
|
|
d2ca74ecdf | ||
|
|
df4fa549ef | ||
|
|
cc7a706f52 | ||
|
|
d4256dad30 | ||
|
|
d9320b7c05 | ||
|
|
27c9a4a6a9 | ||
|
|
18d4dc7321 | ||
|
|
6f241ef001 | ||
|
|
296be2fbd5 | ||
|
|
c1957272ea | ||
|
|
e6afd33621 | ||
|
|
b767773742 | ||
|
|
52ead7ad1b | ||
|
|
b8e083f8fc | ||
|
|
6e3f8bdefd | ||
|
|
8e55f2bf58 | ||
|
|
cd9208b541 | ||
|
|
67e53906f0 | ||
|
|
cde7f2ab1c | ||
|
|
1cd9c57f87 | ||
|
|
c625ad32c5 | ||
|
|
15eca63ff0 | ||
|
|
d149df2a6e | ||
|
|
30fdcf4efb | ||
|
|
ea54abdfde | ||
|
|
2757dc7205 | ||
|
|
e35ad892eb | ||
|
|
140e2a026e | ||
|
|
c89ab4e47c | ||
|
|
ab05e34805 | ||
|
|
4a201c1890 | ||
|
|
cb3e863957 | ||
|
|
8e20e54b53 | ||
|
|
3cf4b4ed8b | ||
|
|
10241a37c2 | ||
|
|
0eb3a5cab3 | ||
|
|
4945767bd8 | ||
|
|
217760148c | ||
|
|
210e219778 | ||
|
|
50896ee23b | ||
|
|
41432b4165 | ||
|
|
d41b8e7441 | ||
|
|
aed17bde9b | ||
|
|
5b430fc376 | ||
|
|
e1064275a0 | ||
|
|
6f8d252dc6 | ||
|
|
b89e296390 | ||
|
|
99b5e3565d | ||
|
|
6ec33db50e | ||
|
|
aa4922840b | ||
|
|
28239c4a51 | ||
|
|
8ee8f2c085 | ||
|
|
a3ba2276e2 | ||
|
|
aefc90dc19 | ||
|
|
511c0dd17c | ||
|
|
e1b211ed8e | ||
|
|
08f409993a | ||
|
|
2e90cda34c | ||
|
|
b97d674108 | ||
|
|
f8cbe053cc | ||
|
|
0e241a0fc5 | ||
|
|
31916384c1 | ||
|
|
e6f17834a0 | ||
|
|
e1f2bc0a19 | ||
|
|
12d3ca2d50 | ||
|
|
aa08125e43 | ||
|
|
9ce94a8398 | ||
|
|
34a3535abe | ||
|
|
ac79803f1b | ||
|
|
006ec1abb8 | ||
|
|
b2a47e6216 | ||
|
|
85638c23ae | ||
|
|
44c1c93e81 | ||
|
|
06c9ff49a0 | ||
|
|
bbe72f52ba | ||
|
|
5793b85c5b | ||
|
|
eccc3717bc | ||
|
|
a89b2ca450 | ||
|
|
41e5d2524b | ||
|
|
de55be515d | ||
|
|
6a0c6047e6 | ||
|
|
0db8898577 | ||
|
|
a38695ff8a | ||
|
|
5ab45a1185 | ||
|
|
805d892dbb | ||
|
|
d5348cec70 | ||
|
|
167ef06209 | ||
|
|
d64a7cb739 | ||
|
|
b2584bb01b | ||
|
|
8b8cb12763 | ||
|
|
127e28a6f4 | ||
|
|
73c46f2a85 | ||
|
|
36e1fcc24a | ||
|
|
ed0e637207 | ||
|
|
6b8a55f55b | ||
|
|
509049d95a | ||
|
|
83280de352 | ||
|
|
a4e4c8baaa | ||
|
|
00d27bc313 | ||
|
|
78ce12bc60 | ||
|
|
7e8d7ef0c0 | ||
|
|
d1c01f476d | ||
|
|
bb3c38a3b1 | ||
|
|
8ca6e8c478 | ||
|
|
96660ebd2a | ||
|
|
9e69d01db7 | ||
|
|
1c015e31f1 | ||
|
|
bf12b127ac | ||
|
|
dd733092a1 | ||
|
|
30fd5fcf14 | ||
|
|
483940a98d | ||
|
|
615bc17cec | ||
|
|
94cf350e5c | ||
|
|
fa594e732f | ||
|
|
4c0c9eb7fb | ||
|
|
e9cd95fc6a | ||
|
|
b68675d9fd | ||
|
|
d4abfffa2f | ||
|
|
2d6d664f77 | ||
|
|
c1f08cf2ea | ||
|
|
f4d762c19b | ||
|
|
1ed7d34200 | ||
|
|
4f5d805725 | ||
|
|
bde8dbba05 | ||
|
|
f6b5404a04 | ||
|
|
ce9f2157e8 | ||
|
|
64cd9c0dd2 | ||
|
|
ab4cc74aca | ||
|
|
8cdb5fe346 | ||
|
|
aae7987df0 | ||
|
|
1817105c94 | ||
|
|
88ca98c5a6 | ||
|
|
8717cd077c | ||
|
|
9658af4aa9 | ||
|
|
d40a79576b | ||
|
|
481bd4ac68 | ||
|
|
6625a2afd3 | ||
|
|
cc23495591 | ||
|
|
acd42f9cc6 | ||
|
|
a2e439a155 | ||
|
|
d0fac80eb4 | ||
|
|
3f90611edf | ||
|
|
d8a9630548 | ||
|
|
fbb5d4a4a6 | ||
|
|
e5753c54a6 | ||
|
|
9ab9ea4c2e | ||
|
|
2301478b3f | ||
|
|
df9b09eeae | ||
|
|
7e7b2797d7 | ||
|
|
287f1ae042 | ||
|
|
4bc665c0d2 | ||
|
|
5390d0668b | ||
|
|
f55724bf58 | ||
|
|
4300b3a9e0 | ||
|
|
c085b263a7 | ||
|
|
3877014f83 | ||
|
|
83b1613002 | ||
|
|
329f7a2e00 | ||
|
|
0e0785db7b | ||
|
|
9638a4a4e6 | ||
|
|
91be43169c | ||
|
|
01af7e36cd | ||
|
|
d30ca2345e | ||
|
|
26be6ae7c5 | ||
|
|
31c0fc5742 | ||
|
|
1a7f8d5319 | ||
|
|
14e4a052bb | ||
|
|
ae3d8860be | ||
|
|
2eede422a4 | ||
|
|
24debbf349 | ||
|
|
81e252d564 | ||
|
|
1ca9389110 | ||
|
|
10fb76377c | ||
|
|
38029efe50 | ||
|
|
4a6242b3a0 | ||
|
|
b540cc8ac4 | ||
|
|
5fb0402216 | ||
|
|
bc202ecc98 | ||
|
|
9d3f0d45d5 | ||
|
|
f51c391e84 | ||
|
|
909fbaab95 | ||
|
|
67655d15cc | ||
|
|
83b4a3da30 | ||
|
|
768a195c10 | ||
|
|
16e8cfdf31 | ||
|
|
c0c55a7af8 | ||
|
|
e625dc63b4 | ||
|
|
dedac39d99 | ||
|
|
fe6d7d16c8 | ||
|
|
de8e248f29 | ||
|
|
7217ef5ec5 | ||
|
|
6a33173384 | ||
|
|
b520b26bd0 | ||
|
|
1761f63acd | ||
|
|
e58b09c1ea | ||
|
|
7c7e2c4f3d | ||
|
|
20abcaa011 | ||
|
|
297e6543de | ||
|
|
ec54f9a549 | ||
|
|
c064ca3ca9 | ||
|
|
56bd31fe22 | ||
|
|
ac8e042333 | ||
|
|
718b189f19 | ||
|
|
1fa9543e47 | ||
|
|
563209d080 | ||
|
|
ca71c700c7 | ||
|
|
585e2627bf | ||
|
|
579bbe2b86 | ||
|
|
5138644dc8 | ||
|
|
2310d36604 | ||
|
|
7d9e848edb | ||
|
|
a3770a8947 | ||
|
|
06d4a82706 | ||
|
|
c0095dc385 | ||
|
|
07060a8584 | ||
|
|
784e54f217 | ||
|
|
104156d084 | ||
|
|
48180b7ee8 | ||
|
|
ef34a63f7a | ||
|
|
45483809c5 | ||
|
|
9d89c1d692 | ||
|
|
cb4fde9a0b | ||
|
|
8f17a49a24 | ||
|
|
e18e923ac6 | ||
|
|
ed3b939477 | ||
|
|
977d21c929 | ||
|
|
89f0cdffc7 | ||
|
|
9685dca4de | ||
|
|
010218b5ce | ||
|
|
52252453d9 | ||
|
|
057108882f | ||
|
|
90b3cfcf9f | ||
|
|
4231d7b50a | ||
|
|
b85632cc99 | ||
|
|
1b81570338 | ||
|
|
0e03b951d4 | ||
|
|
6d05600eaf | ||
|
|
807422c377 | ||
|
|
768cef57c7 | ||
|
|
bcf1d32cdd | ||
|
|
def67eca3b | ||
|
|
388a8b6346 | ||
|
|
7ab937cf7b | ||
|
|
4bb460528f | ||
|
|
1ab636a4f1 | ||
|
|
a6e82475a3 | ||
|
|
9de8b16aeb | ||
|
|
0baf7744bc | ||
|
|
580c2b9e84 | ||
|
|
84673f26f3 | ||
|
|
ab1efb0749 | ||
|
|
4b0532b072 | ||
|
|
d458500113 | ||
|
|
d9fe2e0974 | ||
|
|
3fddb77564 | ||
|
|
3dd7a82dcc | ||
|
|
3dac6fd1c3 | ||
|
|
7fe01f0764 | ||
|
|
d7da96b387 | ||
|
|
3f95584dac | ||
|
|
de5578c8f7 | ||
|
|
1d410fdb7d | ||
|
|
54545d0bfc | ||
|
|
01131b2296 | ||
|
|
9b2239d4fa | ||
|
|
1b55201fbd | ||
|
|
be43c2156f | ||
|
|
c393db9c9f | ||
|
|
4a749ce00d | ||
|
|
13e6c5eefc | ||
|
|
343b904607 | ||
|
|
553a6e8ff6 | ||
|
|
9423b8da57 | ||
|
|
a7470345ff | ||
|
|
2aca12a49c | ||
|
|
810ee422a1 | ||
|
|
1c10ee106e | ||
|
|
e251c59da1 | ||
|
|
df35844bb2 | ||
|
|
d8006087a2 | ||
|
|
1fa91cbb6f | ||
|
|
3aacfdca20 | ||
|
|
b886422416 | ||
|
|
a29ea0374c | ||
|
|
e6a09e7cf7 | ||
|
|
83282ebcb8 | ||
|
|
d3169b10f8 | ||
|
|
197c22c7fe | ||
|
|
cfe923b8c4 | ||
|
|
742048f24e | ||
|
|
36111aa001 | ||
|
|
8a0f80181e | ||
|
|
fd4fec5340 | ||
|
|
808523b814 | ||
|
|
5640b2157f | ||
|
|
f3d79d906e | ||
|
|
5198f70ebf | ||
|
|
de12208d4a | ||
|
|
e20247d055 | ||
|
|
0862326a79 | ||
|
|
16531653ab | ||
|
|
2f3a2d495a | ||
|
|
baa9837702 | ||
|
|
cfa7d9820b | ||
|
|
3554d9fda2 | ||
|
|
cb2eebef40 | ||
|
|
f4d0cc4dd1 | ||
|
|
d31347c0e0 | ||
|
|
911a43337b | ||
|
|
f62f15cea7 | ||
|
|
dcd27a5f7a | ||
|
|
bf4c4561ce | ||
|
|
cc6c18b5ad | ||
|
|
6b536ced92 | ||
|
|
60ca0cbae3 | ||
|
|
b16abfba9c | ||
|
|
0a34143388 | ||
|
|
1e79f202f4 | ||
|
|
90f7b5259b | ||
|
|
2d143abda6 | ||
|
|
128671f5e9 | ||
|
|
6945eb548f | ||
|
|
ca3cd36887 | ||
|
|
31da08d186 | ||
|
|
1c90b09e2d | ||
|
|
18056139fd | ||
|
|
0898632ba4 | ||
|
|
f79a493083 | ||
|
|
2b159e24a7 | ||
|
|
d8032836bf | ||
|
|
b881f3c1c8 | ||
|
|
6f42bcfa4f | ||
|
|
ade6c46cca | ||
|
|
c6d0bf8d98 | ||
|
|
c41035058a | ||
|
|
e66f7a206e | ||
|
|
cec3d986a7 | ||
|
|
c6e65b4e24 | ||
|
|
ccb7e5270c | ||
|
|
ff29b6e84f | ||
|
|
6ed9e09451 | ||
|
|
75ce6d42d0 | ||
|
|
3bb0b93c79 | ||
|
|
87834b74ef | ||
|
|
6ef434f26d | ||
|
|
15b4152dce | ||
|
|
4aa19d700d | ||
|
|
3edf667958 | ||
|
|
c9b3b6c1b8 | ||
|
|
6e3bc5e65d | ||
|
|
886e35477e | ||
|
|
2f7fbea567 | ||
|
|
b7ecbd3b51 | ||
|
|
92b636ab75 | ||
|
|
28c57f75e8 | ||
|
|
cb1305c87f | ||
|
|
392bfcca2d | ||
|
|
2f95b8f6b2 | ||
|
|
96330b6f03 | ||
|
|
b509ae78b7 | ||
|
|
3a8a16bf48 | ||
|
|
8d2cab7b12 | ||
|
|
9034d6194a | ||
|
|
f8e400deb9 | ||
|
|
13290efac1 | ||
|
|
1df4da210f | ||
|
|
d0c426a7f9 | ||
|
|
17e5bb8d53 | ||
|
|
019cd51333 | ||
|
|
d62458b07b | ||
|
|
2e01153363 | ||
|
|
50ef826114 | ||
|
|
ddb28a9b90 | ||
|
|
0656ddd50a | ||
|
|
afdbf0adbf | ||
|
|
a5f5098beb | ||
|
|
e5c98e61c8 | ||
|
|
2793c8dd03 | ||
|
|
e4e226b2c7 | ||
|
|
46f98ded10 | ||
|
|
86b2391543 | ||
|
|
00ea4f8701 | ||
|
|
f7c9a12510 | ||
|
|
b6a7e049e6 | ||
|
|
45b3863353 | ||
|
|
c2764fda45 | ||
|
|
d358a9d9fd | ||
|
|
1a08ba0b57 | ||
|
|
974efc55ac | ||
|
|
dc46277d0c | ||
|
|
052048ad4c | ||
|
|
c361d8d16b | ||
|
|
045fd20d8c | ||
|
|
fdfd684e7a | ||
|
|
0a2592893d | ||
|
|
4c6c310e0a | ||
|
|
a5aa305773 | ||
|
|
196cf1cd18 | ||
|
|
0cf654aa88 | ||
|
|
2cf20f4b6c | ||
|
|
6b0ba94288 | ||
|
|
870ad008bf | ||
|
|
767aaa80a0 | ||
|
|
5eadaa08aa | ||
|
|
5cdc3e694f | ||
|
|
e96382fdd9 | ||
|
|
a486319cc2 | ||
|
|
1432866798 | ||
|
|
4a375b6563 | ||
|
|
743658032a | ||
|
|
e2f8f5095f | ||
|
|
a22ca5b57f | ||
|
|
b43c6c00bb | ||
|
|
c56e4557f9 | ||
|
|
6b640ea55e | ||
|
|
70f8a771a9 | ||
|
|
4b4aec5bbd | ||
|
|
00198d5e49 | ||
|
|
8a19d25396 | ||
|
|
8533f6edf1 | ||
|
|
bc9693d6f6 | ||
|
|
43a03d85a8 | ||
|
|
f0d63bed58 | ||
|
|
0a3978ab8c | ||
|
|
1c09b8baef | ||
|
|
547b610454 | ||
|
|
9d39bed852 | ||
|
|
70ff7cf74c | ||
|
|
8908fb07a0 | ||
|
|
f2c4ac061c | ||
|
|
b2871d8fc5 | ||
|
|
f4c6e5a6fa | ||
|
|
67d838b5fc | ||
|
|
f15a354c29 | ||
|
|
281e03055d | ||
|
|
216e9c0125 | ||
|
|
2c14f8b43b | ||
|
|
89a77feea7 | ||
|
|
5ca880c8fd | ||
|
|
17671493bf | ||
|
|
0d687eb348 | ||
|
|
1e01f94540 | ||
|
|
335ef67971 | ||
|
|
429d0c8df8 | ||
|
|
72b41f4322 | ||
|
|
fb5938280e | ||
|
|
2d72c58ae7 | ||
|
|
ad99e8edce | ||
|
|
d463f5a032 | ||
|
|
1415f74fe5 | ||
|
|
8de84f03a0 | ||
|
|
fe85ce5885 | ||
|
|
9dc7142e4a | ||
|
|
34a8d0b99b | ||
|
|
176e2726e9 | ||
|
|
2e4a1680b9 | ||
|
|
1eddae9da6 | ||
|
|
f217dbac51 | ||
|
|
eb74414b16 | ||
|
|
ee542f0fec | ||
|
|
0c0ec29821 | ||
|
|
955ce1dd2d | ||
|
|
f32f37cfbb | ||
|
|
8684788f1f | ||
|
|
9e033d1673 | ||
|
|
69c00d272b | ||
|
|
19617e9dae | ||
|
|
f8cc54d4f2 | ||
|
|
8764aa9829 | ||
|
|
fb68f6eb60 | ||
|
|
d09c42366a | ||
|
|
0298fa602a | ||
|
|
30cbcbb3c4 | ||
|
|
1127d323d3 | ||
|
|
01e812aebf | ||
|
|
e690bae7d1 | ||
|
|
58c2c84120 | ||
|
|
a96947c7e7 | ||
|
|
45b40d903c | ||
|
|
b19033aa4f | ||
|
|
adac0f3e51 | ||
|
|
3441482e8c | ||
|
|
781845905c | ||
|
|
b3c9b58350 | ||
|
|
337a2cf319 | ||
|
|
06fa04a448 | ||
|
|
93e86b141d | ||
|
|
fc56027929 | ||
|
|
d2287328ad | ||
|
|
b91834b813 | ||
|
|
8faf991bcb | ||
|
|
84ac30b8d2 | ||
|
|
0f17aebc52 | ||
|
|
2bff13d9e1 | ||
|
|
7683db70cd | ||
|
|
94ba2ad24a | ||
|
|
e42a22d1f2 | ||
|
|
11b6946e00 | ||
|
|
ba8a675eaa | ||
|
|
10f8941258 | ||
|
|
0816fdf318 | ||
|
|
bcf43640fa | ||
|
|
1de68051e3 | ||
|
|
0c9015bb77 | ||
|
|
a8c200f25a | ||
|
|
59fbb2acb1 | ||
|
|
3b53527e9e | ||
|
|
3c53c2c56c | ||
|
|
13a51b6bd3 | ||
|
|
c8d81518cc | ||
|
|
390d49d599 | ||
|
|
3604e6fa7d | ||
|
|
206532f195 | ||
|
|
c9f38fef45 | ||
|
|
b55c05095a | ||
|
|
8f073c5b6f | ||
|
|
f45ca180e9 | ||
|
|
1eb549b137 | ||
|
|
3a9bfc84cd | ||
|
|
c9a8a2af07 | ||
|
|
f5069aef6e | ||
|
|
eb1af1e27e | ||
|
|
d84ac0df9c | ||
|
|
04275cd702 | ||
|
|
746bc7d7bd | ||
|
|
15c5e9833a | ||
|
|
b589a1a13e | ||
|
|
5102770ad5 | ||
|
|
47f396cfce | ||
|
|
759d0a825b | ||
|
|
a8869c46b8 | ||
|
|
4b31f40026 | ||
|
|
4f8dee8fcf | ||
|
|
cf5ab0ddef | ||
|
|
91e9d7431a | ||
|
|
6e13440f1f | ||
|
|
3efeb4a0a6 | ||
|
|
764a372e9f | ||
|
|
340087076e | ||
|
|
ec5716c436 | ||
|
|
3f3a34f788 | ||
|
|
e7879384b1 | ||
|
|
853ee4bef1 | ||
|
|
9be90dd035 | ||
|
|
4c7acca85a | ||
|
|
d235bf9822 | ||
|
|
688d37fe76 | ||
|
|
6c5f606682 | ||
|
|
ce5092036a | ||
|
|
b745626a9f | ||
|
|
c9d73bf1a4 | ||
|
|
6e76b7a7dd | ||
|
|
fd41f0fe0d | ||
|
|
d2e81d14d9 | ||
|
|
7d674b44d3 | ||
|
|
7d3617c27f | ||
|
|
cf6fca8e76 | ||
|
|
1560a823c3 | ||
|
|
aba41d41ac | ||
|
|
245cffc4f7 | ||
|
|
3aada68eb9 | ||
|
|
d15611fd44 | ||
|
|
82d4b866c0 | ||
|
|
4645dd0011 | ||
|
|
bec81ddbfe | ||
|
|
6e4279e30f | ||
|
|
e1131dcf3d | ||
|
|
762de84f34 | ||
|
|
e480cdbf9b | ||
|
|
95cdc89795 | ||
|
|
e7f5491239 | ||
|
|
ba78637361 | ||
|
|
b3119749d9 | ||
|
|
cb56b98222 | ||
|
|
2256183422 | ||
|
|
0bfa8219ca | ||
|
|
4c21a68139 | ||
|
|
38cf74d83b | ||
|
|
1867e56739 | ||
|
|
826a69c531 | ||
|
|
7056be0870 | ||
|
|
708dba6cb1 | ||
|
|
164a34a340 | ||
|
|
3593a918b7 | ||
|
|
7d2ac2f55d | ||
|
|
cc4b343cf4 | ||
|
|
597931f79b | ||
|
|
299864a9cf | ||
|
|
014757a0f7 | ||
|
|
032b5b8776 | ||
|
|
44107f9821 | ||
|
|
b49e45827f | ||
|
|
3cd405e9ea | ||
|
|
b17a54a2d2 | ||
|
|
2d6d4d2db0 | ||
|
|
646b7a3118 | ||
|
|
e4c7842f34 | ||
|
|
7490cb81b8 | ||
|
|
9e105a362f | ||
|
|
9c8cbdd0e6 | ||
|
|
635a8a24f2 | ||
|
|
6354d4b911 | ||
|
|
452e8ed8c5 | ||
|
|
8a93e3c64c | ||
|
|
76fc9b78fe | ||
|
|
cf685b404d | ||
|
|
747d97ecfc | ||
|
|
be5fd86aa7 | ||
|
|
963f57868d | ||
|
|
97f0516630 | ||
|
|
c896b445bd | ||
|
|
f06c4f4049 | ||
|
|
937ce34c36 | ||
|
|
cddfd1b319 | ||
|
|
c42892ee35 | ||
|
|
bb3003dc3b | ||
|
|
2858dce664 | ||
|
|
1517ae3fc9 | ||
|
|
cf9c41f437 | ||
|
|
87497d2d09 | ||
|
|
67ab979a9b | ||
|
|
05f23f89ae | ||
|
|
cdc244ec06 | ||
|
|
71308316b1 | ||
|
|
2d1dfece25 | ||
|
|
65577a67dc | ||
|
|
45d5da98ca | ||
|
|
455e067e73 | ||
|
|
6359826fd9 | ||
|
|
8325083402 | ||
|
|
0f1a1d5f56 | ||
|
|
52d6f4343c | ||
|
|
405d55f3f6 | ||
|
|
06010b1366 | ||
|
|
21aa31f963 | ||
|
|
3f709cc39e | ||
|
|
f376e1ab01 | ||
|
|
fb3ba16a92 | ||
|
|
21285f02b8 | ||
|
|
05adf6f907 | ||
|
|
06fa171f7a | ||
|
|
4eae5be995 | ||
|
|
6d02617422 | ||
|
|
c2f07d14f3 | ||
|
|
52fe91f8bc | ||
|
|
98cb0f978e | ||
|
|
977a83cce8 | ||
|
|
4d92f9bf18 | ||
|
|
c459d60fc6 | ||
|
|
ad2e8a3c96 | ||
|
|
7dd9b3fa0c | ||
|
|
340a151302 | ||
|
|
9f70af009f | ||
|
|
bf1a65b8e8 | ||
|
|
037ab02a71 | ||
|
|
0039ec2958 | ||
|
|
08571d51fa | ||
|
|
6ac33b0568 | ||
|
|
373da78b7b | ||
|
|
c3d22335e2 | ||
|
|
4216eec494 | ||
|
|
e88e912c3c | ||
|
|
d06fb83fee | ||
|
|
e0b9a81c9b | ||
|
|
192e4b8877 | ||
|
|
02d44a6cca | ||
|
|
39ba1e0582 | ||
|
|
ae121895e9 | ||
|
|
11ecf20f89 | ||
|
|
3646a7d12d | ||
|
|
db5f45da83 | ||
|
|
52a4bfa25f | ||
|
|
099b62b645 | ||
|
|
e37332a5d2 | ||
|
|
f36cc56c81 | ||
|
|
b20750b936 | ||
|
|
407f58da54 | ||
|
|
fe5bb1d885 | ||
|
|
92f45567d7 | ||
|
|
a4c0e0a59c | ||
|
|
d536377329 | ||
|
|
923f4ed045 | ||
|
|
9191cae144 | ||
|
|
e8c142353c | ||
|
|
ba1e22955e | ||
|
|
c41847c0d7 | ||
|
|
e1d7c25c98 | ||
|
|
3d8e845233 | ||
|
|
0fa126a6b8 | ||
|
|
1961816ba7 | ||
|
|
4410b679a0 | ||
|
|
e6214b3c97 | ||
|
|
7e7637a1b3 | ||
|
|
86b201623d | ||
|
|
785843198a | ||
|
|
bc0f5a9136 | ||
|
|
461e650e05 | ||
|
|
c2132e3772 | ||
|
|
174c7a776e | ||
|
|
730864609f | ||
|
|
784137fdac | ||
|
|
c6aff8424c | ||
|
|
a7a34ac6b2 | ||
|
|
57492023f9 | ||
|
|
aff1e160b4 | ||
|
|
b8d12bd0cd | ||
|
|
5ab33e831d | ||
|
|
dc3b01dc15 | ||
|
|
e96bd5a0e7 | ||
|
|
57c33fe693 | ||
|
|
fc2d7b41d8 | ||
|
|
fd139d4903 | ||
|
|
813d33fc4d | ||
|
|
26addf809e | ||
|
|
a9e090c454 | ||
|
|
59355cf79f | ||
|
|
c200c53268 | ||
|
|
a572ff9fca | ||
|
|
1ab4f99a37 | ||
|
|
99006465e6 | ||
|
|
4a7e9c16d0 | ||
|
|
d416a77866 | ||
|
|
07fe141f8a | ||
|
|
c2de80f532 | ||
|
|
e742bdfacf | ||
|
|
24950a098f | ||
|
|
bed65745cc | ||
|
|
04a4833c6e | ||
|
|
4aa0a733fc | ||
|
|
082191412e | ||
|
|
e3a7d0807e | ||
|
|
0ee3d1160a | ||
|
|
b600bce23f | ||
|
|
952b5fab89 | ||
|
|
6c705e1e25 | ||
|
|
349e8b2da7 | ||
|
|
39ce74c1e0 | ||
|
|
77cf392300 | ||
|
|
b6225ccc38 | ||
|
|
a38eaad281 | ||
|
|
1b6d8a2b8d | ||
|
|
cbc1c935bf | ||
|
|
391bf4113a | ||
|
|
718bff7469 | ||
|
|
e67f60182d | ||
|
|
6bb0d736be | ||
|
|
5bc74fc296 | ||
|
|
fea237a3ea | ||
|
|
6f3cdeda70 | ||
|
|
8476baacc7 | ||
|
|
681f57f703 | ||
|
|
03051a95cf | ||
|
|
80f31f75ad | ||
|
|
e0da4c81da | ||
|
|
57a5b90be7 | ||
|
|
98928dba9d | ||
|
|
c83577cb81 | ||
|
|
39edf1a8ed | ||
|
|
8d10c9aa41 | ||
|
|
0bcb76fa81 | ||
|
|
aceb9e4de7 | ||
|
|
a249ced37c | ||
|
|
375078a9a4 | ||
|
|
273a7d82a2 | ||
|
|
26f5e52ad8 | ||
|
|
2a32f8f681 | ||
|
|
7dad0aa1da | ||
|
|
c742b73133 | ||
|
|
fece31a9aa | ||
|
|
b22a4501cc | ||
|
|
c596039453 | ||
|
|
7eea6ebe57 | ||
|
|
b6a42ecf48 | ||
|
|
95f3d4fffa | ||
|
|
95becde93d | ||
|
|
0538d082dc | ||
|
|
c3b6b8d821 | ||
|
|
c41fbbb93e | ||
|
|
0728d96339 | ||
|
|
abc335143b | ||
|
|
dc9908eac1 | ||
|
|
6274b617f4 | ||
|
|
c5d45c6b44 | ||
|
|
ef1a195036 | ||
|
|
5ac0837be3 | ||
|
|
fbc6f78cb5 | ||
|
|
d6f9fddc94 | ||
|
|
199011feb8 | ||
|
|
98f1d5cd9b | ||
|
|
b9c83ca06d | ||
|
|
f0b7a00ae6 | ||
|
|
a8a9a93317 | ||
|
|
32e9a7fa06 | ||
|
|
88a47e7788 | ||
|
|
4b4a414259 | ||
|
|
68281dce66 | ||
|
|
221cc8ab10 | ||
|
|
c6e47a868b | ||
|
|
0c5c261196 | ||
|
|
c7372aabfd | ||
|
|
7d1dbbb27a | ||
|
|
c00583dd98 | ||
|
|
49ca3bfd00 | ||
|
|
3adc3ed5d2 | ||
|
|
bdca59b3d7 | ||
|
|
d5ab4093a9 | ||
|
|
e6df19efbc | ||
|
|
b7948c5344 | ||
|
|
a13557d71d | ||
|
|
e2338fcedf | ||
|
|
43bfeff2be | ||
|
|
1a489652ff | ||
|
|
1ac92c561b | ||
|
|
cb952b0d3a | ||
|
|
5919dd998b | ||
|
|
320f78b31b | ||
|
|
533bc4c2fe | ||
|
|
eb8aa195c2 | ||
|
|
4197580b04 | ||
|
|
0e92f7bfff | ||
|
|
927277a6cd | ||
|
|
d5696010d9 | ||
|
|
9db37c2799 | ||
|
|
7e7b41cd8c | ||
|
|
fc3a369d3d | ||
|
|
5df766466a | ||
|
|
6814130570 | ||
|
|
cb6160f1e4 | ||
|
|
b00214bdbd | ||
|
|
4643810b75 | ||
|
|
45246bccd7 | ||
|
|
78b44a1319 | ||
|
|
0e6cd0f72a | ||
|
|
0aeba7c5af | ||
|
|
525c00ea18 | ||
|
|
c056bd4d4c | ||
|
|
93682fb42b | ||
|
|
aa9ec603a9 | ||
|
|
6f83bf3af2 | ||
|
|
d5245f0730 | ||
|
|
1b4cc556be | ||
|
|
2efcbd060a | ||
|
|
68ee35d03b | ||
|
|
1b6a43ae15 | ||
|
|
8de26af246 | ||
|
|
c3fd732243 | ||
|
|
3ce0b8bc97 | ||
|
|
2846eea956 | ||
|
|
ca3bedc9a1 | ||
|
|
2d4d7b80c1 | ||
|
|
df85543337 | ||
|
|
e15baeb4a2 | ||
|
|
f16804c0f8 | ||
|
|
934a41e414 | ||
|
|
8621fe2e3c | ||
|
|
bbf2c29a4a | ||
|
|
0a148166e1 | ||
|
|
79b4716b95 | ||
|
|
57437f04c9 | ||
|
|
8bbcd267cd | ||
|
|
e885cb6c45 | ||
|
|
8182141e93 | ||
|
|
d7d2efd58e | ||
|
|
02033a675a | ||
|
|
ca0f7bb74c | ||
|
|
d676ecfaa8 | ||
|
|
a0f556b2a9 | ||
|
|
6071319acd | ||
|
|
e9ddfa6cf9 | ||
|
|
8ee94d75ca | ||
|
|
ec40956721 | ||
|
|
8504d01688 | ||
|
|
c8a932b6b3 | ||
|
|
b1ed51e72c | ||
|
|
b386af4121 | ||
|
|
0daa3a8f57 | ||
|
|
ae42c4df16 | ||
|
|
252ff9d3c5 | ||
|
|
38c9ad6986 | ||
|
|
ad84b222a5 | ||
|
|
c3e4a08b00 | ||
|
|
f589bdc78d | ||
|
|
1a8efdbf2c | ||
|
|
b78e0144de | ||
|
|
3c27b50ff6 | ||
|
|
e8e5c8dff1 | ||
|
|
f66dd51084 | ||
|
|
54096d56d3 | ||
|
|
832119f6b1 | ||
|
|
5abd4dcc66 | ||
|
|
a4936a6ff3 | ||
|
|
ebe4804b00 | ||
|
|
098db9adf6 | ||
|
|
38b3c82ece | ||
|
|
99a7453f28 | ||
|
|
8ade52c8d9 | ||
|
|
a3ca1febbc | ||
|
|
767430d065 | ||
|
|
f9e27ef67c | ||
|
|
4d25d505e0 | ||
|
|
74fb470647 | ||
|
|
6404aac986 | ||
|
|
4fcb8d5540 | ||
|
|
4251ad7d45 | ||
|
|
d87317f937 | ||
|
|
b202b75bf7 | ||
|
|
5761ede9e1 | ||
|
|
cf15cb1e13 | ||
|
|
e5c6136950 | ||
|
|
37f90e6f1c | ||
|
|
6416fe1934 | ||
|
|
3b50428f82 | ||
|
|
d4b22ee472 | ||
|
|
35c8197881 | ||
|
|
a860acaf0d | ||
|
|
dccd240b66 | ||
|
|
35522ae77d | ||
|
|
e40c1ff09e | ||
|
|
d71ddd7ad0 | ||
|
|
ba8300508d | ||
|
|
734505ee73 | ||
|
|
dd65c173a9 | ||
|
|
ebae675961 | ||
|
|
539eadf533 | ||
|
|
3beebd42a8 | ||
|
|
66e00bb79a | ||
|
|
83985aa44c | ||
|
|
bb9684f7d3 | ||
|
|
ddfe79b3ac | ||
|
|
c852ad1d45 | ||
|
|
29f535da94 | ||
|
|
d5b6744a41 | ||
|
|
cbc3cfc33b | ||
|
|
547bd46bb3 | ||
|
|
8b8a303365 | ||
|
|
7b386c4f41 | ||
|
|
5b8fa5ec8d | ||
|
|
2c81ff90da | ||
|
|
66e118abdf | ||
|
|
38791e50ea | ||
|
|
a8c6a97579 | ||
|
|
5bb90828f8 | ||
|
|
e3e5085214 | ||
|
|
9be12da34e | ||
|
|
8e7b40efec | ||
|
|
d7d71d9ff1 | ||
|
|
2d68e3d4f3 | ||
|
|
53236faaa0 | ||
|
|
daca1b3615 | ||
|
|
9a8032a673 | ||
|
|
b11972d1b7 | ||
|
|
041ea2fbb1 | ||
|
|
5167611da5 | ||
|
|
4526378b33 | ||
|
|
bc2a9cf1c0 | ||
|
|
c4a5eeabcc | ||
|
|
00836cd38b | ||
|
|
c0009c7e62 | ||
|
|
6023f415a4 | ||
|
|
f55daf65e3 | ||
|
|
fe3c23d29c | ||
|
|
f0765ba743 | ||
|
|
672c623757 | ||
|
|
e33799701b | ||
|
|
e5e64a4b6d | ||
|
|
63f1c1f7b5 | ||
|
|
005de550c1 | ||
|
|
20fd3bdc20 | ||
|
|
e29f53a82d | ||
|
|
f272470871 | ||
|
|
9c082a573c | ||
|
|
7de0a0a44a | ||
|
|
e848c78dba | ||
|
|
3f60723425 | ||
|
|
8b97914438 | ||
|
|
a8967bab39 | ||
|
|
1248307b96 | ||
|
|
de1491a310 | ||
|
|
b5a08c3ba4 | ||
|
|
49bf86a8d5 | ||
|
|
5e4cfbaf3f | ||
|
|
11aed2ab61 | ||
|
|
e6f19a4abf | ||
|
|
b3b6dc2e94 | ||
|
|
ece09a93cd | ||
|
|
9a56ebea81 | ||
|
|
287e15fddc | ||
|
|
724cb0787d | ||
|
|
d8b806966a | ||
|
|
f24a6f0e3c | ||
|
|
34c516709b | ||
|
|
6d03eac9a1 | ||
|
|
c456ef9118 | ||
|
|
4351080aea | ||
|
|
8aee2858ea | ||
|
|
da5a930e89 | ||
|
|
5131cc8e43 | ||
|
|
60f06f97fa | ||
|
|
c0216e0800 | ||
|
|
2be68342bb | ||
|
|
c43a29f058 | ||
|
|
ab14b9c8bb | ||
|
|
fa3e496aae | ||
|
|
543cd5af80 | ||
|
|
e3cdfe27d1 | ||
|
|
d946e18fa2 | ||
|
|
b33b696336 | ||
|
|
e928b4c9e0 | ||
|
|
2b27e84956 | ||
|
|
9627272b57 | ||
|
|
705354a3d6 | ||
|
|
7d52b0cc96 | ||
|
|
8662e963ac | ||
|
|
08594f0b96 | ||
|
|
7db73cbd44 | ||
|
|
cae8485092 | ||
|
|
64e020b1ad | ||
|
|
2dd2208f48 | ||
|
|
ddc28c43c8 | ||
|
|
7c889e3523 | ||
|
|
af7beb2c34 | ||
|
|
7b50febba3 | ||
|
|
00543bca17 | ||
|
|
178710dabc | ||
|
|
99d9d14d3b | ||
|
|
a07d6aa1e7 | ||
|
|
59a4abff7c | ||
|
|
df0f310ddd | ||
|
|
57a06aa122 | ||
|
|
f110dce520 | ||
|
|
3085799c3c | ||
|
|
3d9b9af55e | ||
|
|
ad21909b5c | ||
|
|
d98d00556d | ||
|
|
5c7a4323e3 | ||
|
|
183701a00a | ||
|
|
549987296c | ||
|
|
9918e49bb1 | ||
|
|
d57ef1e928 | ||
|
|
203af0fc76 | ||
|
|
a446c0a9c9 | ||
|
|
b2aba7918d | ||
|
|
fc2c877a57 | ||
|
|
f2a93887c9 | ||
|
|
b1eb48d201 | ||
|
|
d372d786ef | ||
|
|
dc8df9c62f | ||
|
|
5b3ea08b39 | ||
|
|
72a754676a | ||
|
|
cb1da686ec | ||
|
|
8a78e4e9f4 | ||
|
|
b9b59ac2e0 | ||
|
|
549b982c5f | ||
|
|
558f527f20 | ||
|
|
d897d64aa5 | ||
|
|
59463958d3 | ||
|
|
d4a606884c | ||
|
|
ff3a2f6b67 | ||
|
|
288ac62448 | ||
|
|
f5d3df65b0 | ||
|
|
fc6ac662cd | ||
|
|
cd0d9052e8 | ||
|
|
86da8cbd17 | ||
|
|
7a38143f5e | ||
|
|
818802cf5e | ||
|
|
a668ed5e24 | ||
|
|
c9edc217fd | ||
|
|
89dc9e7e7f | ||
|
|
96b6832dff | ||
|
|
881e414043 | ||
|
|
b5a8312167 | ||
|
|
ac3a282876 | ||
|
|
a3117fa61d | ||
|
|
bfa0db3ba3 | ||
|
|
79fdba969b | ||
|
|
79461d52c2 | ||
|
|
8c7bac7dbb | ||
|
|
bb3b982dea | ||
|
|
f3038e4fef | ||
|
|
cfeb637685 | ||
|
|
f37fd5c5e3 | ||
|
|
4368602684 | ||
|
|
a67ced29a3 | ||
|
|
ca8293ebdb | ||
|
|
4a95dd8ba3 | ||
|
|
1616aa87bd | ||
|
|
9d9400f4d9 | ||
|
|
a6f8eb28f2 | ||
|
|
251834143c | ||
|
|
ad8b6c806d | ||
|
|
26a6264039 | ||
|
|
2dfcee6b25 | ||
|
|
b283977281 | ||
|
|
2538a79ef0 | ||
|
|
267f2afab6 | ||
|
|
559eebbb70 | ||
|
|
326ee9a9c2 | ||
|
|
dc4c33c0d5 | ||
|
|
3fbebfc283 | ||
|
|
7273e1218a | ||
|
|
69e96f24c2 | ||
|
|
92ddf2ca41 | ||
|
|
3662afeaa7 | ||
|
|
860210628e | ||
|
|
a1988f91c1 | ||
|
|
6f6393493b | ||
|
|
878213887f | ||
|
|
805b83da9c | ||
|
|
fe4319ad07 | ||
|
|
1bda9d5a26 | ||
|
|
9ce239dedb | ||
|
|
bc86c9b57d | ||
|
|
d9b9e02412 | ||
|
|
2f7b5dd041 | ||
|
|
5ffb7bba83 | ||
|
|
436bffcb0e | ||
|
|
99ce747720 | ||
|
|
f3fbbed7ee | ||
|
|
b7c024d275 | ||
|
|
cf76c943b8 | ||
|
|
2a0e641de7 | ||
|
|
630456f700 | ||
|
|
618ba376b2 | ||
|
|
c8a445275b | ||
|
|
68b3c449a6 | ||
|
|
aee7d171c5 | ||
|
|
2089406eaf | ||
|
|
298e041b80 | ||
|
|
c79bf1ca3a | ||
|
|
207546b53c | ||
|
|
a54898b062 | ||
|
|
124803c89d | ||
|
|
825128b630 | ||
|
|
dcd20f42b9 | ||
|
|
b6f14a752c | ||
|
|
40f58d7054 | ||
|
|
485afcfa6e | ||
|
|
e82bc859f5 | ||
|
|
5615e02cdb | ||
|
|
4c5a046bc0 | ||
|
|
6b6ab5e752 | ||
|
|
6d3f3985a2 | ||
|
|
64e57c5419 | ||
|
|
7e11c319e7 | ||
|
|
12265def19 | ||
|
|
45f60ae646 | ||
|
|
72988cc6fb | ||
|
|
4d3df4cda6 | ||
|
|
a0b7768a86 | ||
|
|
7aae1b262e | ||
|
|
5ace62a5fd | ||
|
|
48e01d3ea3 | ||
|
|
d93c705737 | ||
|
|
b1a97eca39 | ||
|
|
d91088879c | ||
|
|
21e5f33487 | ||
|
|
48f7c37d3b | ||
|
|
815d911143 | ||
|
|
d90baed5b5 | ||
|
|
e767cee4c0 | ||
|
|
eafce4442c | ||
|
|
3652394dab | ||
|
|
a942882c73 | ||
|
|
b8f829dbc3 | ||
|
|
8d33644749 | ||
|
|
268df23739 | ||
|
|
6c731f50a9 | ||
|
|
dc2f3cd166 | ||
|
|
877ad53ead | ||
|
|
bc7dce6026 | ||
|
|
c24e216f26 | ||
|
|
2d05ecc81f | ||
|
|
437c1a154c | ||
|
|
82d30c6e74 | ||
|
|
998eecb94d | ||
|
|
02e22e5781 | ||
|
|
ad11ca0a87 | ||
|
|
7b0a643de3 | ||
|
|
fa53bce27a | ||
|
|
1d3f1fd7d0 | ||
|
|
5d9a94466a | ||
|
|
b5175ae8b0 | ||
|
|
38948053cc | ||
|
|
4a5a496802 | ||
|
|
30b6c8aa03 | ||
|
|
95e468c90a | ||
|
|
d74dd48d24 | ||
|
|
5ef72b81ae | ||
|
|
691cf1ce72 | ||
|
|
5b70064fa4 | ||
|
|
80e01a4d3d | ||
|
|
b30f3d6b8f | ||
|
|
4672628ee2 | ||
|
|
a112c6d9ee | ||
|
|
2b1e343186 | ||
|
|
36ce0c8271 | ||
|
|
b521318e82 | ||
|
|
9f64a384d6 | ||
|
|
4ecff94aec | ||
|
|
c7e73924c8 | ||
|
|
87958d9db8 | ||
|
|
56fa719931 | ||
|
|
6ee6cd3977 | ||
|
|
7821f41723 | ||
|
|
ddf6154600 | ||
|
|
929cc2727d | ||
|
|
4379145231 | ||
|
|
42d86fab8e | ||
|
|
cb41a4c386 | ||
|
|
672abbcaad | ||
|
|
17bc9c35a7 | ||
|
|
50587735b5 | ||
|
|
21edfdb62e | ||
|
|
bda67afd4f | ||
|
|
c4ca06d5e5 | ||
|
|
f4904e06c8 | ||
|
|
1273a6fb74 | ||
|
|
3c626fd01e | ||
|
|
00953850b3 | ||
|
|
563370f10b | ||
|
|
62a33fe7fc | ||
|
|
ea18fda0a3 | ||
|
|
1ef163f827 | ||
|
|
3f6cb3cd73 | ||
|
|
284767409a | ||
|
|
5e3d29df4c | ||
|
|
c380049b21 | ||
|
|
b49209a0d9 | ||
|
|
9d39b616f9 | ||
|
|
32e0074f26 | ||
|
|
8d746cd206 | ||
|
|
bc341d193f | ||
|
|
3ad2b2bfcc | ||
|
|
acfad7ec5b | ||
|
|
5be6511529 | ||
|
|
f20b4d570e | ||
|
|
06a9478555 | ||
|
|
6e3ca5391a | ||
|
|
2422a4200c | ||
|
|
56788c8b8f | ||
|
|
220ac2fa2d | ||
|
|
3143d0d8aa | ||
|
|
0bb1669efa | ||
|
|
288be8dd71 | ||
|
|
d3bf71a22d | ||
|
|
12abca39a2 | ||
|
|
898c8854aa | ||
|
|
492e33aeda | ||
|
|
ce9c832e00 | ||
|
|
5e0821417e | ||
|
|
ce451e4dd4 | ||
|
|
714d8c7092 | ||
|
|
6162904c59 | ||
|
|
4d65b4c7a5 | ||
|
|
4243843951 | ||
|
|
203965043e | ||
|
|
bf87500e35 | ||
|
|
a038587224 | ||
|
|
96d908094b | ||
|
|
61dc148d34 | ||
|
|
f753369d1a | ||
|
|
72c2fa3863 | ||
|
|
ba0bda6aa6 | ||
|
|
890397bae7 | ||
|
|
d9b2863382 | ||
|
|
ccc8d7e5cd | ||
|
|
50f6044a2f | ||
|
|
31281c7faa | ||
|
|
e9b545a187 | ||
|
|
be1ecdb0c8 | ||
|
|
115e08d0c8 | ||
|
|
e2a892eda3 | ||
|
|
5d536dd975 | ||
|
|
af258dcf41 | ||
|
|
bbb46a29a9 | ||
|
|
3f7c1b0750 | ||
|
|
2b211c2ba0 | ||
|
|
c20314f83c | ||
|
|
57bc1f2032 | ||
|
|
d370f7e721 | ||
|
|
00c8ebbfe8 | ||
|
|
17951d7fe0 | ||
|
|
3e5288836d | ||
|
|
6c94c3aa7b | ||
|
|
6a24794457 | ||
|
|
443e7df1b6 | ||
|
|
82106c1c8b | ||
|
|
32867d3666 | ||
|
|
384b4226f2 | ||
|
|
cecd4aa36a | ||
|
|
0dffd66651 | ||
|
|
c34afae250 | ||
|
|
128453fad1 | ||
|
|
ac3b86fb85 | ||
|
|
e303982ad8 | ||
|
|
df763c4dbd | ||
|
|
85fd46e1c6 | ||
|
|
51b37a49d5 | ||
|
|
4838813a38 | ||
|
|
9867bd257f | ||
|
|
259985d328 | ||
|
|
2c4a9897ea | ||
|
|
2dbc404544 | ||
|
|
3d622a2c5a | ||
|
|
8b342c2ddb | ||
|
|
ca1f441f5a | ||
|
|
0fefead7d5 | ||
|
|
cb9bc6ad12 | ||
|
|
b6d01133c4 | ||
|
|
9ddaee9830 | ||
|
|
a5b54c50d1 | ||
|
|
5c84ffe5dc | ||
|
|
f178c8cce2 | ||
|
|
36bcafea98 | ||
|
|
95cd051a4f | ||
|
|
125c5523e6 | ||
|
|
374ed12811 | ||
|
|
b489e54da4 | ||
|
|
e928c78749 | ||
|
|
34dbed7733 | ||
|
|
6df3066b49 | ||
|
|
10c4b93b60 | ||
|
|
3fabd2975e | ||
|
|
217a7a34f8 | ||
|
|
5855ff0d27 | ||
|
|
3c4a9a05a0 | ||
|
|
9481d04a19 | ||
|
|
90c7bf4413 | ||
|
|
0b09f788c5 | ||
|
|
3045611452 | ||
|
|
0b3d028c2f | ||
|
|
a64be42f39 | ||
|
|
8405301500 | ||
|
|
07ed6a6416 | ||
|
|
970c9e70e4 | ||
|
|
f76f29f533 | ||
|
|
c3ecf2d84e | ||
|
|
a7dfb9cb97 | ||
|
|
225d46b228 | ||
|
|
f399ef8f69 | ||
|
|
c61db8c957 | ||
|
|
30afc095b9 | ||
|
|
755e7bc232 | ||
|
|
80e38fc430 | ||
|
|
581423a87c | ||
|
|
3634ca624d | ||
|
|
be33ac3c4f | ||
|
|
1cf79d8fbc | ||
|
|
acba67f67d | ||
|
|
1573738584 | ||
|
|
5376171538 | ||
|
|
90c41aceab | ||
|
|
6e10dc2893 | ||
|
|
87ce03e13e | ||
|
|
4db7577448 | ||
|
|
afdee44dd1 | ||
|
|
d929205bec | ||
|
|
0758d4f567 | ||
|
|
db0f228f4d | ||
|
|
a30f60c2ba | ||
|
|
1d13943caf | ||
|
|
e91e4042ba | ||
|
|
18720904f9 | ||
|
|
8d2aa1fc09 | ||
|
|
0e5155c85a | ||
|
|
3144a54c5b | ||
|
|
49362ce5ab | ||
|
|
13e629e17d | ||
|
|
8eb2f66b14 | ||
|
|
4fb0279f9a | ||
|
|
5d1006f05b | ||
|
|
eee76222bd | ||
|
|
4121bbc772 | ||
|
|
7926dd9aeb | ||
|
|
20ffcfb91e | ||
|
|
961bfcc481 | ||
|
|
eee50eef46 | ||
|
|
1329f3d2c7 | ||
|
|
0e812b911e | ||
|
|
28bd5f33c6 | ||
|
|
673b72f327 | ||
|
|
3fea8eb820 | ||
|
|
6e2e067d66 | ||
|
|
e09fe4acf0 | ||
|
|
0385662197 | ||
|
|
4ba222f19c | ||
|
|
6820a05efc | ||
|
|
0982e12a80 | ||
|
|
0536a2be33 | ||
|
|
24c5aae77f | ||
|
|
a972a52be4 | ||
|
|
f473c29430 | ||
|
|
7cd9768880 | ||
|
|
0a45a6fea9 | ||
|
|
9805ab8761 | ||
|
|
b4bb98b230 | ||
|
|
e11e141b5e | ||
|
|
83e199a0de | ||
|
|
4e87211d39 | ||
|
|
88208285a4 | ||
|
|
ae062586d7 | ||
|
|
fa72389c07 | ||
|
|
ea94cb8650 | ||
|
|
39d6ccd11c | ||
|
|
a62b225fe0 | ||
|
|
a72d1a13b6 | ||
|
|
60df499584 | ||
|
|
10204a4526 | ||
|
|
a5d63bc383 | ||
|
|
fcd276dccb | ||
|
|
fc66fba577 | ||
|
|
f1697313c0 | ||
|
|
6d8244ba5c | ||
|
|
102d5fdd7f | ||
|
|
2a86b06e0c | ||
|
|
7b4d6ba57e | ||
|
|
7be02731ee | ||
|
|
3cfa4f9cb7 | ||
|
|
10302f4bc9 | ||
|
|
b576ee300b | ||
|
|
77afcc2293 | ||
|
|
574e711f33 | ||
|
|
4cab77a57d | ||
|
|
6cbc9493c9 | ||
|
|
1d5f72f9ab | ||
|
|
b8e034e33c | ||
|
|
4f8c6e64fb | ||
|
|
39aadaa220 | ||
|
|
5c373f0d25 | ||
|
|
088c3984d8 | ||
|
|
3a61a7992a | ||
|
|
d694791d0f | ||
|
|
5e9ea4196c | ||
|
|
e7f000147b | ||
|
|
15e27e7e1d | ||
|
|
855d75f1bb | ||
|
|
e8f3a30a72 | ||
|
|
948e44d867 | ||
|
|
c0e671d506 | ||
|
|
2d895b52a4 | ||
|
|
4436a72b9f | ||
|
|
f1ce98eb07 | ||
|
|
418aa44960 | ||
|
|
b91850262d | ||
|
|
ed2dc101bb | ||
|
|
d89968cfa5 | ||
|
|
5f7c1ea4f4 | ||
|
|
e307524458 | ||
|
|
53cb4189d8 | ||
|
|
3efe3d63ce | ||
|
|
e44a05f18d | ||
|
|
d9574591fd | ||
|
|
55c27516b2 | ||
|
|
659ff866e1 | ||
|
|
f01de3a69d | ||
|
|
0c75cf6055 | ||
|
|
95613a1881 | ||
|
|
7bcbe5d791 | ||
|
|
bcc2ca7ce9 | ||
|
|
365ca9180f | ||
|
|
cfe1e7745f | ||
|
|
d0d9de8583 | ||
|
|
a304d75645 | ||
|
|
9f4f27d08f | ||
|
|
73530f59de | ||
|
|
6807dcbd5d | ||
|
|
e275ce6063 | ||
|
|
6352408d87 | ||
|
|
6870e03ffe | ||
|
|
d4641b45ac | ||
|
|
fad796f834 | ||
|
|
9e874b241a | ||
|
|
3f83361a7a | ||
|
|
a75b7b9be6 | ||
|
|
e4898bbbb3 | ||
|
|
132d5ec8cc | ||
|
|
59741ed04a | ||
|
|
fad6a406a1 | ||
|
|
4ee0731472 | ||
|
|
4fe530d257 | ||
|
|
d23eb291f7 | ||
|
|
3bbe54bb71 | ||
|
|
7aca726c33 | ||
|
|
3f1064b22d | ||
|
|
6fdbc9cdfa | ||
|
|
12b03518ee | ||
|
|
fcd3a86589 | ||
|
|
2ee671a1ae | ||
|
|
47a0642c4d | ||
|
|
db1cd3efbc | ||
|
|
f6803a2c52 | ||
|
|
f8d810a787 | ||
|
|
c8d865e26b | ||
|
|
e1c7705182 | ||
|
|
6aed2ec311 | ||
|
|
4c3f51cae3 | ||
|
|
f3088d1c49 | ||
|
|
be25226172 | ||
|
|
33d7e40e7c | ||
|
|
9eefd8839c | ||
|
|
d748e34d7e | ||
|
|
cefa8326e3 | ||
|
|
60f4937aae | ||
|
|
841e90dc46 | ||
|
|
81467a86cc | ||
|
|
498634fd13 | ||
|
|
d751805254 | ||
|
|
7c2e2a01c2 | ||
|
|
0b70c5225d | ||
|
|
b07d1b027c | ||
|
|
58801f8fb6 | ||
|
|
c589978e84 | ||
|
|
36f3c293f0 | ||
|
|
54417115f3 | ||
|
|
4006e4045c | ||
|
|
bdf57b5203 | ||
|
|
1d27ffbffb | ||
|
|
c36b5c77fc | ||
|
|
ac5cd90cc6 | ||
|
|
e0eb8c83e2 | ||
|
|
b8f513fffe | ||
|
|
7d4dd9c699 | ||
|
|
a254b996e0 | ||
|
|
6b9f96697b | ||
|
|
dc5eeb8476 | ||
|
|
7d40105023 | ||
|
|
3d73dc2fb7 | ||
|
|
94f217f4d7 | ||
|
|
00319c1fe2 | ||
|
|
67ac5a9c6a | ||
|
|
79b3b0fffc | ||
|
|
ab6a29191d | ||
|
|
636350c395 | ||
|
|
c076717133 | ||
|
|
943a438a6c | ||
|
|
a104693f97 | ||
|
|
8283c89614 | ||
|
|
c9790d7bb8 | ||
|
|
80ec16b9bd | ||
|
|
479945455b | ||
|
|
4512854c2a | ||
|
|
70950b8267 | ||
|
|
eec96b8549 | ||
|
|
30961babde | ||
|
|
a00c530f36 | ||
|
|
0af1e06c57 | ||
|
|
c0d52ef905 | ||
|
|
59d9840d7b | ||
|
|
9a2ffc1d7c | ||
|
|
c8fcfcd28c | ||
|
|
ac81d38acc | ||
|
|
9bc4b74888 | ||
|
|
2ec71c9942 | ||
|
|
343da4878d | ||
|
|
45f32ba62c | ||
|
|
f157e6a9f5 | ||
|
|
33485024af | ||
|
|
90efb967fe | ||
|
|
5fa62151f6 | ||
|
|
3a55985b20 | ||
|
|
4a0411b7fc | ||
|
|
7094675d5e | ||
|
|
cf7ae90097 | ||
|
|
53b19dad87 | ||
|
|
b10caecbba | ||
|
|
60d64ad2a6 | ||
|
|
fd71200284 | ||
|
|
de13ad1cd5 | ||
|
|
97bd617566 | ||
|
|
2583b38a17 | ||
|
|
e1f71cae37 | ||
|
|
d78ecdc203 | ||
|
|
0dd540a048 | ||
|
|
d8536c20b0 | ||
|
|
1a5bc2ddfe | ||
|
|
61c1232690 | ||
|
|
2554165963 | ||
|
|
fc4778159c | ||
|
|
d2105a7169 | ||
|
|
19ec14e4c2 | ||
|
|
3dbef1400c | ||
|
|
4ca0453cff | ||
|
|
fc07979966 | ||
|
|
7dda2df54b | ||
|
|
0d95636b0f | ||
|
|
9ad424c537 | ||
|
|
8c57dde0a6 | ||
|
|
31bbf3cfd5 | ||
|
|
9d404b6679 | ||
|
|
dc274aed48 | ||
|
|
51eda2ef74 | ||
|
|
f30f6378ac | ||
|
|
3b09276395 | ||
|
|
dbdd6c701b | ||
|
|
eb094eaebb | ||
|
|
9177f4b47d | ||
|
|
d4446b2605 | ||
|
|
356db288ad | ||
|
|
8a6690b6df | ||
|
|
1281059076 | ||
|
|
4622c86ae1 | ||
|
|
5c6b741dc4 | ||
|
|
25cedff47a | ||
|
|
5971802eb9 | ||
|
|
b40ff9ef66 | ||
|
|
3b2e54a156 | ||
|
|
b3f3cd2ffd | ||
|
|
288b46947d | ||
|
|
98add4b958 | ||
|
|
99b1c5a456 | ||
|
|
305fc52e73 | ||
|
|
425b209414 | ||
|
|
58b016a9c0 | ||
|
|
6c17107f39 | ||
|
|
8b153121ac | ||
|
|
4fc1169fa3 | ||
|
|
27dde4e70d | ||
|
|
10cbe25f17 | ||
|
|
14edd948ac | ||
|
|
386b54cf6a | ||
|
|
c068366ae2 | ||
|
|
bc85b3599e | ||
|
|
4d299f5b17 | ||
|
|
224c3eb99c | ||
|
|
4e537ac4d8 | ||
|
|
fe124310de | ||
|
|
19f25e45bb | ||
|
|
1fa4be9ebb | ||
|
|
f4e74065ec | ||
|
|
f07cd08789 | ||
|
|
28bddb713b | ||
|
|
0b86e0ae41 | ||
|
|
da058197c7 | ||
|
|
cf0d7067eb | ||
|
|
baa50069cf | ||
|
|
aab0bf369d | ||
|
|
07c13d84be | ||
|
|
47982d092b | ||
|
|
ef63f11bbb | ||
|
|
46e0656fe9 | ||
|
|
bdc2decd06 | ||
|
|
69204e3998 | ||
|
|
4419c20f33 | ||
|
|
f9ffa9c387 | ||
|
|
b402bd6c0e | ||
|
|
4f7c96326d | ||
|
|
ad36bd23c8 | ||
|
|
86fe78ba95 | ||
|
|
9678f1d1f2 | ||
|
|
d0d6ddd3c1 | ||
|
|
6dcd2e4b03 | ||
|
|
b9c58adae6 | ||
|
|
b7893c2820 | ||
|
|
fd1de0ef85 | ||
|
|
9c1fba3d79 | ||
|
|
1185bd5d86 | ||
|
|
70616de215 | ||
|
|
acf564756e | ||
|
|
616b9af5ed | ||
|
|
38b20987fb | ||
|
|
5f6d3078b7 | ||
|
|
2e0a8ee657 | ||
|
|
659a1dbe53 | ||
|
|
753124ec27 | ||
|
|
73dab9ebf4 | ||
|
|
716d6aca9f | ||
|
|
ec761802eb | ||
|
|
1a782a6938 | ||
|
|
63d693b388 | ||
|
|
5b1563b851 | ||
|
|
d794c4c81f | ||
|
|
70f0d8d558 | ||
|
|
2c50adb6f2 | ||
|
|
71c4d60bbf | ||
|
|
798faff7b2 | ||
|
|
94ed77353e | ||
|
|
a7159ecf1d | ||
|
|
b65f562c61 | ||
|
|
9918b4ee42 | ||
|
|
069781bcdd | ||
|
|
3596a5588d | ||
|
|
69890972bc | ||
|
|
313dd0cc6a | ||
|
|
dc30e4f8e0 | ||
|
|
a7b3ef34d8 | ||
|
|
f0b728a71b | ||
|
|
dfce6564a1 | ||
|
|
3b924ff1e6 | ||
|
|
15bc01576a | ||
|
|
19f4f6e1cc | ||
|
|
ea4e25ea28 | ||
|
|
fd6ea77f7b | ||
|
|
1b382e4391 | ||
|
|
091aba7aad | ||
|
|
49c151c1b4 | ||
|
|
3ffc4fad6d | ||
|
|
73dc6b768f | ||
|
|
413d8e6662 | ||
|
|
5d2ce27ea8 | ||
|
|
1d3a1a1345 | ||
|
|
9adf764af8 | ||
|
|
8ef6827bd9 | ||
|
|
79d011bd5c | ||
|
|
430ce9c136 | ||
|
|
fe7afe3dec | ||
|
|
8922cc72fc | ||
|
|
200181623e | ||
|
|
ab24afa31d | ||
|
|
b38fa395ce | ||
|
|
62475f9bcf | ||
|
|
674d6389b7 | ||
|
|
7ae98ca9fe | ||
|
|
13ed55ac10 | ||
|
|
fce020f4dd | ||
|
|
8c2376457b | ||
|
|
1dde832e31 | ||
|
|
8c86ae2461 | ||
|
|
695abb481d | ||
|
|
7f769e00b9 | ||
|
|
b2e4544b52 | ||
|
|
7d1ee33e1f | ||
|
|
2ade16a87a | ||
|
|
67fd2b4ac0 | ||
|
|
26294a5742 | ||
|
|
db8371d3af | ||
|
|
f308496ef9 | ||
|
|
a0507bd14d | ||
|
|
92d95db40b | ||
|
|
2309d30909 | ||
|
|
0f023113ec | ||
|
|
b3e5f09c83 | ||
|
|
2f5a4f63b6 | ||
|
|
85515079d6 | ||
|
|
a9123d2966 | ||
|
|
efdd8daa01 | ||
|
|
8f2d69b7f7 | ||
|
|
18ee6ecf80 | ||
|
|
5a3669cbe7 | ||
|
|
a1c78b3a44 | ||
|
|
4e0ea5f941 | ||
|
|
c425313ae6 | ||
|
|
4736921d05 | ||
|
|
45aedd8111 | ||
|
|
445f06f4b3 | ||
|
|
b8fbc837dc | ||
|
|
72bcc16a46 | ||
|
|
729640d6ec | ||
|
|
fcdb9e39c6 | ||
|
|
953adadd62 | ||
|
|
a9fa1fb66b | ||
|
|
8c7547ab03 | ||
|
|
e94fed0137 | ||
|
|
353a8ff768 | ||
|
|
3442081d20 | ||
|
|
67f14d6a62 | ||
|
|
9e1980f843 | ||
|
|
495e0ce89b | ||
|
|
76fa97e0a0 | ||
|
|
cc49948a59 | ||
|
|
5adcbb775d | ||
|
|
02ed3e4e8b | ||
|
|
f9ff9af094 | ||
|
|
529b8c2183 | ||
|
|
fa3ae62254 | ||
|
|
71ccbb9336 | ||
|
|
9f22a6d26d | ||
|
|
4db3bd7423 | ||
|
|
4393b0c80d | ||
|
|
c217828c18 | ||
|
|
a502f69b34 | ||
|
|
6f3e0f5162 | ||
|
|
0e44cae1e3 | ||
|
|
99b0defcf7 | ||
|
|
c6be74ac5b | ||
|
|
84af5a277e | ||
|
|
266e3ab270 | ||
|
|
1da5a0a4ca | ||
|
|
2c17d450dd | ||
|
|
41c4cbe3a6 | ||
|
|
c7dfaac61a | ||
|
|
36018fe570 | ||
|
|
e8b284a89c | ||
|
|
a8ea9a8dbe | ||
|
|
78f26a3689 | ||
|
|
671db12336 | ||
|
|
a5dc3bcc75 | ||
|
|
54819eb367 | ||
|
|
71ec4ad403 | ||
|
|
8644fb66c0 | ||
|
|
71b5d4fe5a | ||
|
|
abedc0be80 | ||
|
|
63072205d6 | ||
|
|
0ac7d9829a | ||
|
|
7989ca7504 | ||
|
|
56118a7142 | ||
|
|
93d8f66afc | ||
|
|
ea0e80b12b | ||
|
|
cfdb5456aa | ||
|
|
5baeadbe92 | ||
|
|
8a57a32233 | ||
|
|
af954a0578 | ||
|
|
b6bbd6899e | ||
|
|
f7edc853da | ||
|
|
820d0cde86 | ||
|
|
2249bbb0f5 | ||
|
|
4a37a6f497 | ||
|
|
0ce742fa8a | ||
|
|
86725b1ef1 | ||
|
|
7a3ec4194e | ||
|
|
53120faeba | ||
|
|
c9ca331d30 | ||
|
|
cce3749563 | ||
|
|
f389b1ae93 | ||
|
|
a275ce8738 | ||
|
|
03dfa19c0e | ||
|
|
b5087002d2 | ||
|
|
4df5cdd312 | ||
|
|
73867d87d7 | ||
|
|
76009ca6eb | ||
|
|
935d26f956 | ||
|
|
8d931e290a | ||
|
|
1cd846fbf1 | ||
|
|
c284d5d2f4 | ||
|
|
713a794e9a | ||
|
|
e1cc09a837 | ||
|
|
3ebb35ac6a | ||
|
|
3f377d4efc | ||
|
|
881d265579 | ||
|
|
70339423d0 | ||
|
|
a5f3359d32 | ||
|
|
13f00edefd | ||
|
|
97b5526cc1 | ||
|
|
3901422a54 | ||
|
|
2db2136117 | ||
|
|
fc40ed52f3 | ||
|
|
b2081dcbc9 | ||
|
|
fd42549733 | ||
|
|
07d002da48 | ||
|
|
dc51bc39ab | ||
|
|
411932c96b | ||
|
|
1eb3f449e2 | ||
|
|
188e7910dd | ||
|
|
5893564f46 | ||
|
|
bdf77b2782 | ||
|
|
ece5cc7dd5 | ||
|
|
db18b0f8e2 | ||
|
|
94cd2c0599 | ||
|
|
87225e64fa | ||
|
|
fffb97ea8d | ||
|
|
57b381311c | ||
|
|
121db63778 | ||
|
|
dcf52085ae | ||
|
|
2d339ba00a | ||
|
|
422e19724a | ||
|
|
f25f4f7dc8 | ||
|
|
c8fca3d63f | ||
|
|
fd1ee23adc | ||
|
|
a540165280 |
2
.github/pull_request_template.md
vendored
@@ -6,7 +6,7 @@
|
||||
|
||||
<!-- Please review the items on the PR checklist before submitting-->
|
||||
## PR Checklist
|
||||
* [ ] Closes #xxx
|
||||
* [ ] Applies to #xxx
|
||||
* [ ] CLA signed. If not, go over [here](https://cla.opensource.microsoft.com/microsoft/PowerToys) and sign the CLA
|
||||
* [ ] Tests added/passed
|
||||
* [ ] Requires documentation to be updated
|
||||
|
||||
13
.gitignore
vendored
@@ -301,6 +301,8 @@ __pycache__/
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
ImageResizer/tools/**
|
||||
!ImageResizer/tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
@@ -328,3 +330,14 @@ ASALocalRun/
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Temp build files
|
||||
src/settings/settings-html/200.html
|
||||
src/settings/settings-html/404.html
|
||||
|
||||
# Temp telemetry files.
|
||||
src/common/Telemetry/*.etl
|
||||
|
||||
# Don't ignore MergeModules
|
||||
!**/MergeModules/Release/
|
||||
!**/MergeModules/Debug/
|
||||
@@ -1,4 +1,5 @@
|
||||
cd /D "%~dp0"
|
||||
|
||||
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64 -winsdk=10.0.16299.0
|
||||
call msbuild ../installer/PowerToysSetup.sln /p:Configuration=Release /p:Platform=x64 || exit /b 1
|
||||
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64 -winsdk=10.0.18362.0
|
||||
SET IsPipeline=1
|
||||
call msbuild ../installer/PowerToysSetup.sln /p:Configuration=Release /p:Platform=x64 /p:CIBuild=true || exit /b 1
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
cd /D "%~dp0"
|
||||
|
||||
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64 -winsdk=10.0.16299.0
|
||||
call msbuild ../PowerToys.sln /p:Configuration=Release /p:Platform=x64 || exit /b 1
|
||||
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64 -winsdk=10.0.18362.0
|
||||
call msbuild ../PowerToys.sln /p:Configuration=Release /p:Platform=x64 /p:CIBuild=true || exit /b 1
|
||||
SET PTRoot=..
|
||||
call "..\installer\PowerToysSetup\publish.cmd"
|
||||
|
||||
@@ -3,6 +3,8 @@ trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev/build-features
|
||||
- dev/PowerLauncher
|
||||
paths:
|
||||
exclude:
|
||||
- doc/*
|
||||
@@ -13,6 +15,8 @@ pr:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev/build-features
|
||||
- dev/PowerLauncher
|
||||
|
||||
# 0.0.yyMM.dd##
|
||||
# 0.0.1904.0900
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
parameters:
|
||||
configuration: 'Release'
|
||||
platform: ''
|
||||
additionalBuildArguments: ''
|
||||
additionalBuildArguments: '/p:CIBuild=true'
|
||||
|
||||
jobs:
|
||||
- job: Build${{ parameters.platform }}${{ parameters.configuration }}
|
||||
|
||||
@@ -3,13 +3,14 @@ parameters:
|
||||
|
||||
steps:
|
||||
- checkout: self
|
||||
fetchDepth: 1
|
||||
submodules: true
|
||||
clean: true
|
||||
|
||||
- task: NuGetToolInstaller@0
|
||||
displayName: Ensure NuGet 4.8.1
|
||||
displayName: Ensure NuGet 5.5.0
|
||||
inputs:
|
||||
versionSpec: 4.8.1
|
||||
versionSpec: 5.5.0
|
||||
|
||||
- task: VisualStudioTestPlatformInstaller@1
|
||||
displayName: Ensure VSTest Platform
|
||||
@@ -31,5 +32,18 @@ steps:
|
||||
platform: '$(BuildPlatform)'
|
||||
configuration: '$(BuildConfiguration)'
|
||||
msbuildArgs: ${{ parameters.additionalBuildArguments }}
|
||||
clean: true
|
||||
maximumCpuCount: true
|
||||
|
||||
- task: VSTest@2
|
||||
inputs:
|
||||
platform: '$(BuildPlatform)'
|
||||
configuration: '$(BuildConfiguration)'
|
||||
testSelector: 'testAssemblies'
|
||||
testAssemblyVer2: |
|
||||
**\PreviewPaneUnitTests.dll
|
||||
**\UnitTests-SvgPreviewHandler.dll
|
||||
**\UnitTests-PreviewHandlerCommon.dll
|
||||
**\powerpreviewTest.dll
|
||||
**\UnitTests-CommonLib.dll
|
||||
!**\*TestAdapter.dll
|
||||
!**\obj\**
|
||||
|
||||
4
.pipelines/packages.config
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Microsoft.PowerToys.Telemetry" version="2.0" />
|
||||
</packages>
|
||||
@@ -2,10 +2,10 @@ environment:
|
||||
host:
|
||||
os: 'windows'
|
||||
flavor: 'server'
|
||||
version: '2016'
|
||||
version: '2019'
|
||||
runtime:
|
||||
provider: 'appcontainer'
|
||||
image: 'cdpxwin.azurecr.io/user/powertoys/vs2019:3.0'
|
||||
image: 'cdpxwin1809.azurecr.io/global/vse2019:latest'
|
||||
source_mode: 'map'
|
||||
|
||||
version:
|
||||
@@ -41,14 +41,85 @@ build:
|
||||
name: 'Build Power Toys'
|
||||
command: '.pipelines\build.cmd'
|
||||
artifacts:
|
||||
- to: 'Symbols'
|
||||
include:
|
||||
- 'x64/**/*.pdb'
|
||||
exclude:
|
||||
- 'x64/Release/obj/**/*.pdb'
|
||||
- from: 'x64/Release'
|
||||
to: 'Build_Output'
|
||||
include:
|
||||
- 'PowerToys.exe'
|
||||
- 'PowerToysSettings.exe'
|
||||
- 'modules\FancyZonesEditor.exe'
|
||||
- 'modules\fancyzones.dll'
|
||||
- 'modules\shortcut_guide.dll'
|
||||
- 'action_runner.exe'
|
||||
- 'modules\ImageResizer\ar\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\bg\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\ca\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\cs\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\de\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\es\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\eu-ES\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\fr\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\he\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\hu\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\it\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\nb-NO\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\nl\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\pl\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\pt-BR\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\ru\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\sk\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\tr\ImageResizer.resources.dll'
|
||||
- 'modules\ImageResizer\zh-Hans\ImageResizer.resources.dll'
|
||||
- 'modules\FancyZones\fancyzones.dll'
|
||||
- 'modules\FancyZones\FancyZonesEditor.exe'
|
||||
- 'modules\FileExplorerPreview\MarkdownPreviewHandler.dll'
|
||||
- 'modules\FileExplorerPreview\powerpreview.dll'
|
||||
- 'modules\FileExplorerPreview\PreviewHandlerCommon.dll'
|
||||
- 'modules\FileExplorerPreview\SvgPreviewHandler.dll'
|
||||
- 'modules\ImageResizer\ImageResizer.exe'
|
||||
- 'modules\ImageResizer\ImageResizerExt.dll'
|
||||
- 'modules\KeyboardManager\KeyboardManager.dll'
|
||||
- 'modules\launcher\Microsoft.PowerToys.Settings.UI.Lib.dll'
|
||||
- 'modules\launcher\Plugins\Microsoft.Plugin.Calculator\Microsoft.Plugin.Calculator.dll'
|
||||
- 'modules\launcher\Plugins\Microsoft.Plugin.Calculator\Wox.Infrastructure.dll'
|
||||
- 'modules\launcher\Plugins\Microsoft.Plugin.Calculator\Wox.Plugin.dll'
|
||||
- 'modules\launcher\Plugins\Microsoft.Plugin.Folder\Microsoft.Plugin.Folder.dll'
|
||||
- 'modules\launcher\Plugins\Microsoft.Plugin.Folder\Wox.Infrastructure.dll'
|
||||
- 'modules\launcher\Plugins\Microsoft.Plugin.Folder\Wox.Plugin.dll'
|
||||
- 'modules\launcher\Plugins\Microsoft.Plugin.Indexer\Microsoft.Plugin.Indexer.dll'
|
||||
- 'modules\launcher\Plugins\Microsoft.Plugin.Indexer\Wox.Infrastructure.dll'
|
||||
- 'modules\launcher\Plugins\Microsoft.Plugin.Program\Microsoft.Plugin.Program.dll'
|
||||
- 'modules\launcher\Plugins\Microsoft.Plugin.Program\Wox.Infrastructure.dll'
|
||||
- 'modules\launcher\Plugins\Microsoft.Plugin.Program\Wox.Plugin.dll'
|
||||
- 'modules\launcher\Plugins\Microsoft.Plugin.Shell\Microsoft.Plugin.Shell.dll'
|
||||
- 'modules\launcher\Plugins\Microsoft.Plugin.Shell\Wox.Infrastructure.dll'
|
||||
- 'modules\launcher\Plugins\Microsoft.Plugin.Shell\Wox.Plugin.dll'
|
||||
- 'modules\launcher\Plugins\Microsoft.Plugin.WindowWalker\Microsoft.Plugin.WindowWalker.dll'
|
||||
- 'modules\launcher\Plugins\Microsoft.Plugin.WindowWalker\Wox.Infrastructure.dll'
|
||||
- 'modules\launcher\Plugins\Microsoft.Plugin.WindowWalker\Wox.Plugin.dll'
|
||||
- 'modules\launcher\PowerLauncher.dll'
|
||||
- 'modules\launcher\PowerLauncher.exe'
|
||||
- 'modules\launcher\PowerLauncher.Telemetry.dll'
|
||||
- 'modules\launcher\PowerLauncher.UI.exe'
|
||||
- 'modules\launcher\PowerToysInterop.dll'
|
||||
- 'modules\launcher\Telemetry.dll'
|
||||
- 'modules\launcher\Wox.Core.dll'
|
||||
- 'modules\launcher\Wox.dll'
|
||||
- 'modules\launcher\Wox.Infrastructure.dll'
|
||||
- 'modules\launcher\Wox.Plugin.dll'
|
||||
- 'modules\Microsoft.Launcher.dll'
|
||||
- 'modules\PowerRename\PowerRenameExt.dll'
|
||||
- 'modules\ShortcutGuide\ShortcutGuide.dll'
|
||||
- 'Notifications.dll'
|
||||
- 'os-detection.dll'
|
||||
- 'PowerToys.exe'
|
||||
- 'PowerToysInterop.dll'
|
||||
- 'PowerToysSettings.exe'
|
||||
- 'SettingsUIRunner\Microsoft.PowerToys.Settings.UI.exe'
|
||||
- 'SettingsUIRunner\Microsoft.PowerToys.Settings.UI.Lib.dll'
|
||||
- 'SettingsUIRunner\Microsoft.PowerToys.Settings.UI.Runner.dll'
|
||||
- 'SettingsUIRunner\Microsoft.PowerToys.Settings.UI.Runner.exe'
|
||||
- 'SettingsUIRunner\PowerToysInterop.dll'
|
||||
- 'SettingsUIRunner\Telemetry.dll'
|
||||
signing_options:
|
||||
sign_inline: true # This does signing a soon as this command completes
|
||||
- !!buildcommand
|
||||
@@ -58,24 +129,37 @@ build:
|
||||
- from: 'installer\PowerToysSetup\x64\Release'
|
||||
to: 'Build_Installer_Output'
|
||||
include:
|
||||
- 'PowerToysSetup.msi'
|
||||
- 'PowerToysSetup-*.msi'
|
||||
signing_options:
|
||||
sign_inline: true # This does signing a soon as this command completes
|
||||
|
||||
#package:
|
||||
# commands:
|
||||
# - !!buildcommand
|
||||
# name: 'Build MSIX package'
|
||||
# command: 'installer\msix\build_msix_cdpx.cmd'
|
||||
# artifacts:
|
||||
# - from: 'installer\msix\bin'
|
||||
# to: 'Build_MSIX_Package_Output'
|
||||
# include:
|
||||
# - '*.msix'
|
||||
# - '*.msixbundle'
|
||||
# signing_options:
|
||||
# profile: '400'
|
||||
|
||||
static_analysis_options:
|
||||
binskim_options:
|
||||
files_to_scan:
|
||||
- from: 'installer/packages'
|
||||
exclude:
|
||||
exclude:
|
||||
- 'WiX.3.11.1/**/*.dll'
|
||||
- 'Wix.3.11.1/**/*.exe'
|
||||
- 'WiX.*/**/*.dll'
|
||||
- 'Wix.*/**/*.exe'
|
||||
moderncop_options:
|
||||
files_to_scan:
|
||||
- from: 'src'
|
||||
exclude:
|
||||
- '**/just.config.js'
|
||||
- '**/webpack.config.js'
|
||||
- '**/webpack.serve.config.js'
|
||||
- '**/dist/bundle.js'
|
||||
|
||||
- '**/just.config.js'
|
||||
- '**/webpack.config.js'
|
||||
- '**/webpack.serve.config.js'
|
||||
- '**/dist/bundle.js'
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
cd /D "%~dp0"
|
||||
|
||||
set PROJECT="..\src\modules\fancyzones\editor\FancyZonesEditor\FancyZonesEditor.csproj"
|
||||
set TELEMETRY_PKG="Microsoft.PowerToys.Telemetry"
|
||||
call nuget.exe restore -PackagesDirectory . packages.config || exit /b 1
|
||||
|
||||
dotnet add %PROJECT% package %TELEMETRY_PKG%
|
||||
move /Y "Microsoft.PowerToys.Telemetry.2.0.0\build\include\TraceLoggingDefines.h" "..\src\common\Telemetry\TraceLoggingDefines.h" || exit /b 1
|
||||
move /Y "Microsoft.PowerToys.Telemetry.2.0.0\build\include\TelemetryBase.cs" "..\src\common\Telemetry\TelemetryBase.cs" || exit /b 1
|
||||
|
||||
9
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# Microsoft Open Source Code of Conduct
|
||||
|
||||
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
|
||||
|
||||
Resources:
|
||||
|
||||
- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)
|
||||
- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
|
||||
- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns
|
||||
2
LICENSE
@@ -1,4 +1,4 @@
|
||||
The MIT License (MIT)
|
||||
The MIT License
|
||||
|
||||
Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
|
||||
|
||||
BIN
MTNDWidget.jpg
|
Before Width: | Height: | Size: 4.7 KiB |
126
NOTICE.md
Normal file
@@ -0,0 +1,126 @@
|
||||
# NOTICES AND INFORMATION
|
||||
This software incorporates material from third parties.
|
||||
|
||||
## PowerToy: ImageResizer
|
||||
|
||||
### Brice Lams's Image Resizer License
|
||||
|
||||
**Source**: https://github.com/bricelam/ImageResizer/
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) Brice Lambson. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
## PowerToy: Launcher
|
||||
|
||||
### Wox License
|
||||
|
||||
**Fork project source**: https://github.com/jjw24/Wox/
|
||||
**Base project source**: https://github.com/Wox-launcher/Wox
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 Wox
|
||||
|
||||
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.
|
||||
|
||||
### Beta Tadele's Window Walker License
|
||||
|
||||
**Source**: https://github.com/betsegaw/windowwalker
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright 2020 Betsegaw Tadele
|
||||
|
||||
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.
|
||||
|
||||
### Squirrel.Windows License
|
||||
|
||||
**Source**: https://github.com/Squirrel/Squirrel.Windows/
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2012 GitHub, Inc.
|
||||
|
||||
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.
|
||||
|
||||
## PowerToy: PowerRename
|
||||
|
||||
### Chris Davis's SmartRename License
|
||||
|
||||
**Source**: https://github.com/chrdavis/SmartRename
|
||||
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017 Chris Davis
|
||||
|
||||
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.
|
||||
441
PowerToys.sln
@@ -5,17 +5,39 @@ VisualStudioVersion = 16.0.28803.452
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "runner", "src\runner\runner.vcxproj", "{9412D5C6-2CF2-4FC2-A601-B55508EA9B27}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{217DF501-135C-4E38-BFC8-99D4821032EA} = {217DF501-135C-4E38-BFC8-99D4821032EA}
|
||||
{0E072714-D127-460B-AFAD-B4C40B412798} = {0E072714-D127-460B-AFAD-B4C40B412798}
|
||||
{48804216-2A0E-4168-A6D8-9CD068D14227} = {48804216-2A0E-4168-A6D8-9CD068D14227}
|
||||
{51920F1F-C28C-4ADF-8660-4238766796C2} = {51920F1F-C28C-4ADF-8660-4238766796C2}
|
||||
{6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB} = {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}
|
||||
{031AC72E-FA28-4AB7-B690-6F7B9C28AA73} = {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}
|
||||
{74485049-C722-400F-ABE5-86AC52D929B3} = {74485049-C722-400F-ABE5-86AC52D929B3}
|
||||
{0485F45C-EA7A-4BB5-804B-3E8D14699387} = {0485F45C-EA7A-4BB5-804B-3E8D14699387}
|
||||
{D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D} = {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}
|
||||
{5CCC8468-DEC8-4D36-99D4-5C891BEBD481} = {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}
|
||||
{0B593A6C-4143-4337-860E-DB5710FB87DB} = {0B593A6C-4143-4337-860E-DB5710FB87DB}
|
||||
{E364F67B-BB12-4E91-B639-355866EBCD8B} = {E364F67B-BB12-4E91-B639-355866EBCD8B}
|
||||
{DA425894-6E13-404F-8DCB-78584EC0557A} = {DA425894-6E13-404F-8DCB-78584EC0557A}
|
||||
{2BE46397-4DFA-414C-9BD4-41E4BBF8CB34} = {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}
|
||||
{A7D5099E-F0FD-4BF3-8522-5A682759F915} = {A7D5099E-F0FD-4BF3-8522-5A682759F915}
|
||||
{0B43679E-EDFA-4DA0-AD30-F4628B308B1B} = {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}
|
||||
{B25AC7A5-FB9F-4789-B392-D5C85E948670} = {B25AC7A5-FB9F-4789-B392-D5C85E948670}
|
||||
{E4E0D2AE-B17D-4BD4-8BEE-AFC8CC464C5F} = {E4E0D2AE-B17D-4BD4-8BEE-AFC8CC464C5F}
|
||||
{AF2349B8-E5B6-4004-9502-687C1C7730B1} = {AF2349B8-E5B6-4004-9502-687C1C7730B1}
|
||||
{A46629C4-1A6C-40FA-A8B6-10E5102BB0BA} = {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}
|
||||
{17DA04DF-E393-4397-9CF0-84DABE11032E} = {17DA04DF-E393-4397-9CF0-84DABE11032E}
|
||||
{F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99} = {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}
|
||||
{07C389E3-6BC8-41CF-923E-307B1265FA2D} = {07C389E3-6BC8-41CF-923E-307B1265FA2D}
|
||||
{89F34AF7-1C34-4A72-AA6E-534BCF972BD9} = {89F34AF7-1C34-4A72-AA6E-534BCF972BD9}
|
||||
{E6410BFC-B341-498C-8C67-312C20CDD8D5} = {E6410BFC-B341-498C-8C67-312C20CDD8D5}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "src\common\common.vcxproj", "{74485049-C722-400F-ABE5-86AC52D929B3}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shortcut_guide", "src\modules\shortcut_guide\shortcut_guide.vcxproj", "{A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_powertoy", "src\modules\example_powertoy\example_powertoy.vcxproj", "{44CC9375-3E6E-4D99-8913-7FB748807EBD}"
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ShortcutGuide", "src\modules\shortcut_guide\shortcut_guide.vcxproj", "{A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{74485049-C722-400F-ABE5-86AC52D929B3} = {74485049-C722-400F-ABE5-86AC52D929B3}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{4574FDD0-F61D-4376-98BF-E5A1262C11EC}"
|
||||
EndProject
|
||||
@@ -23,6 +45,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "interface", "interface", "{
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
src\modules\interface\lowlevel_keyboard_event_data.h = src\modules\interface\lowlevel_keyboard_event_data.h
|
||||
src\modules\interface\powertoy_module_interface.h = src\modules\interface\powertoy_module_interface.h
|
||||
src\modules\interface\powertoy_system_menu.h = src\modules\interface\powertoy_system_menu.h
|
||||
src\modules\interface\win_hook_event_data.h = src\modules\interface\win_hook_event_data.h
|
||||
EndProjectSection
|
||||
EndProject
|
||||
@@ -31,21 +54,28 @@ EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fancyzones", "fancyzones", "{D1D6BC88-09AE-4FB4-AD24-5DED46A791DD}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FancyZonesLib", "src\modules\fancyzones\lib\FancyZonesLib.vcxproj", "{F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{74485049-C722-400F-ABE5-86AC52D929B3} = {74485049-C722-400F-ABE5-86AC52D929B3}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fancyzones", "src\modules\fancyzones\dll\FancyZonesModule.vcxproj", "{48804216-2A0E-4168-A6D8-9CD068D14227}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{74485049-C722-400F-ABE5-86AC52D929B3} = {74485049-C722-400F-ABE5-86AC52D929B3}
|
||||
{5CCC8468-DEC8-4D36-99D4-5C891BEBD481} = {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTests-FancyZones", "src\modules\fancyzones\tests\UnitTests\UnitTests.vcxproj", "{9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpprestsdk", "deps\cpprestsdk\cpprestsdk.vcxproj", "{4E577735-DFAB-41AF-8A6E-B6E8872A2928}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "deps", "deps", "{1FAF749F-0D6F-4BF5-A563-31A4B5279D27}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{74485049-C722-400F-ABE5-86AC52D929B3} = {74485049-C722-400F-ABE5-86AC52D929B3}
|
||||
{F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99} = {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "common", "common", "{1AFB6476-670D-4E80-A464-657E01DFF482}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTests-CommonLib", "src\common\UnitTests-CommonLib\UnitTests-CommonLib.vcxproj", "{1A066C63-64B3-45F8-92FE-664E1CCE8077}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{74485049-C722-400F-ABE5-86AC52D929B3} = {74485049-C722-400F-ABE5-86AC52D929B3}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FancyZonesEditor", "src\modules\fancyzones\editor\FancyZonesEditor\FancyZonesEditor.csproj", "{5CCC8468-DEC8-4D36-99D4-5C891BEBD481}"
|
||||
EndProject
|
||||
@@ -55,6 +85,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerRenameExt", "src\modul
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{0E072714-D127-460B-AFAD-B4C40B412798} = {0E072714-D127-460B-AFAD-B4C40B412798}
|
||||
{51920F1F-C28C-4ADF-8660-4238766796C2} = {51920F1F-C28C-4ADF-8660-4238766796C2}
|
||||
{74485049-C722-400F-ABE5-86AC52D929B3} = {74485049-C722-400F-ABE5-86AC52D929B3}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerRenameLib", "src\modules\powerrename\lib\PowerRenameLib.vcxproj", "{51920F1F-C28C-4ADF-8660-4238766796C2}"
|
||||
@@ -68,15 +99,164 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerRenameTest", "src\modu
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{0E072714-D127-460B-AFAD-B4C40B412798} = {0E072714-D127-460B-AFAD-B4C40B412798}
|
||||
{51920F1F-C28C-4ADF-8660-4238766796C2} = {51920F1F-C28C-4ADF-8660-4238766796C2}
|
||||
{74485049-C722-400F-ABE5-86AC52D929B3} = {74485049-C722-400F-ABE5-86AC52D929B3}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerRenameUnitTests", "src\modules\powerrename\unittests\PowerRenameLibUnitTests.vcxproj", "{2151F984-E006-4A9F-92EF-C6DDE3DC8413}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{0E072714-D127-460B-AFAD-B4C40B412798} = {0E072714-D127-460B-AFAD-B4C40B412798}
|
||||
{51920F1F-C28C-4ADF-8660-4238766796C2} = {51920F1F-C28C-4ADF-8660-4238766796C2}
|
||||
{74485049-C722-400F-ABE5-86AC52D929B3} = {74485049-C722-400F-ABE5-86AC52D929B3}
|
||||
{B25AC7A5-FB9F-4789-B392-D5C85E948670} = {B25AC7A5-FB9F-4789-B392-D5C85E948670}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{BEEAB7F2-FFF6-45AB-9CDB-B04CC0734B88}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ModuleTemplateCompileTest", "tools\project_template\ModuleTemplate\ModuleTemplateCompileTest.vcxproj", "{64A80062-4D8B-4229-8A38-DFA1D7497749}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{74485049-C722-400F-ABE5-86AC52D929B3} = {74485049-C722-400F-ABE5-86AC52D929B3}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerRenameUWPUI", "src\modules\powerrename\UWPui\PowerRenameUWPUI.vcxproj", "{0485F45C-EA7A-4BB5-804B-3E8D14699387}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{0E072714-D127-460B-AFAD-B4C40B412798} = {0E072714-D127-460B-AFAD-B4C40B412798}
|
||||
{74485049-C722-400F-ABE5-86AC52D929B3} = {74485049-C722-400F-ABE5-86AC52D929B3}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "notifications", "src\common\notifications_winrt\notifications.vcxproj", "{0B593A6C-4143-4337-860E-DB5710FB87DB}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{74485049-C722-400F-ABE5-86AC52D929B3} = {74485049-C722-400F-ABE5-86AC52D929B3}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "notifications_dll", "src\common\notifications\notifications_dll.vcxproj", "{031AC72E-FA28-4AB7-B690-6F7B9C28AA73}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{74485049-C722-400F-ABE5-86AC52D929B3} = {74485049-C722-400F-ABE5-86AC52D929B3}
|
||||
{0B593A6C-4143-4337-860E-DB5710FB87DB} = {0B593A6C-4143-4337-860E-DB5710FB87DB}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KeyboardManager", "src\modules\keyboardmanager\dll\KeyboardManager.vcxproj", "{89F34AF7-1C34-4A72-AA6E-534BCF972BD9}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "imageresizer", "imageresizer", "{6C7F47CC-2151-44A3-A546-41C70025132C}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageResizerUI", "src\modules\imageresizer\ui\ImageResizerUI.csproj", "{2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ImageResizerExt", "src\modules\imageresizer\dll\ImageResizerExt.vcxproj", "{0B43679E-EDFA-4DA0-AD30-F4628B308B1B}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageResizerUITest", "src\modules\imageresizer\tests\ImageResizerUITest.csproj", "{E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KeyboardManagerUI", "src\modules\keyboardmanager\ui\KeyboardManagerUI.vcxproj", "{EAF23649-EF6E-478B-980E-81FAD96CCA2A}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "action_runner", "src\action_runner\action_runner.vcxproj", "{D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{17DA04DF-E393-4397-9CF0-84DABE11032E} = {17DA04DF-E393-4397-9CF0-84DABE11032E}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "updating", "src\common\updating\updating.vcxproj", "{17DA04DF-E393-4397-9CF0-84DABE11032E}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "keyboardmanager", "keyboardmanager", "{38BDB927-829B-4C65-9CD9-93FB05D66D65}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KeyboardManagerCommon", "src\modules\keyboardmanager\common\KeyboardManagerCommon.vcxproj", "{8AFFA899-0B73-49EC-8C50-0FADDA57B2FC}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "launcher", "launcher", "{C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wox", "src\modules\launcher\Wox\Wox.csproj", "{DB90F671-D861-46BB-93A3-F1304F5BA1C5}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{FDB3555B-58EF-4AE6-B5F1-904719637AB4} = {FDB3555B-58EF-4AE6-B5F1-904719637AB4}
|
||||
{59BD9891-3837-438A-958D-ADC7F91F6F7E} = {59BD9891-3837-438A-958D-ADC7F91F6F7E}
|
||||
{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0} = {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}
|
||||
{787B8AA6-CA93-4C84-96FE-DF31110AD1C4} = {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}
|
||||
{F8B870EB-D5F5-45BA-9CF7-A5C459818820} = {F8B870EB-D5F5-45BA-9CF7-A5C459818820}
|
||||
{74F1B9ED-F59C-4FE7-B473-7B453E30837E} = {74F1B9ED-F59C-4FE7-B473-7B453E30837E}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wox.Core", "src\modules\launcher\Wox.Core\Wox.Core.csproj", "{B749F0DB-8E75-47DB-9E5E-265D16D0C0D2}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wox.Infrastructure", "src\modules\launcher\Wox.Infrastructure\Wox.Infrastructure.csproj", "{4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wox.Plugin", "src\modules\launcher\Wox.Plugin\Wox.Plugin.csproj", "{8451ECDD-2EA4-4966-BB0A-7BBC40138E80}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wox.Test", "src\modules\launcher\Wox.Test\Wox.Test.csproj", "{FF742965-9A80-41A5-B042-D6C7D3A21708}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{4AFC9975-2456-4C70-94A4-84073C1CED93}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Plugin.Calculator", "src\modules\launcher\Plugins\Microsoft.Plugin.Calculator\Microsoft.Plugin.Calculator.csproj", "{59BD9891-3837-438A-958D-ADC7F91F6F7E}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Plugin.WindowWalker", "src\modules\launcher\Plugins\Microsoft.Plugin.WindowWalker\Microsoft.Plugin.WindowWalker.csproj", "{74F1B9ED-F59C-4FE7-B473-7B453E30837E}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Plugin.Program", "src\modules\launcher\Plugins\Microsoft.Plugin.Program\Microsoft.Plugin.Program.csproj", "{FDB3555B-58EF-4AE6-B5F1-904719637AB4}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Plugin.Shell", "src\modules\launcher\Plugins\Microsoft.Plugin.Shell\Microsoft.Plugin.Shell.csproj", "{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Plugin.Indexer", "src\modules\launcher\Plugins\Microsoft.Plugin.Indexer\Microsoft.Plugin.Indexer.csproj", "{F8B870EB-D5F5-45BA-9CF7-A5C459818820}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{8451ECDD-2EA4-4966-BB0A-7BBC40138E80} = {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.Launcher", "src\modules\launcher\Microsoft.Launcher\Microsoft.Launcher.vcxproj", "{E364F67B-BB12-4E91-B639-355866EBCD8B}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{F97E5003-F263-4D4A-A964-0F1F3C82DEF2} = {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PowerLauncher", "src\modules\launcher\PowerLauncher\PowerLauncher.csproj", "{F97E5003-F263-4D4A-A964-0F1F3C82DEF2}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{E775CC2C-24CB-48D6-9C3A-BE4CCE0DB17A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "win-app-driver", "src\tests\win-app-driver\win-app-driver.csproj", "{880ED251-9E16-4713-9A70-D35FE0C01669}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "previewpane", "previewpane", "{2F305555-C296-497E-AC20-5FA1B237996A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PreviewHandlerCommon", "src\modules\previewpane\Common\PreviewHandlerCommon.csproj", "{AF2349B8-E5B6-4004-9502-687C1C7730B1}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarkdownPreviewHandler", "src\modules\previewpane\MarkDownPreviewHandler\MarkdownPreviewHandler.csproj", "{6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests-MarkdownPreviewHandler", "src\modules\previewpane\PreviewPaneUnitTests\UnitTests-MarkdownPreviewHandler.csproj", "{A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SvgPreviewHandler", "src\modules\previewpane\SvgPreviewHandler\SvgPreviewHandler.csproj", "{DA425894-6E13-404F-8DCB-78584EC0557A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests-SvgPreviewHandler", "src\modules\previewpane\UnitTests-SvgPreviewHandler\UnitTests-SvgPreviewHandler.csproj", "{060D75DA-2D1C-48E6-A4A1-6F0718B64661}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests-PreviewHandlerCommon", "src\modules\previewpane\UnitTests-PreviewHandlerCommon\UnitTests-PreviewHandlerCommon.csproj", "{748417CA-F17E-487F-9411-CAFB6D3F4877}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "powerpreview", "src\modules\previewpane\powerpreview\powerpreview.vcxproj", "{217DF501-135C-4E38-BFC8-99D4821032EA}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "powerpreviewTest", "src\modules\previewpane\powerpreviewTest\powerpreviewTest.vcxproj", "{47310AB4-9034-4BD1-8D8B-E88AD21A171B}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "core", "core", "{C3081D9A-1586-441A-B5F4-ED815B3719C1}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerToys.Settings.UI.Runner", "src\core\Microsoft.PowerToys.Settings.UI.Runner\Microsoft.PowerToys.Settings.UI.Runner.csproj", "{E4E0D2AE-B17D-4BD4-8BEE-AFC8CC464C5F}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.PowerToys.Settings.UI", "src\core\Microsoft.PowerToys.Settings.UI\Microsoft.PowerToys.Settings.UI.csproj", "{A7D5099E-F0FD-4BF3-8522-5A682759F915}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{4981CCD1-4CD9-4A49-B240-00AA46493FF8}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
src\.editorconfig = src\.editorconfig
|
||||
src\tests\win-app-driver\packages.config = src\tests\win-app-driver\packages.config
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerToys.Settings.UI.Lib", "src\core\Microsoft.PowerToys.Settings.UI.Lib\Microsoft.PowerToys.Settings.UI.Lib.csproj", "{B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.PowerToys.Settings.UnitTest", "src\core\Microsoft.PowerToys.Settings.UnitTest\Microsoft.PowerToys.Settings.UnitTest.csproj", "{A80355C2-780D-4245-BD80-25B8DE698EE3}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "interop", "src\common\interop\interop.vcxproj", "{F055103B-F80B-4D0C-BF48-057C55620033}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common-md-flag", "src\common\common-md-flag\common-md-flag.vcxproj", "{985B3F2F-CEED-4C0A-A249-69257E719145}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "interop-tests", "src\common\interop-tests\interop-tests.csproj", "{437AD818-3F1F-4CA5-A79B-25233A157026}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Plugin.Folder", "src\modules\launcher\Plugins\Microsoft.Plugin.Folder\Microsoft.Plugin.Folder.csproj", "{787B8AA6-CA93-4C84-96FE-DF31110AD1C4}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PowerLauncher.Telemetry", "src\modules\launcher\PowerLauncher.Telemetry\PowerLauncher.Telemetry.csproj", "{08C8C05F-0362-41BC-818C-724572DF8B06}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Telemetry", "src\common\ManagedTelemetry\Telemetry\Telemetry.csproj", "{5D00D290-4016-4CFE-9E41-1E7C724509BA}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "os-detection", "src\common\os-detection\os-detection.vcxproj", "{E6410BFC-B341-498C-8C67-312C20CDD8D5}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KeyboardManagerTest", "src\modules\keyboardmanager\test\KeyboardManagerTest.vcxproj", "{62173D9A-6724-4C00-A1C8-FB646480A9EC}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ManagedCommon", "src\common\ManagedCommon\ManagedCommon.csproj", "{4AED67B6-55FD-486F-B917-E543DEE2CB3C}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Plugin.Program.UnitTests", "src\modules\launcher\Plugins\Microsoft.Plugin.Program.UnitTests\Microsoft.Plugin.Program.UnitTests.csproj", "{42851751-CBC8-45A6-97F5-7A0753F7B4D1}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x64 = Debug|x64
|
||||
@@ -95,8 +275,6 @@ Global
|
||||
{A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}.Debug|x64.Build.0 = Debug|x64
|
||||
{A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}.Release|x64.ActiveCfg = Release|x64
|
||||
{A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}.Release|x64.Build.0 = Release|x64
|
||||
{44CC9375-3E6E-4D99-8913-7FB748807EBD}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{44CC9375-3E6E-4D99-8913-7FB748807EBD}.Release|x64.ActiveCfg = Release|x64
|
||||
{07C389E3-6BC8-41CF-923E-307B1265FA2D}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{07C389E3-6BC8-41CF-923E-307B1265FA2D}.Debug|x64.Build.0 = Debug|x64
|
||||
{07C389E3-6BC8-41CF-923E-307B1265FA2D}.Release|x64.ActiveCfg = Release|x64
|
||||
@@ -113,10 +291,6 @@ Global
|
||||
{9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Debug|x64.Build.0 = Debug|x64
|
||||
{9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Release|x64.ActiveCfg = Release|x64
|
||||
{9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Release|x64.Build.0 = Release|x64
|
||||
{4E577735-DFAB-41AF-8A6E-B6E8872A2928}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{4E577735-DFAB-41AF-8A6E-B6E8872A2928}.Debug|x64.Build.0 = Debug|x64
|
||||
{4E577735-DFAB-41AF-8A6E-B6E8872A2928}.Release|x64.ActiveCfg = Release|x64
|
||||
{4E577735-DFAB-41AF-8A6E-B6E8872A2928}.Release|x64.Build.0 = Release|x64
|
||||
{1A066C63-64B3-45F8-92FE-664E1CCE8077}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{1A066C63-64B3-45F8-92FE-664E1CCE8077}.Debug|x64.Build.0 = Debug|x64
|
||||
{1A066C63-64B3-45F8-92FE-664E1CCE8077}.Release|x64.ActiveCfg = Release|x64
|
||||
@@ -145,6 +319,194 @@ Global
|
||||
{2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Debug|x64.Build.0 = Debug|x64
|
||||
{2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Release|x64.ActiveCfg = Release|x64
|
||||
{2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Release|x64.Build.0 = Release|x64
|
||||
{64A80062-4D8B-4229-8A38-DFA1D7497749}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{64A80062-4D8B-4229-8A38-DFA1D7497749}.Debug|x64.Build.0 = Debug|x64
|
||||
{64A80062-4D8B-4229-8A38-DFA1D7497749}.Release|x64.ActiveCfg = Release|x64
|
||||
{64A80062-4D8B-4229-8A38-DFA1D7497749}.Release|x64.Build.0 = Release|x64
|
||||
{0485F45C-EA7A-4BB5-804B-3E8D14699387}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{0485F45C-EA7A-4BB5-804B-3E8D14699387}.Debug|x64.Build.0 = Debug|x64
|
||||
{0485F45C-EA7A-4BB5-804B-3E8D14699387}.Release|x64.ActiveCfg = Release|x64
|
||||
{0485F45C-EA7A-4BB5-804B-3E8D14699387}.Release|x64.Build.0 = Release|x64
|
||||
{0B593A6C-4143-4337-860E-DB5710FB87DB}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{0B593A6C-4143-4337-860E-DB5710FB87DB}.Debug|x64.Build.0 = Debug|x64
|
||||
{0B593A6C-4143-4337-860E-DB5710FB87DB}.Release|x64.ActiveCfg = Release|x64
|
||||
{0B593A6C-4143-4337-860E-DB5710FB87DB}.Release|x64.Build.0 = Release|x64
|
||||
{031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Debug|x64.Build.0 = Debug|x64
|
||||
{031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Release|x64.ActiveCfg = Release|x64
|
||||
{031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Release|x64.Build.0 = Release|x64
|
||||
{89F34AF7-1C34-4A72-AA6E-534BCF972BD9}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{89F34AF7-1C34-4A72-AA6E-534BCF972BD9}.Debug|x64.Build.0 = Debug|x64
|
||||
{89F34AF7-1C34-4A72-AA6E-534BCF972BD9}.Release|x64.ActiveCfg = Release|x64
|
||||
{89F34AF7-1C34-4A72-AA6E-534BCF972BD9}.Release|x64.Build.0 = Release|x64
|
||||
{2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Debug|x64.Build.0 = Debug|x64
|
||||
{2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Release|x64.ActiveCfg = Release|x64
|
||||
{2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Release|x64.Build.0 = Release|x64
|
||||
{0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Debug|x64.Build.0 = Debug|x64
|
||||
{0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Release|x64.ActiveCfg = Release|x64
|
||||
{0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Release|x64.Build.0 = Release|x64
|
||||
{E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Debug|x64.Build.0 = Debug|x64
|
||||
{E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Release|x64.ActiveCfg = Release|x64
|
||||
{E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Release|x64.Build.0 = Release|x64
|
||||
{EAF23649-EF6E-478B-980E-81FAD96CCA2A}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{EAF23649-EF6E-478B-980E-81FAD96CCA2A}.Debug|x64.Build.0 = Debug|x64
|
||||
{EAF23649-EF6E-478B-980E-81FAD96CCA2A}.Release|x64.ActiveCfg = Release|x64
|
||||
{EAF23649-EF6E-478B-980E-81FAD96CCA2A}.Release|x64.Build.0 = Release|x64
|
||||
{D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Debug|x64.Build.0 = Debug|x64
|
||||
{D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Release|x64.ActiveCfg = Release|x64
|
||||
{D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Release|x64.Build.0 = Release|x64
|
||||
{17DA04DF-E393-4397-9CF0-84DABE11032E}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{17DA04DF-E393-4397-9CF0-84DABE11032E}.Debug|x64.Build.0 = Debug|x64
|
||||
{17DA04DF-E393-4397-9CF0-84DABE11032E}.Release|x64.ActiveCfg = Release|x64
|
||||
{17DA04DF-E393-4397-9CF0-84DABE11032E}.Release|x64.Build.0 = Release|x64
|
||||
{8AFFA899-0B73-49EC-8C50-0FADDA57B2FC}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{8AFFA899-0B73-49EC-8C50-0FADDA57B2FC}.Debug|x64.Build.0 = Debug|x64
|
||||
{8AFFA899-0B73-49EC-8C50-0FADDA57B2FC}.Release|x64.ActiveCfg = Release|x64
|
||||
{8AFFA899-0B73-49EC-8C50-0FADDA57B2FC}.Release|x64.Build.0 = Release|x64
|
||||
{DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Debug|x64.Build.0 = Debug|x64
|
||||
{DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Release|x64.ActiveCfg = Release|x64
|
||||
{DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Release|x64.Build.0 = Release|x64
|
||||
{B749F0DB-8E75-47DB-9E5E-265D16D0C0D2}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{B749F0DB-8E75-47DB-9E5E-265D16D0C0D2}.Debug|x64.Build.0 = Debug|x64
|
||||
{B749F0DB-8E75-47DB-9E5E-265D16D0C0D2}.Release|x64.ActiveCfg = Release|x64
|
||||
{B749F0DB-8E75-47DB-9E5E-265D16D0C0D2}.Release|x64.Build.0 = Release|x64
|
||||
{4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Debug|x64.Build.0 = Debug|x64
|
||||
{4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Release|x64.ActiveCfg = Release|x64
|
||||
{4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Release|x64.Build.0 = Release|x64
|
||||
{8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Debug|x64.Build.0 = Debug|x64
|
||||
{8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Release|x64.ActiveCfg = Release|x64
|
||||
{8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Release|x64.Build.0 = Release|x64
|
||||
{FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|x64.Build.0 = Debug|x64
|
||||
{FF742965-9A80-41A5-B042-D6C7D3A21708}.Release|x64.ActiveCfg = Release|x64
|
||||
{FF742965-9A80-41A5-B042-D6C7D3A21708}.Release|x64.Build.0 = Release|x64
|
||||
{59BD9891-3837-438A-958D-ADC7F91F6F7E}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{59BD9891-3837-438A-958D-ADC7F91F6F7E}.Debug|x64.Build.0 = Debug|x64
|
||||
{59BD9891-3837-438A-958D-ADC7F91F6F7E}.Release|x64.ActiveCfg = Release|x64
|
||||
{59BD9891-3837-438A-958D-ADC7F91F6F7E}.Release|x64.Build.0 = Release|x64
|
||||
{74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Debug|x64.Build.0 = Debug|x64
|
||||
{74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Release|x64.ActiveCfg = Release|x64
|
||||
{74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Release|x64.Build.0 = Release|x64
|
||||
{FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Debug|x64.Build.0 = Debug|x64
|
||||
{FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Release|x64.ActiveCfg = Release|x64
|
||||
{FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Release|x64.Build.0 = Release|x64
|
||||
{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Debug|x64.Build.0 = Debug|x64
|
||||
{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Release|x64.ActiveCfg = Release|x64
|
||||
{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Release|x64.Build.0 = Release|x64
|
||||
{F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Debug|x64.Build.0 = Debug|x64
|
||||
{F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Release|x64.ActiveCfg = Release|x64
|
||||
{F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Release|x64.Build.0 = Release|x64
|
||||
{E364F67B-BB12-4E91-B639-355866EBCD8B}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{E364F67B-BB12-4E91-B639-355866EBCD8B}.Debug|x64.Build.0 = Debug|x64
|
||||
{E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|x64.ActiveCfg = Release|x64
|
||||
{E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|x64.Build.0 = Release|x64
|
||||
{F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Debug|x64.Build.0 = Debug|x64
|
||||
{F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Release|x64.ActiveCfg = Release|x64
|
||||
{F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Release|x64.Build.0 = Release|x64
|
||||
{880ED251-9E16-4713-9A70-D35FE0C01669}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{880ED251-9E16-4713-9A70-D35FE0C01669}.Debug|x64.Build.0 = Debug|x64
|
||||
{880ED251-9E16-4713-9A70-D35FE0C01669}.Release|x64.ActiveCfg = Release|x64
|
||||
{880ED251-9E16-4713-9A70-D35FE0C01669}.Release|x64.Build.0 = Release|x64
|
||||
{AF2349B8-E5B6-4004-9502-687C1C7730B1}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{AF2349B8-E5B6-4004-9502-687C1C7730B1}.Debug|x64.Build.0 = Debug|x64
|
||||
{AF2349B8-E5B6-4004-9502-687C1C7730B1}.Release|x64.ActiveCfg = Release|x64
|
||||
{AF2349B8-E5B6-4004-9502-687C1C7730B1}.Release|x64.Build.0 = Release|x64
|
||||
{6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Debug|x64.Build.0 = Debug|x64
|
||||
{6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Release|x64.ActiveCfg = Release|x64
|
||||
{6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Release|x64.Build.0 = Release|x64
|
||||
{A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Debug|x64.Build.0 = Debug|x64
|
||||
{A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Release|x64.ActiveCfg = Release|x64
|
||||
{A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Release|x64.Build.0 = Release|x64
|
||||
{DA425894-6E13-404F-8DCB-78584EC0557A}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{DA425894-6E13-404F-8DCB-78584EC0557A}.Debug|x64.Build.0 = Debug|x64
|
||||
{DA425894-6E13-404F-8DCB-78584EC0557A}.Release|x64.ActiveCfg = Release|x64
|
||||
{DA425894-6E13-404F-8DCB-78584EC0557A}.Release|x64.Build.0 = Release|x64
|
||||
{060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Debug|x64.Build.0 = Debug|x64
|
||||
{060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Release|x64.ActiveCfg = Release|x64
|
||||
{060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Release|x64.Build.0 = Release|x64
|
||||
{748417CA-F17E-487F-9411-CAFB6D3F4877}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{748417CA-F17E-487F-9411-CAFB6D3F4877}.Debug|x64.Build.0 = Debug|x64
|
||||
{748417CA-F17E-487F-9411-CAFB6D3F4877}.Release|x64.ActiveCfg = Release|x64
|
||||
{748417CA-F17E-487F-9411-CAFB6D3F4877}.Release|x64.Build.0 = Release|x64
|
||||
{217DF501-135C-4E38-BFC8-99D4821032EA}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{217DF501-135C-4E38-BFC8-99D4821032EA}.Debug|x64.Build.0 = Debug|x64
|
||||
{217DF501-135C-4E38-BFC8-99D4821032EA}.Release|x64.ActiveCfg = Release|x64
|
||||
{217DF501-135C-4E38-BFC8-99D4821032EA}.Release|x64.Build.0 = Release|x64
|
||||
{47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Debug|x64.Build.0 = Debug|x64
|
||||
{47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Release|x64.ActiveCfg = Release|x64
|
||||
{47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Release|x64.Build.0 = Release|x64
|
||||
{E4E0D2AE-B17D-4BD4-8BEE-AFC8CC464C5F}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{E4E0D2AE-B17D-4BD4-8BEE-AFC8CC464C5F}.Debug|x64.Build.0 = Debug|x64
|
||||
{E4E0D2AE-B17D-4BD4-8BEE-AFC8CC464C5F}.Release|x64.ActiveCfg = Release|x64
|
||||
{E4E0D2AE-B17D-4BD4-8BEE-AFC8CC464C5F}.Release|x64.Build.0 = Release|x64
|
||||
{A7D5099E-F0FD-4BF3-8522-5A682759F915}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{A7D5099E-F0FD-4BF3-8522-5A682759F915}.Debug|x64.Build.0 = Debug|x64
|
||||
{A7D5099E-F0FD-4BF3-8522-5A682759F915}.Release|x64.ActiveCfg = Release|x64
|
||||
{A7D5099E-F0FD-4BF3-8522-5A682759F915}.Release|x64.Build.0 = Release|x64
|
||||
{B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A}.Debug|x64.Build.0 = Debug|x64
|
||||
{B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A}.Release|x64.ActiveCfg = Release|x64
|
||||
{B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A}.Release|x64.Build.0 = Release|x64
|
||||
{A80355C2-780D-4245-BD80-25B8DE698EE3}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{A80355C2-780D-4245-BD80-25B8DE698EE3}.Debug|x64.Build.0 = Debug|x64
|
||||
{A80355C2-780D-4245-BD80-25B8DE698EE3}.Release|x64.ActiveCfg = Release|x64
|
||||
{A80355C2-780D-4245-BD80-25B8DE698EE3}.Release|x64.Build.0 = Release|x64
|
||||
{F055103B-F80B-4D0C-BF48-057C55620033}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{F055103B-F80B-4D0C-BF48-057C55620033}.Debug|x64.Build.0 = Debug|x64
|
||||
{F055103B-F80B-4D0C-BF48-057C55620033}.Release|x64.ActiveCfg = Release|x64
|
||||
{F055103B-F80B-4D0C-BF48-057C55620033}.Release|x64.Build.0 = Release|x64
|
||||
{985B3F2F-CEED-4C0A-A249-69257E719145}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{985B3F2F-CEED-4C0A-A249-69257E719145}.Debug|x64.Build.0 = Debug|x64
|
||||
{985B3F2F-CEED-4C0A-A249-69257E719145}.Release|x64.ActiveCfg = Release|x64
|
||||
{985B3F2F-CEED-4C0A-A249-69257E719145}.Release|x64.Build.0 = Release|x64
|
||||
{437AD818-3F1F-4CA5-A79B-25233A157026}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{437AD818-3F1F-4CA5-A79B-25233A157026}.Debug|x64.Build.0 = Debug|x64
|
||||
{437AD818-3F1F-4CA5-A79B-25233A157026}.Release|x64.ActiveCfg = Release|x64
|
||||
{437AD818-3F1F-4CA5-A79B-25233A157026}.Release|x64.Build.0 = Release|x64
|
||||
{787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Debug|x64.Build.0 = Debug|x64
|
||||
{787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Release|x64.ActiveCfg = Release|x64
|
||||
{787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Release|x64.Build.0 = Release|x64
|
||||
{08C8C05F-0362-41BC-818C-724572DF8B06}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{08C8C05F-0362-41BC-818C-724572DF8B06}.Debug|x64.Build.0 = Debug|x64
|
||||
{08C8C05F-0362-41BC-818C-724572DF8B06}.Release|x64.ActiveCfg = Release|x64
|
||||
{08C8C05F-0362-41BC-818C-724572DF8B06}.Release|x64.Build.0 = Release|x64
|
||||
{5D00D290-4016-4CFE-9E41-1E7C724509BA}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{5D00D290-4016-4CFE-9E41-1E7C724509BA}.Debug|x64.Build.0 = Debug|x64
|
||||
{5D00D290-4016-4CFE-9E41-1E7C724509BA}.Release|x64.ActiveCfg = Release|x64
|
||||
{5D00D290-4016-4CFE-9E41-1E7C724509BA}.Release|x64.Build.0 = Release|x64
|
||||
{E6410BFC-B341-498C-8C67-312C20CDD8D5}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{E6410BFC-B341-498C-8C67-312C20CDD8D5}.Debug|x64.Build.0 = Debug|x64
|
||||
{E6410BFC-B341-498C-8C67-312C20CDD8D5}.Release|x64.ActiveCfg = Release|x64
|
||||
{E6410BFC-B341-498C-8C67-312C20CDD8D5}.Release|x64.Build.0 = Release|x64
|
||||
{62173D9A-6724-4C00-A1C8-FB646480A9EC}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{62173D9A-6724-4C00-A1C8-FB646480A9EC}.Debug|x64.Build.0 = Debug|x64
|
||||
{62173D9A-6724-4C00-A1C8-FB646480A9EC}.Release|x64.ActiveCfg = Release|x64
|
||||
{62173D9A-6724-4C00-A1C8-FB646480A9EC}.Release|x64.Build.0 = Release|x64
|
||||
{4AED67B6-55FD-486F-B917-E543DEE2CB3C}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{4AED67B6-55FD-486F-B917-E543DEE2CB3C}.Debug|x64.Build.0 = Debug|x64
|
||||
{4AED67B6-55FD-486F-B917-E543DEE2CB3C}.Release|x64.ActiveCfg = Release|x64
|
||||
{4AED67B6-55FD-486F-B917-E543DEE2CB3C}.Release|x64.Build.0 = Release|x64
|
||||
{42851751-CBC8-45A6-97F5-7A0753F7B4D1}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{42851751-CBC8-45A6-97F5-7A0753F7B4D1}.Debug|x64.Build.0 = Debug|x64
|
||||
{42851751-CBC8-45A6-97F5-7A0753F7B4D1}.Release|x64.ActiveCfg = Release|x64
|
||||
{42851751-CBC8-45A6-97F5-7A0753F7B4D1}.Release|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
@@ -152,13 +514,11 @@ Global
|
||||
GlobalSection(NestedProjects) = preSolution
|
||||
{74485049-C722-400F-ABE5-86AC52D929B3} = {1AFB6476-670D-4E80-A464-657E01DFF482}
|
||||
{A46629C4-1A6C-40FA-A8B6-10E5102BB0BA} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC}
|
||||
{44CC9375-3E6E-4D99-8913-7FB748807EBD} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC}
|
||||
{3BB8493E-D18E-4485-A320-CB40F90F55AE} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC}
|
||||
{D1D6BC88-09AE-4FB4-AD24-5DED46A791DD} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC}
|
||||
{F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD}
|
||||
{48804216-2A0E-4168-A6D8-9CD068D14227} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD}
|
||||
{9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD}
|
||||
{4E577735-DFAB-41AF-8A6E-B6E8872A2928} = {1FAF749F-0D6F-4BF5-A563-31A4B5279D27}
|
||||
{1A066C63-64B3-45F8-92FE-664E1CCE8077} = {1AFB6476-670D-4E80-A464-657E01DFF482}
|
||||
{5CCC8468-DEC8-4D36-99D4-5C891BEBD481} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD}
|
||||
{89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC}
|
||||
@@ -167,6 +527,57 @@ Global
|
||||
{0E072714-D127-460B-AFAD-B4C40B412798} = {89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3}
|
||||
{A3935CF4-46C5-4A88-84D3-6B12E16E6BA2} = {89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3}
|
||||
{2151F984-E006-4A9F-92EF-C6DDE3DC8413} = {89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3}
|
||||
{64A80062-4D8B-4229-8A38-DFA1D7497749} = {BEEAB7F2-FFF6-45AB-9CDB-B04CC0734B88}
|
||||
{0485F45C-EA7A-4BB5-804B-3E8D14699387} = {89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3}
|
||||
{0B593A6C-4143-4337-860E-DB5710FB87DB} = {1AFB6476-670D-4E80-A464-657E01DFF482}
|
||||
{031AC72E-FA28-4AB7-B690-6F7B9C28AA73} = {1AFB6476-670D-4E80-A464-657E01DFF482}
|
||||
{89F34AF7-1C34-4A72-AA6E-534BCF972BD9} = {38BDB927-829B-4C65-9CD9-93FB05D66D65}
|
||||
{6C7F47CC-2151-44A3-A546-41C70025132C} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC}
|
||||
{2BE46397-4DFA-414C-9BD4-41E4BBF8CB34} = {6C7F47CC-2151-44A3-A546-41C70025132C}
|
||||
{0B43679E-EDFA-4DA0-AD30-F4628B308B1B} = {6C7F47CC-2151-44A3-A546-41C70025132C}
|
||||
{E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8} = {6C7F47CC-2151-44A3-A546-41C70025132C}
|
||||
{EAF23649-EF6E-478B-980E-81FAD96CCA2A} = {38BDB927-829B-4C65-9CD9-93FB05D66D65}
|
||||
{17DA04DF-E393-4397-9CF0-84DABE11032E} = {1AFB6476-670D-4E80-A464-657E01DFF482}
|
||||
{38BDB927-829B-4C65-9CD9-93FB05D66D65} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC}
|
||||
{8AFFA899-0B73-49EC-8C50-0FADDA57B2FC} = {38BDB927-829B-4C65-9CD9-93FB05D66D65}
|
||||
{C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC}
|
||||
{DB90F671-D861-46BB-93A3-F1304F5BA1C5} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68}
|
||||
{B749F0DB-8E75-47DB-9E5E-265D16D0C0D2} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68}
|
||||
{4FD29318-A8AB-4D8F-AA47-60BC241B8DA3} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68}
|
||||
{8451ECDD-2EA4-4966-BB0A-7BBC40138E80} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68}
|
||||
{FF742965-9A80-41A5-B042-D6C7D3A21708} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68}
|
||||
{4AFC9975-2456-4C70-94A4-84073C1CED93} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68}
|
||||
{59BD9891-3837-438A-958D-ADC7F91F6F7E} = {4AFC9975-2456-4C70-94A4-84073C1CED93}
|
||||
{74F1B9ED-F59C-4FE7-B473-7B453E30837E} = {4AFC9975-2456-4C70-94A4-84073C1CED93}
|
||||
{FDB3555B-58EF-4AE6-B5F1-904719637AB4} = {4AFC9975-2456-4C70-94A4-84073C1CED93}
|
||||
{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0} = {4AFC9975-2456-4C70-94A4-84073C1CED93}
|
||||
{F8B870EB-D5F5-45BA-9CF7-A5C459818820} = {4AFC9975-2456-4C70-94A4-84073C1CED93}
|
||||
{E364F67B-BB12-4E91-B639-355866EBCD8B} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68}
|
||||
{F97E5003-F263-4D4A-A964-0F1F3C82DEF2} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68}
|
||||
{880ED251-9E16-4713-9A70-D35FE0C01669} = {E775CC2C-24CB-48D6-9C3A-BE4CCE0DB17A}
|
||||
{2F305555-C296-497E-AC20-5FA1B237996A} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC}
|
||||
{AF2349B8-E5B6-4004-9502-687C1C7730B1} = {2F305555-C296-497E-AC20-5FA1B237996A}
|
||||
{6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB} = {2F305555-C296-497E-AC20-5FA1B237996A}
|
||||
{A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A} = {2F305555-C296-497E-AC20-5FA1B237996A}
|
||||
{DA425894-6E13-404F-8DCB-78584EC0557A} = {2F305555-C296-497E-AC20-5FA1B237996A}
|
||||
{060D75DA-2D1C-48E6-A4A1-6F0718B64661} = {2F305555-C296-497E-AC20-5FA1B237996A}
|
||||
{748417CA-F17E-487F-9411-CAFB6D3F4877} = {2F305555-C296-497E-AC20-5FA1B237996A}
|
||||
{217DF501-135C-4E38-BFC8-99D4821032EA} = {2F305555-C296-497E-AC20-5FA1B237996A}
|
||||
{47310AB4-9034-4BD1-8D8B-E88AD21A171B} = {2F305555-C296-497E-AC20-5FA1B237996A}
|
||||
{E4E0D2AE-B17D-4BD4-8BEE-AFC8CC464C5F} = {C3081D9A-1586-441A-B5F4-ED815B3719C1}
|
||||
{A7D5099E-F0FD-4BF3-8522-5A682759F915} = {C3081D9A-1586-441A-B5F4-ED815B3719C1}
|
||||
{B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A} = {C3081D9A-1586-441A-B5F4-ED815B3719C1}
|
||||
{A80355C2-780D-4245-BD80-25B8DE698EE3} = {C3081D9A-1586-441A-B5F4-ED815B3719C1}
|
||||
{F055103B-F80B-4D0C-BF48-057C55620033} = {1AFB6476-670D-4E80-A464-657E01DFF482}
|
||||
{985B3F2F-CEED-4C0A-A249-69257E719145} = {1AFB6476-670D-4E80-A464-657E01DFF482}
|
||||
{437AD818-3F1F-4CA5-A79B-25233A157026} = {1AFB6476-670D-4E80-A464-657E01DFF482}
|
||||
{787B8AA6-CA93-4C84-96FE-DF31110AD1C4} = {4AFC9975-2456-4C70-94A4-84073C1CED93}
|
||||
{08C8C05F-0362-41BC-818C-724572DF8B06} = {C140A3EF-6DBF-4084-9D4C-4EB5A99FEE68}
|
||||
{5D00D290-4016-4CFE-9E41-1E7C724509BA} = {1AFB6476-670D-4E80-A464-657E01DFF482}
|
||||
{E6410BFC-B341-498C-8C67-312C20CDD8D5} = {1AFB6476-670D-4E80-A464-657E01DFF482}
|
||||
{62173D9A-6724-4C00-A1C8-FB646480A9EC} = {38BDB927-829B-4C65-9CD9-93FB05D66D65}
|
||||
{4AED67B6-55FD-486F-B917-E543DEE2CB3C} = {1AFB6476-670D-4E80-A464-657E01DFF482}
|
||||
{42851751-CBC8-45A6-97F5-7A0753F7B4D1} = {4AFC9975-2456-4C70-94A4-84073C1CED93}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {C3A2F9D1-7930-4EF4-A6FC-7EE0A99821D0}
|
||||
|
||||
228
README.md
@@ -1,136 +1,182 @@
|
||||
# Overview
|
||||
|
||||
PowerToys is a set of utilities for power users to tune and streamline their Windows experience for greater productivity.
|
||||
<img src="./doc/images/overview/PT%20hero%20image.png"/>
|
||||
|
||||
Inspired by the [Windows 95 era PowerToys project](https://en.wikipedia.org/wiki/Microsoft_PowerToys), this reboot provides power users with ways to squeeze more efficiency out of the Windows 10 shell and customize it for individual workflows. A great overview of the Windows 95 PowerToys can be found [here](https://socket3.wordpress.com/2016/10/22/using-windows-95-powertoys/).
|
||||
Microsoft PowerToys is a set of utilities for power users to tune and streamline their Windows experience for greater productivity. Inspired by the [Windows 95 era PowerToys project](https://en.wikipedia.org/wiki/Microsoft_PowerToys), this reboot provides power users with ways to squeeze more efficiency out of the Windows 10 shell and customize it for individual workflows. A great overview of the Windows 95 PowerToys can be found [here](https://socket3.wordpress.com/2016/10/22/using-windows-95-powertoys/).
|
||||
|
||||

|
||||
[What's Happening](#whats-happening) | [Downloading & Release notes][github-release-link] | [Contributing to PowerToys](#contributing) | [Known issues](#known-issues)
|
||||
|
||||
## Installation
|
||||
## Build status
|
||||
|
||||
_(Note: in order to run PowerToys, you'll need to be running at least Windows build 17134 or higher. Also, PowerToys does not currently support Windows ARM machines)_
|
||||
[](https://dev.azure.com/ms/PowerToys/_build?definitionId=219)
|
||||
|
||||
### GitHub
|
||||
## Current PowerToy Utilities
|
||||
|
||||
The first preview of these utilities can be installed from the [PowerToys GitHub releases page](https://github.com/Microsoft/powertoys/releases).
|
||||
### FancyZones
|
||||
|
||||
### Chocolatey (Unofficial)
|
||||
[<img align="left" src="./doc/images/overview/FancyZones_small.png" />](https://aka.ms/PowerToysOverview_FancyZones) [FancyZones](https://aka.ms/PowerToysOverview_FancyZones) is a window manager that makes it easy to create complex window layouts and quickly position windows into those layouts.
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
Download and upgrade PowerToys from [Chocolatey](https://chocolatey.org).
|
||||
### File Explorer Add-ons (Preview Panes)
|
||||
|
||||
[<img align="left" src="./doc/images/overview/PowerPreview_small.PNG" />](https://aka.ms/PowerToysOverview_FileExplorerAddOns) [File Explorer](https://aka.ms/PowerToysOverview_FileExplorerAddOns) add-ons right now are just limited to Preview Pane additions for File Explorer. Preview Pane is an existing feature in the File Explorer. To enable it, you just click the View tab in the ribbon and then click "Preview Pane".
|
||||
|
||||
PowerToys will now enable two types of files to be previewed: Markdown (.md) & SVG (.svg)
|
||||
<br>
|
||||
<br>
|
||||
|
||||
### Image Resizer
|
||||
|
||||
[<img align="left" src="./doc/images/overview/ImageResizer_small.png" />](https://aka.ms/PowerToysOverview_ImageResizer) [Image Resizer](https://aka.ms/PowerToysOverview_ImageResizer) is a Windows Shell Extension for quickly resizing images. With a simple right click from File Explorer, resize one or many images instantly. This code is based on [Brice Lambson's Image Resizer](https://github.com/bricelam/ImageResizer).
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
### Keyboard Manager
|
||||
|
||||
[<img align="left" src="./doc/images/overview/KBM_small.png" />](https://aka.ms/PowerToysOverview_KeyboardManager) [Keyboard Manager](https://aka.ms/PowerToysOverview_KeyboardManager) allows you to customize the keyboard to be more productive by remapping keys and creating your own keyboard shortcuts. This PowerToy requires Windows 10 1903 (build 18362) or later.
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
### PowerRename
|
||||
|
||||
[<img align="left" src="./doc/images/overview/PowerRename_small.PNG" />](https://aka.ms/PowerToysOverview_PowerRename) [PowerRename](https://aka.ms/PowerToysOverview_PowerRename) is a Windows Shell Extension for advanced bulk renaming using search and replace or regular expressions. PowerRename allows simple search and replace or more advanced regular expression matching. While you type in the search and replace input fields, the preview area will show what the items will be renamed to. PowerRename then calls into the Windows Explorer file operations engine to perform the rename. This has the benefit of allowing the rename operation to be undone after PowerRename exits. This code is based on [Chris Davis's SmartRename](https://github.com/chrdavis/SmartRename).
|
||||
<br>
|
||||
|
||||
### PowerToys Run
|
||||
|
||||
[<img align="left" src="./doc/images/overview/PowerLauncher_small.png" />](https://aka.ms/PowerToysOverview_PowerToysRun) [PowerToys Run](https://aka.ms/PowerToysOverview_PowerToysRun) is a new toy in PowerToys that can help you search and launch your app instantly with a simple alt-space and start typing! It is open source and modular for additional plugins. Window Walker is now inside too! This PowerToy requires Windows 10 1903 (build 18362) or later.
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
### Shortcut Guide
|
||||
|
||||
[<img align="left" src="./doc/images/overview/Shortcut guide_small.png" />](https://aka.ms/PowerToysOverview_ShortcutGuide) [Windows key shortcut guide](https://aka.ms/PowerToysOverview_ShortcutGuide) appears when a user holds the Windows key down for more than one second and shows the available shortcuts for the current state of the desktop.
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
## Installing and running Microsoft PowerToys
|
||||
|
||||
**Requirements**
|
||||
- Windows 10 1803 (build 17134) or later.
|
||||
- Have [.NET Core 3.1 Desktop Runtime](https://dotnet.microsoft.com/download/dotnet-core/thank-you/runtime-desktop-3.1.4-windows-x64-installer). The installer will prompt this but we want to directly make people aware.
|
||||
|
||||
### Via GitHub with MSI [Recommended]
|
||||
|
||||
Install from the [Microsoft PowerToys GitHub releases page][github-release-link]. Click on `Assets` to show the files available in the release and then click on `PowerToysSetup-0.19.0-x64.msi` to download the PowerToys installer.
|
||||
|
||||
**Note:** After installing, you will have to start PowerToys for the first time. We will improve install experience this moving forward but due to a possible install dependency, we can't start after install currently.
|
||||
|
||||
This is our preferred method.
|
||||
|
||||
### Via WinGet (Preview)
|
||||
Download PowerToys from [WinGet](https://github.com/microsoft/winget-cli/releases). To install PowerToys, run the following command from the command line / PowerShell:
|
||||
|
||||
```powershell
|
||||
WinGet install powertoys
|
||||
```
|
||||
|
||||
### Other install methods
|
||||
|
||||
#### Via Chocolatey (Unofficial)
|
||||
|
||||
Download and upgrade PowerToys from [Chocolatey](https://chocolatey.org). If you have any issues when installing/upgrading the package please go to the [package page](https://chocolatey.org/packages/powertoys) and follow the [Chocolatey triage process](https://chocolatey.org/docs/package-triage-process)
|
||||
|
||||
To install PowerToys, run the following command from the command line / PowerShell:
|
||||
|
||||
To install PowerToys, run the following command from the command line or from PowerShell:
|
||||
```powershell
|
||||
choco install powertoys
|
||||
```
|
||||
|
||||
To upgrade PowerToys, run the following command from the command line or from PowerShell:
|
||||
To upgrade PowerToys, run the following command from the command line / PowerShell:
|
||||
|
||||
```powershell
|
||||
choco upgrade powertoys
|
||||
```
|
||||
|
||||
If you have any issues when installing/upgrading the package please go to the [package page](https://chocolatey.org/packages/powertoys) and follow the [Chocolatey triage process](https://chocolatey.org/docs/package-triage-process)
|
||||
### Known issues
|
||||
|
||||
### Build Status
|
||||
- PT Run, Newly installed apps can't be found [#3553](https://github.com/microsoft/PowerToys/issues/3553). We will address this in 0.20.
|
||||
- PT Run, CPU / Memory, still investigating [#3208](https://github.com/microsoft/PowerToys/issues/3208). We have 2 leads and fixed one item.
|
||||
- WinKey remapping for PT Run can be quirky [#4578](https://github.com/microsoft/PowerToys/issues/4578)
|
||||
|
||||
[](https://dev.azure.com/ms/PowerToys/_build?definitionId=35096)
|
||||
### Processor support
|
||||
|
||||
# What's Happening
|
||||
We currently support the matrix below.
|
||||
|
||||
## October Update
|
||||
A big thanks to everyone who has downloaded and started using the first PowerToys preview. There's been over 150K downloads so far. An even bigger thanks to everyone who has provided feedback and suggestions in the issues. The community engagement has been really awesome to see.
|
||||
| x64 | x86 | ARM |
|
||||
|:---:|:---:|:---:|
|
||||
| [Supported][github-release-link] | [Issue #602](https://github.com/microsoft/PowerToys/issues/602) | [Issue #490](https://github.com/microsoft/PowerToys/issues/490) |
|
||||
|
||||
The team has been hard at working fixing bugs, addressing issues and implementing feature suggestions. If you've downloaded the code and built the latest on your machine recently you've seen many of these improvements (dark mode!). We're hoping to have a new official build out shortly with all these improvements and will also be signed by Microsoft. A new utility is also coming soon: Chris Davis is working to integrate his [SmartRename tool](https://github.com/chrdavis/SmartRename) into PowerToys!
|
||||
## What's Happening
|
||||
|
||||

|
||||
### June 2020 Update
|
||||
|
||||
1. [FancyZones](/src/modules/fancyzones/) - FancyZones is a window manager that makes it easy to create complex window layouts and quickly position windows into those layouts. The FancyZones backlog can be found [here](https://github.com/Microsoft/PowerToys/tree/master/doc/planning/FancyZonesBacklog.md)
|
||||
Our goals for 0.19 release cycle had one big goal, add in stability / quality fixes. We've addressed over 100 issues across all our utilities. We've improved our installer experience and parts will start coming online in 0.19 and 0.20. In this release, it will be the last time during upgrade you'll see Windows Explorer flash on you. For 0.20, the .NET Core install experience much smoother.
|
||||
|
||||

|
||||
We'd also stress feedback is critical. We know there are areas for improvement on PowerToys Run. We would love feedback so we can improve. We also would love to know if you want us to be more aggressive on auto-upgrading.
|
||||
|
||||
FancyZones Video Tutorial
|
||||
[](https://www.youtube.com/watch?v=rTtGzZYAXgY)
|
||||
Lastly, we'd like to thank everyone who filed a bug, gave feedback or made a pull-request. The PowerToys team is extremely grateful to have the support of an amazing active community.
|
||||
|
||||
2. [Windows key shortcut guide](/src/modules/shortcut_guide) - The shortcut guide appears when a user holds the Windows key down for more than one second and shows the available shortcuts for the current state of the desktop. The shortcut guide backlog can be found [here](https://github.com/Microsoft/PowerToys/tree/master/doc/planning/ShortcutGuideBacklog.md)
|
||||
- We shipped [v0.19][github-release-link]!
|
||||
- Big push for PowerToys Run search quality fixes
|
||||
- PowerToys Run can now remap to any key shortcut (minus restricted ones such as WinKey+L)
|
||||
- Improved FancyZones on Virtual Desktops and multi-thread design
|
||||
- Installer after 0.19 will no longer restart Windows Explorer
|
||||
- Fixed [#2012 - Uninstalling with old control panel fails](https://github.com/microsoft/PowerToys/issues/2012)
|
||||
- Fixed [#3384 - PowerToys Settings window is empty](https://github.com/microsoft/PowerToys/issues/3384)
|
||||
- Over 100 bug fixes!
|
||||
|
||||

|
||||
For [0.20](https://github.com/microsoft/PowerToys/issues?q=is%3Aopen+is%3Aissue+project%3Amicrosoft%2FPowerToys%2F6), we are proactively working on:
|
||||
|
||||
Additional utilities in the pipeline are:
|
||||
- Stability
|
||||
- Start work on FZ Editor V2
|
||||
- Start work on OOBE improvements
|
||||
- Keyboard manager improvements
|
||||
|
||||
* Maximize to new desktop widget - The MTND widget shows a pop-up button when a user hovers over the maximize / restore button on any window. Clicking it creates a new desktop, sends the app to that desktop and maximizes the app on the new desktop.
|
||||
* [Process terminate tool](https://github.com/indierawk2k2/PowerToys-1/blob/master/specs/Terminate%20Spec.md)
|
||||
* [Animated gif screen recorder](https://github.com/indierawk2k2/PowerToys-1/blob/master/specs/GIF%20Maker%20Spec.md)
|
||||
### Version 1.0 plan
|
||||
|
||||
# Backlog
|
||||
Our plan for all the [goals and utilities for v1.0 detailed over here in the wiki][v1].
|
||||
|
||||
The full backlog of utilities can be found [here](https://github.com/Microsoft/PowerToys/tree/master/doc/planning/PowerToysBacklog.md)
|
||||
## Developer Guidance
|
||||
|
||||
# Where to download PowerToys
|
||||
Please read the [developer docs](/doc/devdocs) for a detailed breakdown.
|
||||
|
||||
The latest release of PowerToys can be downloaded from https://github.com/microsoft/PowerToys/releases <br />
|
||||
Click on `Assets` to show the files available in the release and then click on `PowerToysSetup.msi` to download the PowerToys installer. <br />
|
||||
PDB symbols for the release are available in a separate zip file `PDB symbols.zip`.
|
||||
## Contributing
|
||||
|
||||
# Developer Guidance
|
||||
|
||||
## Build Prerequisites
|
||||
* Windows 10 1803 (build 10.0.17134.0) or above to build and run PowerToys.
|
||||
* Visual Studio 2019 Community edition or higher, with the 'Desktop Development with C++' component and the Windows 10 SDK version 10.0.18362.0 or higher.
|
||||
|
||||
## Building the Code
|
||||
* Open `powertoys.sln` in Visual Studio, in the `Solutions Configuration` drop-down menu select `Release` or `Debug`, from the `Build` menu choose `Build Solution`.
|
||||
* The PowerToys binaries will be in your repo under `x64\Release`.
|
||||
* If you want to copy the `PowerToys.exe` binary to a different location, you'll also need to copy the `modules` and the `svgs` folders.
|
||||
|
||||
## Prerequisites to Build the Installer
|
||||
* Install the [WiX Toolset Visual Studio 2019 Extension](https://marketplace.visualstudio.com/items?itemName=RobMensching.WiXToolset).
|
||||
* Install the [WiX Toolset build tools](https://wixtoolset.org/releases/).
|
||||
|
||||
## Building the .msi Installer
|
||||
* From the `installer` folder open `PowerToysSetup.sln` in Visual Studio, in the `Solutions Configuration` drop-down menu select `Release` or `Debug`, from the `Build` menu choose `Build Solution`.
|
||||
* The resulting `PowerToysSetup.msi` installer will be available in the `installer\PowerToysSetup\x64\Release\` folder.
|
||||
|
||||
## Debugging
|
||||
The following configuration issue only applies if the user is a member of the Administrators group.
|
||||
|
||||
Some PowerToys modules require being run with the highest permission level if the current user is a member of the Administrators group. The highest permission level is required to be able to perform some actions when an elevated application (e.g. Task Manager) is in the foreground or is the target of an action. Without elevated privileges some PowerToys modules will still work but with some limitations:
|
||||
- the `FancyZones` module will be not be able to move an elevated window to a zone.
|
||||
- the `Shortcut Guide` module will not appear if the foreground window belongs to an elevated application.
|
||||
|
||||
To run and debug PowerToys from Visual Studio when the user is a member of the Administrators group, Visual Studio has to be started with elevated privileges. If you want to avoid running Visual Studio with elevated privileges and don't mind the limitations described above, you can do the following: open the `runner` project properties and navigate to the `Linker -> Manifest File` settings, edit the `UAC Execution Level` property and change it from `highestAvailable (/level='highestAvailable')` to `asInvoker (/level='asInvoker')`, save the changes.
|
||||
|
||||
## How to create new PowerToys
|
||||
|
||||
See the instructions on [how to install the PowerToys Module project template](tools/project_template). <br />
|
||||
Specifications for the [PowerToys settings API](doc/specs/PowerToys-settings.md).
|
||||
|
||||
## Coding Guidance
|
||||
|
||||
Please review these brief docs below relating to our coding standards etc.
|
||||
|
||||
> 👉 If you find something missing from these docs, feel free to contribute to any of our documentation files anywhere in the repository (or make some new ones\!)
|
||||
|
||||
This is a work in progress as we learn what we'll need to provide people in order to be effective contributors to our project.
|
||||
- [Coding Style](doc/coding/style.md)
|
||||
- [Code Organization](doc/coding/organization.md)
|
||||
|
||||
# Contributing
|
||||
This project welcomes contributions and suggestions and we are excited to work with the power user community to build a set of tools for helping you get the most out of Windows.
|
||||
This project welcomes contributions of all types. Help spec'ing, design, documentation, finding bugs are ways everyone can help on top of coding features / bug fixes. We are excited to work with the power user community to build a set of tools for helping you get the most out of Windows.
|
||||
|
||||
We ask that **before you start work on a feature that you would like to contribute**, please read our [Contributor's Guide](contributing.md). We will be happy to work with you to figure out the best approach, provide guidance and mentorship throughout feature development, and help avoid any wasted or duplicate effort.
|
||||
|
||||
> ⚠ **Note**: PowerToys is still a nascent project and the team is actively working out of this repository. We will be periodically re-structuring the code to make it easier to comprehend, navigate, build, test, and contribute to, so **DO expect significant changes to code layout on a regular basis**.
|
||||
### ⚠ State of code ⚠
|
||||
|
||||
> ⚠ **License Info**: Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com.
|
||||
PowerToys is still a very fluidic project and the team is actively working out of this repository. We will be periodically re-structuring/refactoring the code to make it easier to comprehend, navigate, build, test, and contribute to, so **DO expect significant changes to code layout on a regular basis**.
|
||||
|
||||
When you submit a pull request, a CLA-bot will automatically determine whether you need to provide
|
||||
a CLA and decorate the PR appropriately (e.g. status check, comment). Simply follow the instructions
|
||||
provided by the bot. You will only need to do this once across all repos using our CLA.
|
||||
### License Info
|
||||
|
||||
# Code of Conduct
|
||||
Most contributions require you to agree to a [Contributor License Agreement (CLA)][oss-CLA] declaring that you have the right to, and actually do, grant us the rights to use your contribution.
|
||||
|
||||
This project has adopted the [Microsoft Open Source Code of Conduct][conduct-code]. <br />
|
||||
For more information see the [Code of Conduct FAQ][conduct-FAQ] or contact [opencode@microsoft.com][conduct-email] with any additional questions or comments.
|
||||
## Code of Conduct
|
||||
|
||||
[conduct-code]: https://opensource.microsoft.com/codeofconduct/
|
||||
[conduct-FAQ]: https://opensource.microsoft.com/codeofconduct/faq/
|
||||
[conduct-email]: mailto:opencode@microsoft.com
|
||||
This project has adopted the [Microsoft Open Source Code of Conduct][oss-conduct-code].
|
||||
|
||||
## Privacy Statement
|
||||
|
||||
The application logs basic telemetry. Our Telemetry Data page (Coming Soon) has the trends from the telemetry. Please read the [Microsoft privacy statement][privacyLink] for more information.
|
||||
|
||||
[oss-CLA]: https://cla.opensource.microsoft.com
|
||||
[oss-conduct-code]: CODE_OF_CONDUCT.md
|
||||
[github-release-link]: https://github.com/microsoft/PowerToys/releases/
|
||||
[v1]: https://github.com/microsoft/PowerToys/wiki/Version-1.0-Strategy
|
||||
[privacyLink]: http://go.microsoft.com/fwlink/?LinkId=521839
|
||||
|
||||
|
Before Width: | Height: | Size: 273 KiB |
53
codeAnalysis/format_sources.ps1
Normal file
@@ -0,0 +1,53 @@
|
||||
param (
|
||||
[switch]$all = $false
|
||||
)
|
||||
|
||||
if(!(Get-Command "git" -ErrorAction SilentlyContinue)) {
|
||||
throw "You need to have a git in path to be able to format only the dirty files!"
|
||||
}
|
||||
|
||||
$clangFormat = "clang-format.exe"
|
||||
if(!(Get-Command $clangFormat -ErrorAction SilentlyContinue)) {
|
||||
Write-Information "Can't find clang-format.exe in %PATH%, trying to use %VCINSTALLDIR%..."
|
||||
$clangFormat="$env:VCINSTALLDIR\Tools\Llvm\bin\clang-format.exe"
|
||||
if(!(Test-Path -Path $clangFormat -PathType leaf)) {
|
||||
throw "Can't find clang-format.exe executable. Make sure you either have it in %PATH% or run this script from vcvars.bat!"
|
||||
}
|
||||
}
|
||||
|
||||
$sourceExtensions = New-Object System.Collections.Generic.HashSet[string]
|
||||
$sourceExtensions.Add(".cpp") | Out-Null
|
||||
$sourceExtensions.Add(".h") | Out-Null
|
||||
|
||||
function Get-Dirty-Files-From-Git() {
|
||||
$repo_root = & git rev-parse --show-toplevel
|
||||
|
||||
$staged = & git diff --name-only --diff-filter=d --cached | % { $repo_root + "/" + $_ }
|
||||
$unstaged = & git ls-files -m
|
||||
$untracked = & git ls-files --others --exclude-standard
|
||||
$result = New-Object System.Collections.Generic.List[string]
|
||||
$staged, $unstaged, $untracked | % {
|
||||
$_.Split(" ") |
|
||||
where {$sourceExtensions.Contains((Get-Item $_).Extension)} |
|
||||
foreach {$result.Add($_)}
|
||||
}
|
||||
return $result
|
||||
}
|
||||
|
||||
if($all) {
|
||||
$filesToFormat =
|
||||
Get-ChildItem -Recurse -File ..\src |
|
||||
Resolve-Path -Relative |
|
||||
where { (Get-Item $_).Directory -notmatch "(Generated Files)|node_modules" -And
|
||||
$sourceExtensions.Contains((Get-Item $_).Extension)}
|
||||
}
|
||||
else {
|
||||
$filesToFormat = Get-Dirty-Files-From-Git
|
||||
}
|
||||
|
||||
$filesToFormat | % {
|
||||
Write-Host "Formatting $_"
|
||||
& $clangFormat -i -style=file -fallback-style=none $_ 2>&1
|
||||
}
|
||||
|
||||
Write-Host "Done!"
|
||||
47
community.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# Community
|
||||
|
||||
The PowerToys team is extremely grateful to have the support of an amazing active community. The work you do is incredibly important. PowerToys wouldn’t be near what it is without your help filing bugs, updating documentation, guiding the design, or writing features. We want to say thanks and to recognize your work. This is a living document dedicated to highlighting the high impact community members and their contributions.
|
||||
|
||||
Names are in alphabetical order based on first name.
|
||||
|
||||
## High impact community members
|
||||
|
||||
### [@Niels9001](https://github.com/niels9001/) - [Niels Laute](https://nielslaute.com/)
|
||||
|
||||
Niels has helped drive large sums of our update toward a new [consistent and modern UX](https://github.com/microsoft/PowerToys/issues/891). This includes the [launcher work](https://github.com/microsoft/PowerToys/issues/44) and [icon design](https://github.com/microsoft/PowerToys/issues/1118).
|
||||
|
||||
### [@riverar](https://github.com/riverar) - [Rafael Rivera](https://withinrafael.com/)
|
||||
|
||||
Rafael has helped do the [upgrade from CppWinRT 1.x to 2.0](https://github.com/microsoft/PowerToys/issues/1907). He directly provided feedback to the CppWinRT team for bugs from this migration as well.
|
||||
|
||||
## Open source projects
|
||||
|
||||
As PowerToys creates new utilities, some will be based off existing technology. We'll continue to do our best to contribute back to these projects but their efforts were the base of some of our projects. We want to be sure their work is directly recognized.
|
||||
|
||||
### [@jjw24](https://github.com/jjw24/) - Jeremy Wu
|
||||
|
||||
Their fork of Wox was the base of PowerToys Run.
|
||||
|
||||
### [WoX Launcher](https://github.com/Wox-launcher/Wox/)
|
||||
|
||||
Initial base of jjw24's fork, which makes it the base of PowerToys Run.
|
||||
|
||||
## Microsoft community members
|
||||
|
||||
We would like to also directly call out some extremely helpful Microsoft employees that have directly contributed to PowerToys. This isn't their day job and was work they did out of passion. We want to say thank you and recognize your work.
|
||||
|
||||
### [@betsegaw](https://github.com/betsegaw/) - [Betsegaw Tadele](http://www.dreamsofameaningfullife.com/)
|
||||
|
||||
Window Walker, inside PowerToys Run, is from Beta.
|
||||
|
||||
### [@TheMrJukes](https://github.com/TheMrJukes/) - Bret Anderson
|
||||
|
||||
The base of FancyZones and a lot of performance adjustments are from the hard work of Bret.
|
||||
|
||||
### [@bricelam](https://github.com/bricelam/) - [Brice Lambson](https://bricelam.net/)
|
||||
|
||||
Image Resizer is from Brice.
|
||||
|
||||
### [@chrdavis](https://github.com/chrdavis/) - Chris Davis
|
||||
|
||||
PowerRename is from Chris's SmartRename.
|
||||
12
deps/cpprestsdk/README.md
vendored
@@ -1,12 +0,0 @@
|
||||
# C++ Rest SDK - JSON library
|
||||
|
||||
This JSON library is taken from the C++ REST SDK in https://github.com/microsoft/cpprestsdk
|
||||
|
||||
Based in the [v2.10.13 release](https://github.com/microsoft/cpprestsdk/tree/v2.10.13/Release), it consists of the needed files to build and use the JSON classes described in `include/cpprest/json.h`.
|
||||
|
||||
Changes made to the files in order to build in the PowerToys project:
|
||||
- Removal of `#include` references to files that are not needed.
|
||||
- `#include "pch.h"` instead of `#include "stdafx.h"` to use the PowerToys pre-compiled header.
|
||||
- `#define _NO_ASYNCRTIMP` in [`include/cpprest/details/cpprest_compat.h`](./include/cpprest/details/cpprest_compat.h) since this class will be statically linked.
|
||||
|
||||
The contents of the C++ Rest SDK license are included in [license.txt](./license.txt).
|
||||
697
deps/cpprestsdk/include/cpprest/asyncrt_utils.h
vendored
@@ -1,697 +0,0 @@
|
||||
/***
|
||||
* Copyright (C) Microsoft. All rights reserved.
|
||||
* Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
|
||||
*
|
||||
* =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
||||
*
|
||||
* Various common utilities.
|
||||
*
|
||||
* For the latest on this and related APIs, please see: https://github.com/Microsoft/cpprestsdk
|
||||
*
|
||||
* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
****/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cpprest/details/basic_types.h"
|
||||
//#include "pplx/pplxtasks.h"
|
||||
#include <chrono>
|
||||
#include <cstdint>
|
||||
#include <limits.h>
|
||||
#include <locale.h>
|
||||
#include <random>
|
||||
#include <string>
|
||||
#include <system_error>
|
||||
#include <vector>
|
||||
|
||||
#ifndef _WIN32
|
||||
#include <sys/time.h>
|
||||
#if !defined(ANDROID) && !defined(__ANDROID__) && defined(HAVE_XLOCALE_H) // CodePlex 269
|
||||
/* Systems using glibc: xlocale.h has been removed from glibc 2.26
|
||||
The above include of locale.h is sufficient
|
||||
Further details: https://sourceware.org/git/?p=glibc.git;a=commit;h=f0be25b6336db7492e47d2e8e72eb8af53b5506d */
|
||||
#include <xlocale.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/// Various utilities for string conversions and date and time manipulation.
|
||||
namespace utility
|
||||
{
|
||||
// Left over from VS2010 support, remains to avoid breaking.
|
||||
typedef std::chrono::seconds seconds;
|
||||
|
||||
/// Functions for converting to/from std::chrono::seconds to xml string.
|
||||
namespace timespan
|
||||
{
|
||||
/// <summary>
|
||||
/// Converts a timespan/interval in seconds to xml duration string as specified by
|
||||
/// http://www.w3.org/TR/xmlschema-2/#duration
|
||||
/// </summary>
|
||||
_ASYNCRTIMP utility::string_t __cdecl seconds_to_xml_duration(utility::seconds numSecs);
|
||||
|
||||
/// <summary>
|
||||
/// Converts an xml duration to timespan/interval in seconds
|
||||
/// http://www.w3.org/TR/xmlschema-2/#duration
|
||||
/// </summary>
|
||||
_ASYNCRTIMP utility::seconds __cdecl xml_duration_to_seconds(const utility::string_t& timespanString);
|
||||
} // namespace timespan
|
||||
|
||||
/// Functions for Unicode string conversions.
|
||||
namespace conversions
|
||||
{
|
||||
/// <summary>
|
||||
/// Converts a UTF-16 string to a UTF-8 string.
|
||||
/// </summary>
|
||||
/// <param name="w">A two byte character UTF-16 string.</param>
|
||||
/// <returns>A single byte character UTF-8 string.</returns>
|
||||
_ASYNCRTIMP std::string __cdecl utf16_to_utf8(const utf16string& w);
|
||||
|
||||
/// <summary>
|
||||
/// Converts a UTF-8 string to a UTF-16
|
||||
/// </summary>
|
||||
/// <param name="s">A single byte character UTF-8 string.</param>
|
||||
/// <returns>A two byte character UTF-16 string.</returns>
|
||||
_ASYNCRTIMP utf16string __cdecl utf8_to_utf16(const std::string& s);
|
||||
|
||||
/// <summary>
|
||||
/// Converts a ASCII (us-ascii) string to a UTF-16 string.
|
||||
/// </summary>
|
||||
/// <param name="s">A single byte character us-ascii string.</param>
|
||||
/// <returns>A two byte character UTF-16 string.</returns>
|
||||
_ASYNCRTIMP utf16string __cdecl usascii_to_utf16(const std::string& s);
|
||||
|
||||
/// <summary>
|
||||
/// Converts a Latin1 (iso-8859-1) string to a UTF-16 string.
|
||||
/// </summary>
|
||||
/// <param name="s">A single byte character UTF-8 string.</param>
|
||||
/// <returns>A two byte character UTF-16 string.</returns>
|
||||
_ASYNCRTIMP utf16string __cdecl latin1_to_utf16(const std::string& s);
|
||||
|
||||
/// <summary>
|
||||
/// Converts a Latin1 (iso-8859-1) string to a UTF-8 string.
|
||||
/// </summary>
|
||||
/// <param name="s">A single byte character UTF-8 string.</param>
|
||||
/// <returns>A single byte character UTF-8 string.</returns>
|
||||
_ASYNCRTIMP utf8string __cdecl latin1_to_utf8(const std::string& s);
|
||||
|
||||
/// <summary>
|
||||
/// Converts to a platform dependent Unicode string type.
|
||||
/// </summary>
|
||||
/// <param name="s">A single byte character UTF-8 string.</param>
|
||||
/// <returns>A platform dependent string type.</returns>
|
||||
#ifdef _UTF16_STRINGS
|
||||
_ASYNCRTIMP utility::string_t __cdecl to_string_t(std::string&& s);
|
||||
#else
|
||||
inline utility::string_t&& to_string_t(std::string&& s) { return std::move(s); }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Converts to a platform dependent Unicode string type.
|
||||
/// </summary>
|
||||
/// <param name="s">A two byte character UTF-16 string.</param>
|
||||
/// <returns>A platform dependent string type.</returns>
|
||||
#ifdef _UTF16_STRINGS
|
||||
inline utility::string_t&& to_string_t(utf16string&& s) { return std::move(s); }
|
||||
#else
|
||||
_ASYNCRTIMP utility::string_t __cdecl to_string_t(utf16string&& s);
|
||||
#endif
|
||||
/// <summary>
|
||||
/// Converts to a platform dependent Unicode string type.
|
||||
/// </summary>
|
||||
/// <param name="s">A single byte character UTF-8 string.</param>
|
||||
/// <returns>A platform dependent string type.</returns>
|
||||
#ifdef _UTF16_STRINGS
|
||||
_ASYNCRTIMP utility::string_t __cdecl to_string_t(const std::string& s);
|
||||
#else
|
||||
inline const utility::string_t& to_string_t(const std::string& s) { return s; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Converts to a platform dependent Unicode string type.
|
||||
/// </summary>
|
||||
/// <param name="s">A two byte character UTF-16 string.</param>
|
||||
/// <returns>A platform dependent string type.</returns>
|
||||
#ifdef _UTF16_STRINGS
|
||||
inline const utility::string_t& to_string_t(const utf16string& s) { return s; }
|
||||
#else
|
||||
_ASYNCRTIMP utility::string_t __cdecl to_string_t(const utf16string& s);
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Converts to a UTF-16 from string.
|
||||
/// </summary>
|
||||
/// <param name="value">A single byte character UTF-8 string.</param>
|
||||
/// <returns>A two byte character UTF-16 string.</returns>
|
||||
_ASYNCRTIMP utf16string __cdecl to_utf16string(const std::string& value);
|
||||
|
||||
/// <summary>
|
||||
/// Converts to a UTF-16 from string.
|
||||
/// </summary>
|
||||
/// <param name="value">A two byte character UTF-16 string.</param>
|
||||
/// <returns>A two byte character UTF-16 string.</returns>
|
||||
inline const utf16string& to_utf16string(const utf16string& value) { return value; }
|
||||
/// <summary>
|
||||
/// Converts to a UTF-16 from string.
|
||||
/// </summary>
|
||||
/// <param name="value">A two byte character UTF-16 string.</param>
|
||||
/// <returns>A two byte character UTF-16 string.</returns>
|
||||
inline utf16string&& to_utf16string(utf16string&& value) { return std::move(value); }
|
||||
|
||||
/// <summary>
|
||||
/// Converts to a UTF-8 string.
|
||||
/// </summary>
|
||||
/// <param name="value">A single byte character UTF-8 string.</param>
|
||||
/// <returns>A single byte character UTF-8 string.</returns>
|
||||
inline std::string&& to_utf8string(std::string&& value) { return std::move(value); }
|
||||
|
||||
/// <summary>
|
||||
/// Converts to a UTF-8 string.
|
||||
/// </summary>
|
||||
/// <param name="value">A single byte character UTF-8 string.</param>
|
||||
/// <returns>A single byte character UTF-8 string.</returns>
|
||||
inline const std::string& to_utf8string(const std::string& value) { return value; }
|
||||
|
||||
/// <summary>
|
||||
/// Converts to a UTF-8 string.
|
||||
/// </summary>
|
||||
/// <param name="value">A two byte character UTF-16 string.</param>
|
||||
/// <returns>A single byte character UTF-8 string.</returns>
|
||||
_ASYNCRTIMP std::string __cdecl to_utf8string(const utf16string& value);
|
||||
|
||||
/// <summary>
|
||||
/// Encode the given byte array into a base64 string
|
||||
/// </summary>
|
||||
_ASYNCRTIMP utility::string_t __cdecl to_base64(const std::vector<unsigned char>& data);
|
||||
|
||||
/// <summary>
|
||||
/// Encode the given 8-byte integer into a base64 string
|
||||
/// </summary>
|
||||
_ASYNCRTIMP utility::string_t __cdecl to_base64(uint64_t data);
|
||||
|
||||
/// <summary>
|
||||
/// Decode the given base64 string to a byte array
|
||||
/// </summary>
|
||||
_ASYNCRTIMP std::vector<unsigned char> __cdecl from_base64(const utility::string_t& str);
|
||||
|
||||
template<typename Source>
|
||||
CASABLANCA_DEPRECATED("All locale-sensitive APIs will be removed in a future update. Use stringstreams directly if "
|
||||
"locale support is required.")
|
||||
utility::string_t print_string(const Source& val, const std::locale& loc = std::locale())
|
||||
{
|
||||
utility::ostringstream_t oss;
|
||||
oss.imbue(loc);
|
||||
oss << val;
|
||||
if (oss.bad())
|
||||
{
|
||||
throw std::bad_cast();
|
||||
}
|
||||
return oss.str();
|
||||
}
|
||||
|
||||
CASABLANCA_DEPRECATED("All locale-sensitive APIs will be removed in a future update. Use stringstreams directly if "
|
||||
"locale support is required.")
|
||||
inline utility::string_t print_string(const utility::string_t& val) { return val; }
|
||||
|
||||
namespace details
|
||||
{
|
||||
#if defined(__ANDROID__)
|
||||
template<class T>
|
||||
inline std::string to_string(const T t)
|
||||
{
|
||||
std::ostringstream os;
|
||||
os.imbue(std::locale::classic());
|
||||
os << t;
|
||||
return os.str();
|
||||
}
|
||||
#endif
|
||||
|
||||
template<class T>
|
||||
inline utility::string_t to_string_t(const T t)
|
||||
{
|
||||
#ifdef _UTF16_STRINGS
|
||||
using std::to_wstring;
|
||||
return to_wstring(t);
|
||||
#else
|
||||
#if !defined(__ANDROID__)
|
||||
using std::to_string;
|
||||
#endif
|
||||
return to_string(t);
|
||||
#endif
|
||||
}
|
||||
|
||||
template<typename Source>
|
||||
utility::string_t print_string(const Source& val)
|
||||
{
|
||||
utility::ostringstream_t oss;
|
||||
oss.imbue(std::locale::classic());
|
||||
oss << val;
|
||||
if (oss.bad())
|
||||
{
|
||||
throw std::bad_cast();
|
||||
}
|
||||
return oss.str();
|
||||
}
|
||||
|
||||
inline const utility::string_t& print_string(const utility::string_t& val) { return val; }
|
||||
|
||||
template<typename Source>
|
||||
utf8string print_utf8string(const Source& val)
|
||||
{
|
||||
return conversions::to_utf8string(print_string(val));
|
||||
}
|
||||
inline const utf8string& print_utf8string(const utf8string& val) { return val; }
|
||||
|
||||
template<typename Target>
|
||||
Target scan_string(const utility::string_t& str)
|
||||
{
|
||||
Target t;
|
||||
utility::istringstream_t iss(str);
|
||||
iss.imbue(std::locale::classic());
|
||||
iss >> t;
|
||||
if (iss.bad())
|
||||
{
|
||||
throw std::bad_cast();
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
||||
inline const utility::string_t& scan_string(const utility::string_t& str) { return str; }
|
||||
} // namespace details
|
||||
|
||||
template<typename Target>
|
||||
CASABLANCA_DEPRECATED("All locale-sensitive APIs will be removed in a future update. Use stringstreams directly if "
|
||||
"locale support is required.")
|
||||
Target scan_string(const utility::string_t& str, const std::locale& loc = std::locale())
|
||||
{
|
||||
Target t;
|
||||
utility::istringstream_t iss(str);
|
||||
iss.imbue(loc);
|
||||
iss >> t;
|
||||
if (iss.bad())
|
||||
{
|
||||
throw std::bad_cast();
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
||||
CASABLANCA_DEPRECATED("All locale-sensitive APIs will be removed in a future update. Use stringstreams directly if "
|
||||
"locale support is required.")
|
||||
inline utility::string_t scan_string(const utility::string_t& str) { return str; }
|
||||
} // namespace conversions
|
||||
|
||||
namespace details
|
||||
{
|
||||
/// <summary>
|
||||
/// Cross platform RAII container for setting thread local locale.
|
||||
/// </summary>
|
||||
class scoped_c_thread_locale
|
||||
{
|
||||
public:
|
||||
_ASYNCRTIMP scoped_c_thread_locale();
|
||||
_ASYNCRTIMP ~scoped_c_thread_locale();
|
||||
|
||||
#if !defined(ANDROID) && !defined(__ANDROID__) // CodePlex 269
|
||||
#ifdef _WIN32
|
||||
typedef _locale_t xplat_locale;
|
||||
#else
|
||||
typedef locale_t xplat_locale;
|
||||
#endif
|
||||
|
||||
static _ASYNCRTIMP xplat_locale __cdecl c_locale();
|
||||
#endif
|
||||
private:
|
||||
#ifdef _WIN32
|
||||
std::string m_prevLocale;
|
||||
int m_prevThreadSetting;
|
||||
#elif !(defined(ANDROID) || defined(__ANDROID__))
|
||||
locale_t m_prevLocale;
|
||||
#endif
|
||||
scoped_c_thread_locale(const scoped_c_thread_locale&);
|
||||
scoped_c_thread_locale& operator=(const scoped_c_thread_locale&);
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Our own implementation of alpha numeric instead of std::isalnum to avoid
|
||||
/// taking global lock for performance reasons.
|
||||
/// </summary>
|
||||
inline bool __cdecl is_alnum(const unsigned char uch) CPPREST_NOEXCEPT
|
||||
{ // test if uch is an alnum character
|
||||
// special casing char to avoid branches
|
||||
// clang-format off
|
||||
static CPPREST_CONSTEXPR bool is_alnum_table[UCHAR_MAX + 1] = {
|
||||
/* X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 XA XB XC XD XE XF */
|
||||
/* 0X */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
/* 1X */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
/* 2X */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
/* 3X */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 0-9 */
|
||||
/* 4X */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* A-Z */
|
||||
/* 5X */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
|
||||
/* 6X */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* a-z */
|
||||
/* 7X */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
|
||||
/* non-ASCII values initialized to 0 */
|
||||
};
|
||||
// clang-format on
|
||||
return (is_alnum_table[uch]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Our own implementation of alpha numeric instead of std::isalnum to avoid
|
||||
/// taking global lock for performance reasons.
|
||||
/// </summary>
|
||||
inline bool __cdecl is_alnum(const char ch) CPPREST_NOEXCEPT { return (is_alnum(static_cast<unsigned char>(ch))); }
|
||||
|
||||
/// <summary>
|
||||
/// Our own implementation of alpha numeric instead of std::isalnum to avoid
|
||||
/// taking global lock for performance reasons.
|
||||
/// </summary>
|
||||
template<class Elem>
|
||||
inline bool __cdecl is_alnum(Elem ch) CPPREST_NOEXCEPT
|
||||
{
|
||||
// assumes 'x' == L'x' for the ASCII range
|
||||
typedef typename std::make_unsigned<Elem>::type UElem;
|
||||
const auto uch = static_cast<UElem>(ch);
|
||||
return (uch <= static_cast<UElem>('z') && is_alnum(static_cast<unsigned char>(uch)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Simplistic implementation of make_unique. A better implementation would be based on variadic templates
|
||||
/// and therefore not be compatible with Dev10.
|
||||
/// </summary>
|
||||
template<typename _Type>
|
||||
std::unique_ptr<_Type> make_unique()
|
||||
{
|
||||
return std::unique_ptr<_Type>(new _Type());
|
||||
}
|
||||
|
||||
template<typename _Type, typename _Arg1>
|
||||
std::unique_ptr<_Type> make_unique(_Arg1&& arg1)
|
||||
{
|
||||
return std::unique_ptr<_Type>(new _Type(std::forward<_Arg1>(arg1)));
|
||||
}
|
||||
|
||||
template<typename _Type, typename _Arg1, typename _Arg2>
|
||||
std::unique_ptr<_Type> make_unique(_Arg1&& arg1, _Arg2&& arg2)
|
||||
{
|
||||
return std::unique_ptr<_Type>(new _Type(std::forward<_Arg1>(arg1), std::forward<_Arg2>(arg2)));
|
||||
}
|
||||
|
||||
template<typename _Type, typename _Arg1, typename _Arg2, typename _Arg3>
|
||||
std::unique_ptr<_Type> make_unique(_Arg1&& arg1, _Arg2&& arg2, _Arg3&& arg3)
|
||||
{
|
||||
return std::unique_ptr<_Type>(
|
||||
new _Type(std::forward<_Arg1>(arg1), std::forward<_Arg2>(arg2), std::forward<_Arg3>(arg3)));
|
||||
}
|
||||
|
||||
template<typename _Type, typename _Arg1, typename _Arg2, typename _Arg3, typename _Arg4>
|
||||
std::unique_ptr<_Type> make_unique(_Arg1&& arg1, _Arg2&& arg2, _Arg3&& arg3, _Arg4&& arg4)
|
||||
{
|
||||
return std::unique_ptr<_Type>(new _Type(
|
||||
std::forward<_Arg1>(arg1), std::forward<_Arg2>(arg2), std::forward<_Arg3>(arg3), std::forward<_Arg4>(arg4)));
|
||||
}
|
||||
|
||||
template<typename _Type, typename _Arg1, typename _Arg2, typename _Arg3, typename _Arg4, typename _Arg5>
|
||||
std::unique_ptr<_Type> make_unique(_Arg1&& arg1, _Arg2&& arg2, _Arg3&& arg3, _Arg4&& arg4, _Arg5&& arg5)
|
||||
{
|
||||
return std::unique_ptr<_Type>(new _Type(std::forward<_Arg1>(arg1),
|
||||
std::forward<_Arg2>(arg2),
|
||||
std::forward<_Arg3>(arg3),
|
||||
std::forward<_Arg4>(arg4),
|
||||
std::forward<_Arg5>(arg5)));
|
||||
}
|
||||
|
||||
template<typename _Type, typename _Arg1, typename _Arg2, typename _Arg3, typename _Arg4, typename _Arg5, typename _Arg6>
|
||||
std::unique_ptr<_Type> make_unique(_Arg1&& arg1, _Arg2&& arg2, _Arg3&& arg3, _Arg4&& arg4, _Arg5&& arg5, _Arg6&& arg6)
|
||||
{
|
||||
return std::unique_ptr<_Type>(new _Type(std::forward<_Arg1>(arg1),
|
||||
std::forward<_Arg2>(arg2),
|
||||
std::forward<_Arg3>(arg3),
|
||||
std::forward<_Arg4>(arg4),
|
||||
std::forward<_Arg5>(arg5),
|
||||
std::forward<_Arg6>(arg6)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Cross platform utility function for performing case insensitive string equality comparison.
|
||||
/// </summary>
|
||||
/// <param name="left">First string to compare.</param>
|
||||
/// <param name="right">Second strong to compare.</param>
|
||||
/// <returns>true if the strings are equivalent, false otherwise</returns>
|
||||
_ASYNCRTIMP bool __cdecl str_iequal(const std::string& left, const std::string& right) CPPREST_NOEXCEPT;
|
||||
|
||||
/// <summary>
|
||||
/// Cross platform utility function for performing case insensitive string equality comparison.
|
||||
/// </summary>
|
||||
/// <param name="left">First string to compare.</param>
|
||||
/// <param name="right">Second strong to compare.</param>
|
||||
/// <returns>true if the strings are equivalent, false otherwise</returns>
|
||||
_ASYNCRTIMP bool __cdecl str_iequal(const std::wstring& left, const std::wstring& right) CPPREST_NOEXCEPT;
|
||||
|
||||
/// <summary>
|
||||
/// Cross platform utility function for performing case insensitive string less-than comparison.
|
||||
/// </summary>
|
||||
/// <param name="left">First string to compare.</param>
|
||||
/// <param name="right">Second strong to compare.</param>
|
||||
/// <returns>true if a lowercase view of left is lexicographically less than a lowercase view of right; otherwise,
|
||||
/// false.</returns>
|
||||
_ASYNCRTIMP bool __cdecl str_iless(const std::string& left, const std::string& right) CPPREST_NOEXCEPT;
|
||||
|
||||
/// <summary>
|
||||
/// Cross platform utility function for performing case insensitive string less-than comparison.
|
||||
/// </summary>
|
||||
/// <param name="left">First string to compare.</param>
|
||||
/// <param name="right">Second strong to compare.</param>
|
||||
/// <returns>true if a lowercase view of left is lexicographically less than a lowercase view of right; otherwise,
|
||||
/// false.</returns>
|
||||
_ASYNCRTIMP bool __cdecl str_iless(const std::wstring& left, const std::wstring& right) CPPREST_NOEXCEPT;
|
||||
|
||||
/// <summary>
|
||||
/// Convert a string to lowercase in place.
|
||||
/// </summary>
|
||||
/// <param name="target">The string to convert to lowercase.</param>
|
||||
_ASYNCRTIMP void __cdecl inplace_tolower(std::string& target) CPPREST_NOEXCEPT;
|
||||
|
||||
/// <summary>
|
||||
/// Convert a string to lowercase in place.
|
||||
/// </summary>
|
||||
/// <param name="target">The string to convert to lowercase.</param>
|
||||
_ASYNCRTIMP void __cdecl inplace_tolower(std::wstring& target) CPPREST_NOEXCEPT;
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
/// <summary>
|
||||
/// Category error type for Windows OS errors.
|
||||
/// </summary>
|
||||
class windows_category_impl : public std::error_category
|
||||
{
|
||||
public:
|
||||
virtual const char* name() const CPPREST_NOEXCEPT { return "windows"; }
|
||||
|
||||
virtual std::string message(int errorCode) const CPPREST_NOEXCEPT;
|
||||
|
||||
virtual std::error_condition default_error_condition(int errorCode) const CPPREST_NOEXCEPT;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Gets the one global instance of the windows error category.
|
||||
/// </summary>
|
||||
/// </returns>An error category instance.</returns>
|
||||
_ASYNCRTIMP const std::error_category& __cdecl windows_category();
|
||||
|
||||
#else
|
||||
|
||||
/// <summary>
|
||||
/// Gets the one global instance of the linux error category.
|
||||
/// </summary>
|
||||
/// </returns>An error category instance.</returns>
|
||||
_ASYNCRTIMP const std::error_category& __cdecl linux_category();
|
||||
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Gets the one global instance of the current platform's error category.
|
||||
/// </summary>
|
||||
_ASYNCRTIMP const std::error_category& __cdecl platform_category();
|
||||
|
||||
/// <summary>
|
||||
/// Creates an instance of std::system_error from a OS error code.
|
||||
/// </summary>
|
||||
inline std::system_error __cdecl create_system_error(unsigned long errorCode)
|
||||
{
|
||||
std::error_code code((int)errorCode, platform_category());
|
||||
return std::system_error(code, code.message());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a std::error_code from a OS error code.
|
||||
/// </summary>
|
||||
inline std::error_code __cdecl create_error_code(unsigned long errorCode)
|
||||
{
|
||||
return std::error_code((int)errorCode, platform_category());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates the corresponding error message from a OS error code.
|
||||
/// </summary>
|
||||
inline utility::string_t __cdecl create_error_message(unsigned long errorCode)
|
||||
{
|
||||
return utility::conversions::to_string_t(create_error_code(errorCode).message());
|
||||
}
|
||||
|
||||
} // namespace details
|
||||
|
||||
class datetime
|
||||
{
|
||||
public:
|
||||
typedef uint64_t interval_type;
|
||||
|
||||
/// <summary>
|
||||
/// Defines the supported date and time string formats.
|
||||
/// </summary>
|
||||
enum date_format
|
||||
{
|
||||
RFC_1123,
|
||||
ISO_8601
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Returns the current UTC time.
|
||||
/// </summary>
|
||||
static _ASYNCRTIMP datetime __cdecl utc_now();
|
||||
|
||||
/// <summary>
|
||||
/// An invalid UTC timestamp value.
|
||||
/// </summary>
|
||||
enum : interval_type
|
||||
{
|
||||
utc_timestamp_invalid = static_cast<interval_type>(-1)
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Returns seconds since Unix/POSIX time epoch at 01-01-1970 00:00:00.
|
||||
/// If time is before epoch, utc_timestamp_invalid is returned.
|
||||
/// </summary>
|
||||
static interval_type utc_timestamp()
|
||||
{
|
||||
const auto seconds = utc_now().to_interval() / _secondTicks;
|
||||
if (seconds >= 11644473600LL)
|
||||
{
|
||||
return seconds - 11644473600LL;
|
||||
}
|
||||
else
|
||||
{
|
||||
return utc_timestamp_invalid;
|
||||
}
|
||||
}
|
||||
|
||||
datetime() : m_interval(0) {}
|
||||
|
||||
/// <summary>
|
||||
/// Creates <c>datetime</c> from a string representing time in UTC in RFC 1123 format.
|
||||
/// </summary>
|
||||
/// <returns>Returns a <c>datetime</c> of zero if not successful.</returns>
|
||||
static _ASYNCRTIMP datetime __cdecl from_string(const utility::string_t& timestring, date_format format = RFC_1123);
|
||||
|
||||
/// <summary>
|
||||
/// Returns a string representation of the <c>datetime</c>.
|
||||
/// </summary>
|
||||
_ASYNCRTIMP utility::string_t to_string(date_format format = RFC_1123) const;
|
||||
|
||||
/// <summary>
|
||||
/// Returns the integral time value.
|
||||
/// </summary>
|
||||
interval_type to_interval() const { return m_interval; }
|
||||
|
||||
datetime operator-(interval_type value) const { return datetime(m_interval - value); }
|
||||
|
||||
datetime operator+(interval_type value) const { return datetime(m_interval + value); }
|
||||
|
||||
bool operator==(datetime dt) const { return m_interval == dt.m_interval; }
|
||||
|
||||
bool operator!=(const datetime& dt) const { return !(*this == dt); }
|
||||
|
||||
static interval_type from_milliseconds(unsigned int milliseconds) { return milliseconds * _msTicks; }
|
||||
|
||||
static interval_type from_seconds(unsigned int seconds) { return seconds * _secondTicks; }
|
||||
|
||||
static interval_type from_minutes(unsigned int minutes) { return minutes * _minuteTicks; }
|
||||
|
||||
static interval_type from_hours(unsigned int hours) { return hours * _hourTicks; }
|
||||
|
||||
static interval_type from_days(unsigned int days) { return days * _dayTicks; }
|
||||
|
||||
bool is_initialized() const { return m_interval != 0; }
|
||||
|
||||
private:
|
||||
friend int operator-(datetime t1, datetime t2);
|
||||
|
||||
static const interval_type _msTicks = static_cast<interval_type>(10000);
|
||||
static const interval_type _secondTicks = 1000 * _msTicks;
|
||||
static const interval_type _minuteTicks = 60 * _secondTicks;
|
||||
static const interval_type _hourTicks = 60 * 60 * _secondTicks;
|
||||
static const interval_type _dayTicks = 24 * 60 * 60 * _secondTicks;
|
||||
|
||||
// Private constructor. Use static methods to create an instance.
|
||||
datetime(interval_type interval) : m_interval(interval) {}
|
||||
|
||||
// Storing as hundreds of nanoseconds 10e-7, i.e. 1 here equals 100ns.
|
||||
interval_type m_interval;
|
||||
};
|
||||
|
||||
inline int operator-(datetime t1, datetime t2)
|
||||
{
|
||||
auto diff = (t1.m_interval - t2.m_interval);
|
||||
|
||||
// Round it down to seconds
|
||||
diff /= 10 * 1000 * 1000;
|
||||
|
||||
return static_cast<int>(diff);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Nonce string generator class.
|
||||
/// </summary>
|
||||
class nonce_generator
|
||||
{
|
||||
public:
|
||||
/// <summary>
|
||||
/// Define default nonce length.
|
||||
/// </summary>
|
||||
enum
|
||||
{
|
||||
default_length = 32
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Nonce generator constructor.
|
||||
/// </summary>
|
||||
/// <param name="length">Length of the generated nonce string.</param>
|
||||
nonce_generator(int length = default_length)
|
||||
: m_random(static_cast<unsigned int>(utility::datetime::utc_timestamp())), m_length(length)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Generate a nonce string containing random alphanumeric characters (A-Za-z0-9).
|
||||
/// Length of the generated string is set by length().
|
||||
/// </summary>
|
||||
/// <returns>The generated nonce string.</returns>
|
||||
_ASYNCRTIMP utility::string_t generate();
|
||||
|
||||
/// <summary>
|
||||
/// Get length of generated nonce string.
|
||||
/// </summary>
|
||||
/// <returns>Nonce string length.</returns>
|
||||
int length() const { return m_length; }
|
||||
|
||||
/// <summary>
|
||||
/// Set length of the generated nonce string.
|
||||
/// </summary>
|
||||
/// <param name="length">Lenght of nonce string.</param>
|
||||
void set_length(int length) { m_length = length; }
|
||||
|
||||
private:
|
||||
std::mt19937 m_random;
|
||||
int m_length;
|
||||
};
|
||||
|
||||
} // namespace utility
|
||||
391
deps/cpprestsdk/include/cpprest/base_uri.h
vendored
@@ -1,391 +0,0 @@
|
||||
/***
|
||||
* Copyright (C) Microsoft. All rights reserved.
|
||||
* Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
|
||||
*
|
||||
* =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
||||
*
|
||||
* Protocol independent support for URIs.
|
||||
*
|
||||
* For the latest on this and related APIs, please see: https://github.com/Microsoft/cpprestsdk
|
||||
*
|
||||
* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
****/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cpprest/asyncrt_utils.h"
|
||||
#include "cpprest/details/basic_types.h"
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
namespace web
|
||||
{
|
||||
namespace details
|
||||
{
|
||||
struct uri_components
|
||||
{
|
||||
uri_components() : m_path(_XPLATSTR("/")), m_port(-1) {}
|
||||
|
||||
uri_components(const uri_components&) = default;
|
||||
uri_components& operator=(const uri_components&) = default;
|
||||
|
||||
// This is for VS2013 compatibility -- replace with '= default' when VS2013 is completely dropped.
|
||||
uri_components(uri_components&& other) CPPREST_NOEXCEPT : m_scheme(std::move(other.m_scheme)),
|
||||
m_host(std::move(other.m_host)),
|
||||
m_user_info(std::move(other.m_user_info)),
|
||||
m_path(std::move(other.m_path)),
|
||||
m_query(std::move(other.m_query)),
|
||||
m_fragment(std::move(other.m_fragment)),
|
||||
m_port(other.m_port)
|
||||
{
|
||||
}
|
||||
|
||||
// This is for VS2013 compatibility -- replace with '= default' when VS2013 is completely dropped.
|
||||
uri_components& operator=(uri_components&& other) CPPREST_NOEXCEPT
|
||||
{
|
||||
if (this != &other)
|
||||
{
|
||||
m_scheme = std::move(other.m_scheme);
|
||||
m_host = std::move(other.m_host);
|
||||
m_user_info = std::move(other.m_user_info);
|
||||
m_path = std::move(other.m_path);
|
||||
m_query = std::move(other.m_query);
|
||||
m_fragment = std::move(other.m_fragment);
|
||||
m_port = other.m_port;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
_ASYNCRTIMP utility::string_t join();
|
||||
|
||||
utility::string_t m_scheme;
|
||||
utility::string_t m_host;
|
||||
utility::string_t m_user_info;
|
||||
utility::string_t m_path;
|
||||
utility::string_t m_query;
|
||||
utility::string_t m_fragment;
|
||||
int m_port;
|
||||
};
|
||||
} // namespace details
|
||||
|
||||
/// <summary>
|
||||
/// A single exception type to represent errors in parsing, encoding, and decoding URIs.
|
||||
/// </summary>
|
||||
class uri_exception : public std::exception
|
||||
{
|
||||
public:
|
||||
uri_exception(std::string msg) : m_msg(std::move(msg)) {}
|
||||
|
||||
~uri_exception() CPPREST_NOEXCEPT {}
|
||||
|
||||
const char* what() const CPPREST_NOEXCEPT { return m_msg.c_str(); }
|
||||
|
||||
private:
|
||||
std::string m_msg;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// A flexible, protocol independent URI implementation.
|
||||
///
|
||||
/// URI instances are immutable. Querying the various fields on an empty URI will return empty strings. Querying
|
||||
/// various diagnostic members on an empty URI will return false.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This implementation accepts both URIs ('http://msn.com/path') and URI relative-references
|
||||
/// ('/path?query#frag').
|
||||
///
|
||||
/// This implementation does not provide any scheme-specific handling -- an example of this
|
||||
/// would be the following: 'http://path1/path'. This is a valid URI, but it's not a valid
|
||||
/// http-uri -- that is, it's syntactically correct but does not conform to the requirements
|
||||
/// of the http scheme (http requires a host).
|
||||
/// We could provide this by allowing a pluggable 'scheme' policy-class, which would provide
|
||||
/// extra capability for validating and canonicalizing a URI according to scheme, and would
|
||||
/// introduce a layer of type-safety for URIs of differing schemes, and thus differing semantics.
|
||||
///
|
||||
/// One issue with implementing a scheme-independent URI facility is that of comparing for equality.
|
||||
/// For instance, these URIs are considered equal 'http://msn.com', 'http://msn.com:80'. That is --
|
||||
/// the 'default' port can be either omitted or explicit. Since we don't have a way to map a scheme
|
||||
/// to it's default port, we don't have a way to know these are equal. This is just one of a class of
|
||||
/// issues with regard to scheme-specific behavior.
|
||||
/// </remarks>
|
||||
class uri
|
||||
{
|
||||
public:
|
||||
/// <summary>
|
||||
/// The various components of a URI. This enum is used to indicate which
|
||||
/// URI component is being encoded to the encode_uri_component. This allows
|
||||
/// specific encoding to be performed.
|
||||
///
|
||||
/// Scheme and port don't allow '%' so they don't need to be encoded.
|
||||
/// </summary>
|
||||
class components
|
||||
{
|
||||
public:
|
||||
enum component
|
||||
{
|
||||
user_info,
|
||||
host,
|
||||
path,
|
||||
query,
|
||||
fragment,
|
||||
full_uri
|
||||
};
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Encodes a URI component according to RFC 3986.
|
||||
/// Note if a full URI is specified instead of an individual URI component all
|
||||
/// characters not in the unreserved set are escaped.
|
||||
/// </summary>
|
||||
/// <param name="raw">The URI as a string.</param>
|
||||
/// <returns>The encoded string.</returns>
|
||||
_ASYNCRTIMP static utility::string_t __cdecl encode_uri(const utility::string_t& raw,
|
||||
uri::components::component = components::full_uri);
|
||||
|
||||
/// <summary>
|
||||
/// Encodes a string by converting all characters except for RFC 3986 unreserved characters to their
|
||||
/// hexadecimal representation.
|
||||
/// </summary>
|
||||
/// <returns>The encoded string.</returns>
|
||||
_ASYNCRTIMP static utility::string_t __cdecl encode_data_string(const utility::string_t& data);
|
||||
|
||||
/// <summary>
|
||||
/// Decodes an encoded string.
|
||||
/// </summary>
|
||||
/// <param name="encoded">The URI as a string.</param>
|
||||
/// <returns>The decoded string.</returns>
|
||||
_ASYNCRTIMP static utility::string_t __cdecl decode(const utility::string_t& encoded);
|
||||
|
||||
/// <summary>
|
||||
/// Splits a path into its hierarchical components.
|
||||
/// </summary>
|
||||
/// <param name="path">The path as a string</param>
|
||||
/// <returns>A <c>std::vector<utility::string_t></c> containing the segments in the path.</returns>
|
||||
_ASYNCRTIMP static std::vector<utility::string_t> __cdecl split_path(const utility::string_t& path);
|
||||
|
||||
/// <summary>
|
||||
/// Splits a query into its key-value components.
|
||||
/// </summary>
|
||||
/// <param name="query">The query string</param>
|
||||
/// <returns>A <c>std::map<utility::string_t, utility::string_t></c> containing the key-value components of
|
||||
/// the query.</returns>
|
||||
_ASYNCRTIMP static std::map<utility::string_t, utility::string_t> __cdecl split_query(
|
||||
const utility::string_t& query);
|
||||
|
||||
/// <summary>
|
||||
/// Validates a string as a URI.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This function accepts both uris ('http://msn.com') and uri relative-references ('path1/path2?query').
|
||||
/// </remarks>
|
||||
/// <param name="uri_string">The URI string to be validated.</param>
|
||||
/// <returns><c>true</c> if the given string represents a valid URI, <c>false</c> otherwise.</returns>
|
||||
_ASYNCRTIMP static bool __cdecl validate(const utility::string_t& uri_string);
|
||||
|
||||
/// <summary>
|
||||
/// Creates an empty uri
|
||||
/// </summary>
|
||||
uri() : m_uri(_XPLATSTR("/")) {}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a URI from the given encoded string. This will throw an exception if the string
|
||||
/// does not contain a valid URI. Use uri::validate if processing user-input.
|
||||
/// </summary>
|
||||
/// <param name="uri_string">A pointer to an encoded string to create the URI instance.</param>
|
||||
_ASYNCRTIMP uri(const utility::char_t* uri_string);
|
||||
|
||||
/// <summary>
|
||||
/// Creates a URI from the given encoded string. This will throw an exception if the string
|
||||
/// does not contain a valid URI. Use uri::validate if processing user-input.
|
||||
/// </summary>
|
||||
/// <param name="uri_string">An encoded URI string to create the URI instance.</param>
|
||||
_ASYNCRTIMP uri(const utility::string_t& uri_string);
|
||||
|
||||
/// <summary>
|
||||
/// Copy constructor.
|
||||
/// </summary>
|
||||
uri(const uri&) = default;
|
||||
|
||||
/// <summary>
|
||||
/// Copy assignment operator.
|
||||
/// </summary>
|
||||
uri& operator=(const uri&) = default;
|
||||
|
||||
/// <summary>
|
||||
/// Move constructor.
|
||||
/// </summary>
|
||||
// This is for VS2013 compatibility -- replace with '= default' when VS2013 is completely dropped.
|
||||
uri(uri&& other) CPPREST_NOEXCEPT : m_uri(std::move(other.m_uri)), m_components(std::move(other.m_components)) {}
|
||||
|
||||
/// <summary>
|
||||
/// Move assignment operator
|
||||
/// </summary>
|
||||
// This is for VS2013 compatibility -- replace with '= default' when VS2013 is completely dropped.
|
||||
uri& operator=(uri&& other) CPPREST_NOEXCEPT
|
||||
{
|
||||
if (this != &other)
|
||||
{
|
||||
m_uri = std::move(other.m_uri);
|
||||
m_components = std::move(other.m_components);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the scheme component of the URI as an encoded string.
|
||||
/// </summary>
|
||||
/// <returns>The URI scheme as a string.</returns>
|
||||
const utility::string_t& scheme() const { return m_components.m_scheme; }
|
||||
|
||||
/// <summary>
|
||||
/// Get the user information component of the URI as an encoded string.
|
||||
/// </summary>
|
||||
/// <returns>The URI user information as a string.</returns>
|
||||
const utility::string_t& user_info() const { return m_components.m_user_info; }
|
||||
|
||||
/// <summary>
|
||||
/// Get the host component of the URI as an encoded string.
|
||||
/// </summary>
|
||||
/// <returns>The URI host as a string.</returns>
|
||||
const utility::string_t& host() const { return m_components.m_host; }
|
||||
|
||||
/// <summary>
|
||||
/// Get the port component of the URI. Returns -1 if no port is specified.
|
||||
/// </summary>
|
||||
/// <returns>The URI port as an integer.</returns>
|
||||
int port() const { return m_components.m_port; }
|
||||
|
||||
/// <summary>
|
||||
/// Get the path component of the URI as an encoded string.
|
||||
/// </summary>
|
||||
/// <returns>The URI path as a string.</returns>
|
||||
const utility::string_t& path() const { return m_components.m_path; }
|
||||
|
||||
/// <summary>
|
||||
/// Get the query component of the URI as an encoded string.
|
||||
/// </summary>
|
||||
/// <returns>The URI query as a string.</returns>
|
||||
const utility::string_t& query() const { return m_components.m_query; }
|
||||
|
||||
/// <summary>
|
||||
/// Get the fragment component of the URI as an encoded string.
|
||||
/// </summary>
|
||||
/// <returns>The URI fragment as a string.</returns>
|
||||
const utility::string_t& fragment() const { return m_components.m_fragment; }
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new uri object with the same authority portion as this one, omitting the resource and query portions.
|
||||
/// </summary>
|
||||
/// <returns>The new uri object with the same authority.</returns>
|
||||
_ASYNCRTIMP uri authority() const;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the path, query, and fragment portion of this uri, which may be empty.
|
||||
/// </summary>
|
||||
/// <returns>The new URI object with the path, query and fragment portion of this URI.</returns>
|
||||
_ASYNCRTIMP uri resource() const;
|
||||
|
||||
/// <summary>
|
||||
/// An empty URI specifies no components, and serves as a default value
|
||||
/// </summary>
|
||||
bool is_empty() const { return this->m_uri.empty() || this->m_uri == _XPLATSTR("/"); }
|
||||
|
||||
/// <summary>
|
||||
/// A loopback URI is one which refers to a hostname or ip address with meaning only on the local machine.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Examples include "localhost", or ip addresses in the loopback range (127.0.0.0/24).
|
||||
/// </remarks>
|
||||
/// <returns><c>true</c> if this URI references the local host, <c>false</c> otherwise.</returns>
|
||||
bool is_host_loopback() const
|
||||
{
|
||||
return !is_empty() &&
|
||||
((host() == _XPLATSTR("localhost")) || (host().size() > 4 && host().substr(0, 4) == _XPLATSTR("127.")));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A wildcard URI is one which refers to all hostnames that resolve to the local machine (using the * or +)
|
||||
/// </summary>
|
||||
/// <example>
|
||||
/// http://*:80
|
||||
/// </example>
|
||||
bool is_host_wildcard() const
|
||||
{
|
||||
return !is_empty() && (this->host() == _XPLATSTR("*") || this->host() == _XPLATSTR("+"));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A portable URI is one with a hostname that can be resolved globally (used from another machine).
|
||||
/// </summary>
|
||||
/// <returns><c>true</c> if this URI can be resolved globally (used from another machine), <c>false</c>
|
||||
/// otherwise.</returns> <remarks> The hostname "localhost" is a reserved name that is guaranteed to resolve to the
|
||||
/// local machine, and cannot be used for inter-machine communication. Likewise the hostnames "*" and "+" on Windows
|
||||
/// represent wildcards, and do not map to a resolvable address.
|
||||
/// </remarks>
|
||||
bool is_host_portable() const { return !(is_empty() || is_host_loopback() || is_host_wildcard()); }
|
||||
|
||||
/// <summary>
|
||||
/// A default port is one where the port is unspecified, and will be determined by the operating system.
|
||||
/// The choice of default port may be dictated by the scheme (http -> 80) or not.
|
||||
/// </summary>
|
||||
/// <returns><c>true</c> if this URI instance has a default port, <c>false</c> otherwise.</returns>
|
||||
bool is_port_default() const { return !is_empty() && this->port() == 0; }
|
||||
|
||||
/// <summary>
|
||||
/// An "authority" URI is one with only a scheme, optional userinfo, hostname, and (optional) port.
|
||||
/// </summary>
|
||||
/// <returns><c>true</c> if this is an "authority" URI, <c>false</c> otherwise.</returns>
|
||||
bool is_authority() const { return !is_empty() && is_path_empty() && query().empty() && fragment().empty(); }
|
||||
|
||||
/// <summary>
|
||||
/// Returns whether the other URI has the same authority as this one
|
||||
/// </summary>
|
||||
/// <param name="other">The URI to compare the authority with.</param>
|
||||
/// <returns><c>true</c> if both the URI's have the same authority, <c>false</c> otherwise.</returns>
|
||||
bool has_same_authority(const uri& other) const { return !is_empty() && this->authority() == other.authority(); }
|
||||
|
||||
/// <summary>
|
||||
/// Returns whether the path portion of this URI is empty
|
||||
/// </summary>
|
||||
/// <returns><c>true</c> if the path portion of this URI is empty, <c>false</c> otherwise.</returns>
|
||||
bool is_path_empty() const { return path().empty() || path() == _XPLATSTR("/"); }
|
||||
|
||||
/// <summary>
|
||||
/// Returns the full (encoded) URI as a string.
|
||||
/// </summary>
|
||||
/// <returns>The full encoded URI string.</returns>
|
||||
utility::string_t to_string() const { return m_uri; }
|
||||
|
||||
/// <summary>
|
||||
/// Returns an URI resolved against <c>this</c> as the base URI
|
||||
/// according to RFC3986, Section 5 (https://tools.ietf.org/html/rfc3986#section-5).
|
||||
/// </summary>
|
||||
/// <param name="relativeUri">The relative URI to be resolved against <c>this</c> as base.</param>
|
||||
/// <returns>The new resolved URI string.</returns>
|
||||
_ASYNCRTIMP utility::string_t resolve_uri(const utility::string_t& relativeUri) const;
|
||||
|
||||
_ASYNCRTIMP bool operator==(const uri& other) const;
|
||||
|
||||
bool operator<(const uri& other) const { return m_uri < other.m_uri; }
|
||||
|
||||
bool operator!=(const uri& other) const { return !(this->operator==(other)); }
|
||||
|
||||
private:
|
||||
friend class uri_builder;
|
||||
|
||||
/// <summary>
|
||||
/// Creates a URI from the given URI components.
|
||||
/// </summary>
|
||||
/// <param name="components">A URI components object to create the URI instance.</param>
|
||||
_ASYNCRTIMP uri(const details::uri_components& components);
|
||||
|
||||
// Used by uri_builder
|
||||
static utility::string_t __cdecl encode_query_impl(const utf8string& raw);
|
||||
|
||||
utility::string_t m_uri;
|
||||
details::uri_components m_components;
|
||||
};
|
||||
|
||||
} // namespace web
|
||||
7482
deps/cpprestsdk/include/cpprest/details/SafeInt3.hpp
vendored
@@ -1,131 +0,0 @@
|
||||
/***
|
||||
* Copyright (C) Microsoft. All rights reserved.
|
||||
* Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
|
||||
*
|
||||
* =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
||||
*
|
||||
* Platform-dependent type definitions
|
||||
*
|
||||
* For the latest on this and related APIs, please see: https://github.com/Microsoft/cpprestsdk
|
||||
*
|
||||
* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
****/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cpprest/details/cpprest_compat.h"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
#ifndef _WIN32
|
||||
#ifndef __STDC_LIMIT_MACROS
|
||||
#define __STDC_LIMIT_MACROS
|
||||
#endif
|
||||
#include <stdint.h>
|
||||
#else
|
||||
#include <cstdint>
|
||||
#endif
|
||||
|
||||
#include "cpprest/details/SafeInt3.hpp"
|
||||
|
||||
namespace utility
|
||||
{
|
||||
#ifdef _WIN32
|
||||
#define _UTF16_STRINGS
|
||||
#endif
|
||||
|
||||
// We should be using a 64-bit size type for most situations that do
|
||||
// not involve specifying the size of a memory allocation or buffer.
|
||||
typedef uint64_t size64_t;
|
||||
|
||||
#ifndef _WIN32
|
||||
typedef uint32_t HRESULT; // Needed for PPLX
|
||||
#endif
|
||||
|
||||
#ifdef _UTF16_STRINGS
|
||||
//
|
||||
// On Windows, all strings are wide
|
||||
//
|
||||
typedef wchar_t char_t;
|
||||
typedef std::wstring string_t;
|
||||
#define _XPLATSTR(x) L##x
|
||||
typedef std::wostringstream ostringstream_t;
|
||||
typedef std::wofstream ofstream_t;
|
||||
typedef std::wostream ostream_t;
|
||||
typedef std::wistream istream_t;
|
||||
typedef std::wifstream ifstream_t;
|
||||
typedef std::wistringstream istringstream_t;
|
||||
typedef std::wstringstream stringstream_t;
|
||||
#define ucout std::wcout
|
||||
#define ucin std::wcin
|
||||
#define ucerr std::wcerr
|
||||
#else
|
||||
//
|
||||
// On POSIX platforms, all strings are narrow
|
||||
//
|
||||
typedef char char_t;
|
||||
typedef std::string string_t;
|
||||
#define _XPLATSTR(x) x
|
||||
typedef std::ostringstream ostringstream_t;
|
||||
typedef std::ofstream ofstream_t;
|
||||
typedef std::ostream ostream_t;
|
||||
typedef std::istream istream_t;
|
||||
typedef std::ifstream ifstream_t;
|
||||
typedef std::istringstream istringstream_t;
|
||||
typedef std::stringstream stringstream_t;
|
||||
#define ucout std::cout
|
||||
#define ucin std::cin
|
||||
#define ucerr std::cerr
|
||||
#endif // endif _UTF16_STRINGS
|
||||
|
||||
#ifndef _TURN_OFF_PLATFORM_STRING
|
||||
// The 'U' macro can be used to create a string or character literal of the platform type, i.e. utility::char_t.
|
||||
// If you are using a library causing conflicts with 'U' macro, it can be turned off by defining the macro
|
||||
// '_TURN_OFF_PLATFORM_STRING' before including the C++ REST SDK header files, and e.g. use '_XPLATSTR' instead.
|
||||
#define U(x) _XPLATSTR(x)
|
||||
#endif // !_TURN_OFF_PLATFORM_STRING
|
||||
|
||||
} // namespace utility
|
||||
|
||||
typedef char utf8char;
|
||||
typedef std::string utf8string;
|
||||
typedef std::stringstream utf8stringstream;
|
||||
typedef std::ostringstream utf8ostringstream;
|
||||
typedef std::ostream utf8ostream;
|
||||
typedef std::istream utf8istream;
|
||||
typedef std::istringstream utf8istringstream;
|
||||
|
||||
#ifdef _UTF16_STRINGS
|
||||
typedef wchar_t utf16char;
|
||||
typedef std::wstring utf16string;
|
||||
typedef std::wstringstream utf16stringstream;
|
||||
typedef std::wostringstream utf16ostringstream;
|
||||
typedef std::wostream utf16ostream;
|
||||
typedef std::wistream utf16istream;
|
||||
typedef std::wistringstream utf16istringstream;
|
||||
#else
|
||||
typedef char16_t utf16char;
|
||||
typedef std::u16string utf16string;
|
||||
typedef std::basic_stringstream<utf16char> utf16stringstream;
|
||||
typedef std::basic_ostringstream<utf16char> utf16ostringstream;
|
||||
typedef std::basic_ostream<utf16char> utf16ostream;
|
||||
typedef std::basic_istream<utf16char> utf16istream;
|
||||
typedef std::basic_istringstream<utf16char> utf16istringstream;
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32)
|
||||
// Include on everything except Windows Desktop ARM, unless explicitly excluded.
|
||||
#if !defined(CPPREST_EXCLUDE_WEBSOCKETS)
|
||||
#if defined(WINAPI_FAMILY)
|
||||
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && defined(_M_ARM)
|
||||
#define CPPREST_EXCLUDE_WEBSOCKETS
|
||||
#endif
|
||||
#else
|
||||
#if defined(_M_ARM)
|
||||
#define CPPREST_EXCLUDE_WEBSOCKETS
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
@@ -1,91 +0,0 @@
|
||||
/***
|
||||
* Copyright (C) Microsoft. All rights reserved.
|
||||
* Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
|
||||
*
|
||||
* =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
||||
*
|
||||
* Standard macros and definitions.
|
||||
* This header has minimal dependency on windows headers and is safe for use in the public API
|
||||
*
|
||||
* For the latest on this and related APIs, please see: https://github.com/Microsoft/cpprestsdk
|
||||
*
|
||||
* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
****/
|
||||
|
||||
#pragma once
|
||||
|
||||
#if defined(_WIN32)
|
||||
|
||||
#if _MSC_VER >= 1900
|
||||
#define CPPREST_NOEXCEPT noexcept
|
||||
#define CPPREST_CONSTEXPR constexpr
|
||||
#else
|
||||
#define CPPREST_NOEXCEPT
|
||||
#define CPPREST_CONSTEXPR const
|
||||
#endif // _MSC_VER >= 1900
|
||||
|
||||
#define CASABLANCA_UNREFERENCED_PARAMETER(x) (x)
|
||||
|
||||
#include <sal.h>
|
||||
|
||||
#else // ^^^ _WIN32 ^^^ // vvv !_WIN32 vvv
|
||||
|
||||
#define __declspec(x) __attribute__((x))
|
||||
#define dllimport
|
||||
#define novtable /* no novtable equivalent */
|
||||
#define __assume(x) \
|
||||
do \
|
||||
{ \
|
||||
if (!(x)) __builtin_unreachable(); \
|
||||
} while (false)
|
||||
#define CASABLANCA_UNREFERENCED_PARAMETER(x) (void)x
|
||||
#define CPPREST_NOEXCEPT noexcept
|
||||
#define CPPREST_CONSTEXPR constexpr
|
||||
|
||||
#include <assert.h>
|
||||
#define _ASSERTE(x) assert(x)
|
||||
|
||||
// No SAL on non Windows platforms
|
||||
#include "cpprest/details/nosal.h"
|
||||
|
||||
#if !defined(__cdecl)
|
||||
#if defined(cdecl)
|
||||
#define __cdecl __attribute__((cdecl))
|
||||
#else // ^^^ defined cdecl ^^^ // vvv !defined cdecl vvv
|
||||
#define __cdecl
|
||||
#endif // defined cdecl
|
||||
#endif // not defined __cdecl
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
// This is needed to disable the use of __thread inside the boost library.
|
||||
// Android does not support thread local storage -- if boost is included
|
||||
// without this macro defined, it will create references to __tls_get_addr
|
||||
// which (while able to link) will not be available at runtime and prevent
|
||||
// the .so from loading.
|
||||
#if not defined BOOST_ASIO_DISABLE_THREAD_KEYWORD_EXTENSION
|
||||
#define BOOST_ASIO_DISABLE_THREAD_KEYWORD_EXTENSION
|
||||
#endif // not defined BOOST_ASIO_DISABLE_THREAD_KEYWORD_EXTENSION
|
||||
#endif // defined(__ANDROID__)
|
||||
|
||||
#ifdef __clang__
|
||||
#include <cstdio>
|
||||
#endif // __clang__
|
||||
#endif // _WIN32
|
||||
|
||||
#define _NO_ASYNCRTIMP
|
||||
|
||||
#ifdef _NO_ASYNCRTIMP
|
||||
#define _ASYNCRTIMP
|
||||
#else // ^^^ _NO_ASYNCRTIMP ^^^ // vvv !_NO_ASYNCRTIMP vvv
|
||||
#ifdef _ASYNCRT_EXPORT
|
||||
#define _ASYNCRTIMP __declspec(dllexport)
|
||||
#else // ^^^ _ASYNCRT_EXPORT ^^^ // vvv !_ASYNCRT_EXPORT vvv
|
||||
#define _ASYNCRTIMP __declspec(dllimport)
|
||||
#endif // _ASYNCRT_EXPORT
|
||||
#endif // _NO_ASYNCRTIMP
|
||||
|
||||
#ifdef CASABLANCA_DEPRECATION_NO_WARNINGS
|
||||
#define CASABLANCA_DEPRECATED(x)
|
||||
#else
|
||||
#define CASABLANCA_DEPRECATED(x) __declspec(deprecated(x))
|
||||
#endif // CASABLANCA_DEPRECATION_NO_WARNINGS
|
||||
@@ -1,223 +0,0 @@
|
||||
/***
|
||||
* Copyright (C) Microsoft. All rights reserved.
|
||||
* Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
|
||||
*
|
||||
* =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
||||
*
|
||||
* utility classes used by the different web:: clients
|
||||
*
|
||||
* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
****/
|
||||
#pragma once
|
||||
|
||||
#include "cpprest/asyncrt_utils.h"
|
||||
#include "cpprest/uri.h"
|
||||
|
||||
namespace web
|
||||
{
|
||||
namespace details
|
||||
{
|
||||
class zero_memory_deleter
|
||||
{
|
||||
public:
|
||||
_ASYNCRTIMP void operator()(::utility::string_t* data) const;
|
||||
};
|
||||
typedef std::unique_ptr<::utility::string_t, zero_memory_deleter> plaintext_string;
|
||||
|
||||
#if defined(_WIN32) && !defined(CPPREST_TARGET_XP)
|
||||
#if defined(__cplusplus_winrt)
|
||||
class winrt_encryption
|
||||
{
|
||||
public:
|
||||
winrt_encryption() {}
|
||||
_ASYNCRTIMP winrt_encryption(const std::wstring& data);
|
||||
_ASYNCRTIMP plaintext_string decrypt() const;
|
||||
|
||||
private:
|
||||
::pplx::task<Windows::Storage::Streams::IBuffer ^> m_buffer;
|
||||
};
|
||||
#else
|
||||
class win32_encryption
|
||||
{
|
||||
public:
|
||||
win32_encryption() {}
|
||||
_ASYNCRTIMP win32_encryption(const std::wstring& data);
|
||||
_ASYNCRTIMP ~win32_encryption();
|
||||
_ASYNCRTIMP plaintext_string decrypt() const;
|
||||
|
||||
private:
|
||||
std::vector<char> m_buffer;
|
||||
size_t m_numCharacters;
|
||||
};
|
||||
#endif
|
||||
#endif
|
||||
} // namespace details
|
||||
|
||||
/// <summary>
|
||||
/// Represents a set of user credentials (user name and password) to be used
|
||||
/// for authentication.
|
||||
/// </summary>
|
||||
class credentials
|
||||
{
|
||||
public:
|
||||
/// <summary>
|
||||
/// Constructs an empty set of credentials without a user name or password.
|
||||
/// </summary>
|
||||
credentials() {}
|
||||
|
||||
/// <summary>
|
||||
/// Constructs credentials from given user name and password.
|
||||
/// </summary>
|
||||
/// <param name="username">User name as a string.</param>
|
||||
/// <param name="password">Password as a string.</param>
|
||||
credentials(utility::string_t username, const utility::string_t& password)
|
||||
: m_username(std::move(username)), m_password(password)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The user name associated with the credentials.
|
||||
/// </summary>
|
||||
/// <returns>A string containing the user name.</returns>
|
||||
const utility::string_t& username() const { return m_username; }
|
||||
|
||||
/// <summary>
|
||||
/// The password for the user name associated with the credentials.
|
||||
/// </summary>
|
||||
/// <returns>A string containing the password.</returns>
|
||||
CASABLANCA_DEPRECATED(
|
||||
"This API is deprecated for security reasons to avoid unnecessary password copies stored in plaintext.")
|
||||
utility::string_t password() const
|
||||
{
|
||||
#if defined(_WIN32) && !defined(CPPREST_TARGET_XP)
|
||||
return utility::string_t(*m_password.decrypt());
|
||||
#else
|
||||
return m_password;
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if credentials have been set
|
||||
/// </summary>
|
||||
/// <returns><c>true</c> if user name and password is set, <c>false</c> otherwise.</returns>
|
||||
bool is_set() const { return !m_username.empty(); }
|
||||
|
||||
details::plaintext_string _internal_decrypt() const
|
||||
{
|
||||
// Encryption APIs not supported on XP
|
||||
#if defined(_WIN32) && !defined(CPPREST_TARGET_XP)
|
||||
return m_password.decrypt();
|
||||
#else
|
||||
return details::plaintext_string(new ::utility::string_t(m_password));
|
||||
#endif
|
||||
}
|
||||
|
||||
private:
|
||||
::utility::string_t m_username;
|
||||
|
||||
#if defined(_WIN32) && !defined(CPPREST_TARGET_XP)
|
||||
#if defined(__cplusplus_winrt)
|
||||
details::winrt_encryption m_password;
|
||||
#else
|
||||
details::win32_encryption m_password;
|
||||
#endif
|
||||
#else
|
||||
::utility::string_t m_password;
|
||||
#endif
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// web_proxy represents the concept of the web proxy, which can be auto-discovered,
|
||||
/// disabled, or specified explicitly by the user.
|
||||
/// </summary>
|
||||
class web_proxy
|
||||
{
|
||||
enum web_proxy_mode_internal
|
||||
{
|
||||
use_default_,
|
||||
use_auto_discovery_,
|
||||
disabled_,
|
||||
user_provided_
|
||||
};
|
||||
|
||||
public:
|
||||
enum web_proxy_mode
|
||||
{
|
||||
use_default = use_default_,
|
||||
use_auto_discovery = use_auto_discovery_,
|
||||
disabled = disabled_
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Constructs a proxy with the default settings.
|
||||
/// </summary>
|
||||
web_proxy() : m_address(_XPLATSTR("")), m_mode(use_default_) {}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a proxy with specified mode.
|
||||
/// </summary>
|
||||
/// <param name="mode">Mode to use.</param>
|
||||
web_proxy(web_proxy_mode mode) : m_address(_XPLATSTR("")), m_mode(static_cast<web_proxy_mode_internal>(mode)) {}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a proxy explicitly with provided address.
|
||||
/// </summary>
|
||||
/// <param name="address">Proxy URI to use.</param>
|
||||
web_proxy(uri address) : m_address(address), m_mode(user_provided_) {}
|
||||
|
||||
/// <summary>
|
||||
/// Gets this proxy's URI address. Returns an empty URI if not explicitly set by user.
|
||||
/// </summary>
|
||||
/// <returns>A reference to this proxy's URI.</returns>
|
||||
const uri& address() const { return m_address; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the credentials used for authentication with this proxy.
|
||||
/// </summary>
|
||||
/// <returns>Credentials to for this proxy.</returns>
|
||||
const web::credentials& credentials() const { return m_credentials; }
|
||||
|
||||
/// <summary>
|
||||
/// Sets the credentials to use for authentication with this proxy.
|
||||
/// </summary>
|
||||
/// <param name="cred">Credentials to use for this proxy.</param>
|
||||
void set_credentials(web::credentials cred)
|
||||
{
|
||||
if (m_mode == disabled_)
|
||||
{
|
||||
throw std::invalid_argument("Cannot attach credentials to a disabled proxy");
|
||||
}
|
||||
m_credentials = std::move(cred);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if this proxy was constructed with default settings.
|
||||
/// </summary>
|
||||
/// <returns>True if default, false otherwise.</param>
|
||||
bool is_default() const { return m_mode == use_default_; }
|
||||
|
||||
/// <summary>
|
||||
/// Checks if using a proxy is disabled.
|
||||
/// </summary>
|
||||
/// <returns>True if disabled, false otherwise.</returns>
|
||||
bool is_disabled() const { return m_mode == disabled_; }
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the auto discovery protocol, WPAD, is to be used.
|
||||
/// </summary>
|
||||
/// <returns>True if auto discovery enabled, false otherwise.</returns>
|
||||
bool is_auto_discovery() const { return m_mode == use_auto_discovery_; }
|
||||
|
||||
/// <summary>
|
||||
/// Checks if a proxy address is explicitly specified by the user.
|
||||
/// </summary>
|
||||
/// <returns>True if a proxy address was explicitly specified, false otherwise.</returns>
|
||||
bool is_specified() const { return m_mode == user_provided_; }
|
||||
|
||||
private:
|
||||
web::uri m_address;
|
||||
web_proxy_mode_internal m_mode;
|
||||
web::credentials m_credentials;
|
||||
};
|
||||
|
||||
} // namespace web
|
||||
1786
deps/cpprestsdk/include/cpprest/json.h
vendored
21
deps/cpprestsdk/include/cpprest/uri.h
vendored
@@ -1,21 +0,0 @@
|
||||
/***
|
||||
* Copyright (C) Microsoft. All rights reserved.
|
||||
* Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
|
||||
*
|
||||
* =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
||||
*
|
||||
* Protocol independent support for URIs.
|
||||
*
|
||||
* For the latest on this and related APIs, please see: https://github.com/Microsoft/cpprestsdk
|
||||
*
|
||||
* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
****/
|
||||
#pragma once
|
||||
|
||||
#ifndef CASA_URI_H
|
||||
#define CASA_URI_H
|
||||
|
||||
#include "cpprest/base_uri.h"
|
||||
#include "cpprest/uri_builder.h"
|
||||
|
||||
#endif
|
||||
295
deps/cpprestsdk/include/cpprest/uri_builder.h
vendored
@@ -1,295 +0,0 @@
|
||||
/***
|
||||
* Copyright (C) Microsoft. All rights reserved.
|
||||
* Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
|
||||
*
|
||||
* =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
||||
*
|
||||
* Builder style class for creating URIs.
|
||||
*
|
||||
* For the latest on this and related APIs, please see: https://github.com/Microsoft/cpprestsdk
|
||||
*
|
||||
* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
****/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cpprest/base_uri.h"
|
||||
#include <string>
|
||||
|
||||
namespace web
|
||||
{
|
||||
/// <summary>
|
||||
/// Builder for constructing URIs incrementally.
|
||||
/// </summary>
|
||||
class uri_builder
|
||||
{
|
||||
public:
|
||||
/// <summary>
|
||||
/// Creates a builder with an initially empty URI.
|
||||
/// </summary>
|
||||
uri_builder() = default;
|
||||
|
||||
/// <summary>
|
||||
/// Creates a builder with a existing URI object.
|
||||
/// </summary>
|
||||
/// <param name="uri_str">Encoded string containing the URI.</param>
|
||||
uri_builder(const uri& uri_str) : m_uri(uri_str.m_components) {}
|
||||
|
||||
/// <summary>
|
||||
/// Get the scheme component of the URI as an encoded string.
|
||||
/// </summary>
|
||||
/// <returns>The URI scheme as a string.</returns>
|
||||
const utility::string_t& scheme() const { return m_uri.m_scheme; }
|
||||
|
||||
/// <summary>
|
||||
/// Get the user information component of the URI as an encoded string.
|
||||
/// </summary>
|
||||
/// <returns>The URI user information as a string.</returns>
|
||||
const utility::string_t& user_info() const { return m_uri.m_user_info; }
|
||||
|
||||
/// <summary>
|
||||
/// Get the host component of the URI as an encoded string.
|
||||
/// </summary>
|
||||
/// <returns>The URI host as a string.</returns>
|
||||
const utility::string_t& host() const { return m_uri.m_host; }
|
||||
|
||||
/// <summary>
|
||||
/// Get the port component of the URI. Returns -1 if no port is specified.
|
||||
/// </summary>
|
||||
/// <returns>The URI port as an integer.</returns>
|
||||
int port() const { return m_uri.m_port; }
|
||||
|
||||
/// <summary>
|
||||
/// Get the path component of the URI as an encoded string.
|
||||
/// </summary>
|
||||
/// <returns>The URI path as a string.</returns>
|
||||
const utility::string_t& path() const { return m_uri.m_path; }
|
||||
|
||||
/// <summary>
|
||||
/// Get the query component of the URI as an encoded string.
|
||||
/// </summary>
|
||||
/// <returns>The URI query as a string.</returns>
|
||||
const utility::string_t& query() const { return m_uri.m_query; }
|
||||
|
||||
/// <summary>
|
||||
/// Get the fragment component of the URI as an encoded string.
|
||||
/// </summary>
|
||||
/// <returns>The URI fragment as a string.</returns>
|
||||
const utility::string_t& fragment() const { return m_uri.m_fragment; }
|
||||
|
||||
/// <summary>
|
||||
/// Set the scheme of the URI.
|
||||
/// </summary>
|
||||
/// <param name="scheme">Uri scheme.</param>
|
||||
/// <returns>A reference to this <c>uri_builder</c> to support chaining.</returns>
|
||||
uri_builder& set_scheme(const utility::string_t& scheme)
|
||||
{
|
||||
m_uri.m_scheme = scheme;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the user info component of the URI.
|
||||
/// </summary>
|
||||
/// <param name="user_info">User info as a decoded string.</param>
|
||||
/// <param name="do_encoding">Specify whether to apply URI encoding to the given string.</param>
|
||||
/// <returns>A reference to this <c>uri_builder</c> to support chaining.</returns>
|
||||
uri_builder& set_user_info(const utility::string_t& user_info, bool do_encoding = false)
|
||||
{
|
||||
if (do_encoding)
|
||||
{
|
||||
m_uri.m_user_info = uri::encode_uri(user_info, uri::components::user_info);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_uri.m_user_info = user_info;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the host component of the URI.
|
||||
/// </summary>
|
||||
/// <param name="host">Host as a decoded string.</param>
|
||||
/// <param name="do_encoding">Specify whether to apply URI encoding to the given string.</param>
|
||||
/// <returns>A reference to this <c>uri_builder</c> to support chaining.</returns>
|
||||
uri_builder& set_host(const utility::string_t& host, bool do_encoding = false)
|
||||
{
|
||||
if (do_encoding)
|
||||
{
|
||||
m_uri.m_host = uri::encode_uri(host, uri::components::host);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_uri.m_host = host;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the port component of the URI.
|
||||
/// </summary>
|
||||
/// <param name="port">Port as an integer.</param>
|
||||
/// <returns>A reference to this <c>uri_builder</c> to support chaining.</returns>
|
||||
uri_builder& set_port(int port)
|
||||
{
|
||||
m_uri.m_port = port;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the port component of the URI.
|
||||
/// </summary>
|
||||
/// <param name="port">Port as a string.</param>
|
||||
/// <returns>A reference to this <c>uri_builder</c> to support chaining.</returns>
|
||||
/// <remarks>When string can't be converted to an integer the port is left unchanged.</remarks>
|
||||
_ASYNCRTIMP uri_builder& set_port(const utility::string_t& port);
|
||||
|
||||
/// <summary>
|
||||
/// Set the path component of the URI.
|
||||
/// </summary>
|
||||
/// <param name="path">Path as a decoded string.</param>
|
||||
/// <param name="do_encoding">Specify whether to apply URI encoding to the given string.</param>
|
||||
/// <returns>A reference to this <c>uri_builder</c> to support chaining.</returns>
|
||||
uri_builder& set_path(const utility::string_t& path, bool do_encoding = false)
|
||||
{
|
||||
if (do_encoding)
|
||||
{
|
||||
m_uri.m_path = uri::encode_uri(path, uri::components::path);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_uri.m_path = path;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the query component of the URI.
|
||||
/// </summary>
|
||||
/// <param name="query">Query as a decoded string.</param>
|
||||
/// <param name="do_encoding">Specify whether apply URI encoding to the given string.</param>
|
||||
/// <returns>A reference to this <c>uri_builder</c> to support chaining.</returns>
|
||||
uri_builder& set_query(const utility::string_t& query, bool do_encoding = false)
|
||||
{
|
||||
if (do_encoding)
|
||||
{
|
||||
m_uri.m_query = uri::encode_uri(query, uri::components::query);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_uri.m_query = query;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the fragment component of the URI.
|
||||
/// </summary>
|
||||
/// <param name="fragment">Fragment as a decoded string.</param>
|
||||
/// <param name="do_encoding">Specify whether to apply URI encoding to the given string.</param>
|
||||
/// <returns>A reference to this <c>uri_builder</c> to support chaining.</returns>
|
||||
uri_builder& set_fragment(const utility::string_t& fragment, bool do_encoding = false)
|
||||
{
|
||||
if (do_encoding)
|
||||
{
|
||||
m_uri.m_fragment = uri::encode_uri(fragment, uri::components::fragment);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_uri.m_fragment = fragment;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clears all components of the underlying URI in this uri_builder.
|
||||
/// </summary>
|
||||
void clear() { m_uri = details::uri_components(); }
|
||||
|
||||
/// <summary>
|
||||
/// Appends another path to the path of this uri_builder.
|
||||
/// </summary>
|
||||
/// <param name="path">Path to append as a already encoded string.</param>
|
||||
/// <param name="do_encoding">Specify whether to apply URI encoding to the given string.</param>
|
||||
/// <returns>A reference to this uri_builder to support chaining.</returns>
|
||||
_ASYNCRTIMP uri_builder& append_path(const utility::string_t& path, bool do_encoding = false);
|
||||
|
||||
/// <summary>
|
||||
/// Appends the raw contents of the path argument to the path of this uri_builder with no separator de-duplication.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The path argument is appended after adding a '/' separator without regards to the contents of path. If an empty
|
||||
/// string is provided, this function will immediately return without changes to the stored path value. For example:
|
||||
/// if the current contents are "/abc" and path="/xyz", the result will be "/abc//xyz".
|
||||
/// </remarks>
|
||||
/// <param name="path">Path to append as a already encoded string.</param>
|
||||
/// <param name="do_encoding">Specify whether to apply URI encoding to the given string.</param>
|
||||
/// <returns>A reference to this uri_builder to support chaining.</returns>
|
||||
_ASYNCRTIMP uri_builder& append_path_raw(const utility::string_t& path, bool do_encoding = false);
|
||||
|
||||
/// <summary>
|
||||
/// Appends another query to the query of this uri_builder.
|
||||
/// </summary>
|
||||
/// <param name="query">Query to append as a decoded string.</param>
|
||||
/// <param name="do_encoding">Specify whether to apply URI encoding to the given string.</param>
|
||||
/// <returns>A reference to this uri_builder to support chaining.</returns>
|
||||
_ASYNCRTIMP uri_builder& append_query(const utility::string_t& query, bool do_encoding = false);
|
||||
|
||||
/// <summary>
|
||||
/// Appends an relative uri (Path, Query and fragment) at the end of the current uri.
|
||||
/// </summary>
|
||||
/// <param name="relative_uri">The relative uri to append.</param>
|
||||
/// <returns>A reference to this uri_builder to support chaining.</returns>
|
||||
_ASYNCRTIMP uri_builder& append(const uri& relative_uri);
|
||||
|
||||
/// <summary>
|
||||
/// Appends another query to the query of this uri_builder, encoding it first. This overload is useful when building
|
||||
/// a query segment of the form "element=10", where the right hand side of the query is stored as a type other than
|
||||
/// a string, for instance, an integral type.
|
||||
/// </summary>
|
||||
/// <param name="name">The name portion of the query string</param>
|
||||
/// <param name="value">The value portion of the query string</param>
|
||||
/// <returns>A reference to this uri_builder to support chaining.</returns>
|
||||
template<typename T>
|
||||
uri_builder& append_query(const utility::string_t& name, const T& value, bool do_encoding = true)
|
||||
{
|
||||
if (do_encoding)
|
||||
append_query_encode_impl(name, utility::conversions::details::print_utf8string(value));
|
||||
else
|
||||
append_query_no_encode_impl(name, utility::conversions::details::print_string(value));
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Combine and validate the URI components into a encoded string. An exception will be thrown if the URI is
|
||||
/// invalid.
|
||||
/// </summary>
|
||||
/// <returns>The created URI as a string.</returns>
|
||||
_ASYNCRTIMP utility::string_t to_string() const;
|
||||
|
||||
/// <summary>
|
||||
/// Combine and validate the URI components into a URI class instance. An exception will be thrown if the URI is
|
||||
/// invalid.
|
||||
/// </summary>
|
||||
/// <returns>The create URI as a URI class instance.</returns>
|
||||
_ASYNCRTIMP uri to_uri() const;
|
||||
|
||||
/// <summary>
|
||||
/// Validate the generated URI from all existing components of this uri_builder.
|
||||
/// </summary>
|
||||
/// <returns>Whether the URI is valid.</returns>
|
||||
_ASYNCRTIMP bool is_valid();
|
||||
|
||||
private:
|
||||
_ASYNCRTIMP void append_query_encode_impl(const utility::string_t& name, const utf8string& value);
|
||||
_ASYNCRTIMP void append_query_no_encode_impl(const utility::string_t& name, const utility::string_t& value);
|
||||
|
||||
details::uri_components m_uri;
|
||||
};
|
||||
} // namespace web
|
||||
10
deps/cpprestsdk/include/cpprest/version.h
vendored
@@ -1,10 +0,0 @@
|
||||
/***
|
||||
* Copyright (C) Microsoft. All rights reserved.
|
||||
* Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
|
||||
*
|
||||
*/
|
||||
#define CPPREST_VERSION_MINOR 10
|
||||
#define CPPREST_VERSION_MAJOR 2
|
||||
#define CPPREST_VERSION_REVISION 13
|
||||
|
||||
#define CPPREST_VERSION (CPPREST_VERSION_MAJOR * 100000 + CPPREST_VERSION_MINOR * 100 + CPPREST_VERSION_REVISION)
|
||||
34
deps/cpprestsdk/pch.h
vendored
@@ -1,34 +0,0 @@
|
||||
#include <winrt/base.h>
|
||||
#include <Windows.h>
|
||||
#include <dxgi1_3.h>
|
||||
#include <d3d11_2.h>
|
||||
#include <d2d1_3.h>
|
||||
#include <d2d1_3helper.h>
|
||||
#include <d2d1helper.h>
|
||||
#include <dwrite.h>
|
||||
#include <dcomp.h>
|
||||
#include <dwmapi.h>
|
||||
#include <Shobjidl.h>
|
||||
#include <Shlwapi.h>
|
||||
#include <string>
|
||||
#include <algorithm>
|
||||
#include <chrono>
|
||||
#include <mutex>
|
||||
#include <thread>
|
||||
#include <functional>
|
||||
#include <condition_variable>
|
||||
#include <stdexcept>
|
||||
#include <tuple>
|
||||
#include <unordered_set>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
// cpprestsdk headers
|
||||
#include "cpprest/details/basic_types.h"
|
||||
#include "cpprest/details/cpprest_compat.h"
|
||||
#include "cpprest/version.h"
|
||||
// json
|
||||
#include "cpprest/json.h"
|
||||
// utilities
|
||||
#include "cpprest/asyncrt_utils.h"
|
||||
#include "cpprest/details/web_utilities.h"
|
||||
475
deps/cpprestsdk/src/json/json.cpp
vendored
@@ -1,475 +0,0 @@
|
||||
/***
|
||||
* Copyright (C) Microsoft. All rights reserved.
|
||||
* Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
|
||||
*
|
||||
* =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
||||
*
|
||||
* HTTP Library: JSON parser and writer
|
||||
*
|
||||
* For the latest on this and related APIs, please see: https://github.com/Microsoft/cpprestsdk
|
||||
*
|
||||
* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
****/
|
||||
|
||||
#include "pch.h"
|
||||
|
||||
using namespace web;
|
||||
|
||||
bool json::details::g_keep_json_object_unsorted = false;
|
||||
void json::keep_object_element_order(bool keep_order) { json::details::g_keep_json_object_unsorted = keep_order; }
|
||||
|
||||
utility::ostream_t& web::json::operator<<(utility::ostream_t& os, const web::json::value& val)
|
||||
{
|
||||
val.serialize(os);
|
||||
return os;
|
||||
}
|
||||
|
||||
utility::istream_t& web::json::operator>>(utility::istream_t& is, json::value& val)
|
||||
{
|
||||
val = json::value::parse(is);
|
||||
return is;
|
||||
}
|
||||
|
||||
web::json::value::value()
|
||||
: m_value(utility::details::make_unique<web::json::details::_Null>())
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
, m_kind(value::Null)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
|
||||
web::json::value::value(int32_t value)
|
||||
: m_value(utility::details::make_unique<web::json::details::_Number>(value))
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
, m_kind(value::Number)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
|
||||
web::json::value::value(uint32_t value)
|
||||
: m_value(utility::details::make_unique<web::json::details::_Number>(value))
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
, m_kind(value::Number)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
|
||||
web::json::value::value(int64_t value)
|
||||
: m_value(utility::details::make_unique<web::json::details::_Number>(value))
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
, m_kind(value::Number)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
|
||||
web::json::value::value(uint64_t value)
|
||||
: m_value(utility::details::make_unique<web::json::details::_Number>(value))
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
, m_kind(value::Number)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
|
||||
web::json::value::value(double value)
|
||||
: m_value(utility::details::make_unique<web::json::details::_Number>(value))
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
, m_kind(value::Number)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
|
||||
web::json::value::value(bool value)
|
||||
: m_value(utility::details::make_unique<web::json::details::_Boolean>(value))
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
, m_kind(value::Boolean)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
|
||||
web::json::value::value(utility::string_t value)
|
||||
: m_value(utility::details::make_unique<web::json::details::_String>(std::move(value)))
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
, m_kind(value::String)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
|
||||
web::json::value::value(utility::string_t value, bool has_escape_chars)
|
||||
: m_value(utility::details::make_unique<web::json::details::_String>(std::move(value), has_escape_chars))
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
, m_kind(value::String)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
|
||||
web::json::value::value(const utility::char_t* value)
|
||||
: m_value(utility::details::make_unique<web::json::details::_String>(value))
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
, m_kind(value::String)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
|
||||
web::json::value::value(const utility::char_t* value, bool has_escape_chars)
|
||||
: m_value(utility::details::make_unique<web::json::details::_String>(utility::string_t(value), has_escape_chars))
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
, m_kind(value::String)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
|
||||
web::json::value::value(const value& other)
|
||||
: m_value(other.m_value->_copy_value())
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
, m_kind(other.m_kind)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
|
||||
web::json::value& web::json::value::operator=(const value& other)
|
||||
{
|
||||
if (this != &other)
|
||||
{
|
||||
m_value = std::unique_ptr<details::_Value>(other.m_value->_copy_value());
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
m_kind = other.m_kind;
|
||||
#endif
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
web::json::value::value(value&& other) CPPREST_NOEXCEPT : m_value(std::move(other.m_value))
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
,
|
||||
m_kind(other.m_kind)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
|
||||
web::json::value& web::json::value::operator=(web::json::value&& other) CPPREST_NOEXCEPT
|
||||
{
|
||||
if (this != &other)
|
||||
{
|
||||
m_value.swap(other.m_value);
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
m_kind = other.m_kind;
|
||||
#endif
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
web::json::value web::json::value::null() { return web::json::value(); }
|
||||
|
||||
web::json::value web::json::value::number(double value) { return web::json::value(value); }
|
||||
|
||||
web::json::value web::json::value::number(int32_t value) { return web::json::value(value); }
|
||||
|
||||
web::json::value web::json::value::number(uint32_t value) { return web::json::value(value); }
|
||||
|
||||
web::json::value web::json::value::number(int64_t value) { return web::json::value(value); }
|
||||
|
||||
web::json::value web::json::value::number(uint64_t value) { return web::json::value(value); }
|
||||
|
||||
web::json::value web::json::value::boolean(bool value) { return web::json::value(value); }
|
||||
|
||||
web::json::value web::json::value::string(utility::string_t value)
|
||||
{
|
||||
std::unique_ptr<details::_Value> ptr = utility::details::make_unique<details::_String>(std::move(value));
|
||||
return web::json::value(std::move(ptr)
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
,
|
||||
value::String
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
web::json::value web::json::value::string(utility::string_t value, bool has_escape_chars)
|
||||
{
|
||||
std::unique_ptr<details::_Value> ptr =
|
||||
utility::details::make_unique<details::_String>(std::move(value), has_escape_chars);
|
||||
return web::json::value(std::move(ptr)
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
,
|
||||
value::String
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
web::json::value web::json::value::string(const std::string& value)
|
||||
{
|
||||
std::unique_ptr<details::_Value> ptr =
|
||||
utility::details::make_unique<details::_String>(utility::conversions::to_utf16string(value));
|
||||
return web::json::value(std::move(ptr)
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
,
|
||||
value::String
|
||||
#endif
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
web::json::value web::json::value::object(bool keep_order)
|
||||
{
|
||||
std::unique_ptr<details::_Value> ptr = utility::details::make_unique<details::_Object>(keep_order);
|
||||
return web::json::value(std::move(ptr)
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
,
|
||||
value::Object
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
web::json::value web::json::value::object(std::vector<std::pair<::utility::string_t, value>> fields, bool keep_order)
|
||||
{
|
||||
std::unique_ptr<details::_Value> ptr =
|
||||
utility::details::make_unique<details::_Object>(std::move(fields), keep_order);
|
||||
return web::json::value(std::move(ptr)
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
,
|
||||
value::Object
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
web::json::value web::json::value::array()
|
||||
{
|
||||
std::unique_ptr<details::_Value> ptr = utility::details::make_unique<details::_Array>();
|
||||
return web::json::value(std::move(ptr)
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
,
|
||||
value::Array
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
web::json::value web::json::value::array(size_t size)
|
||||
{
|
||||
std::unique_ptr<details::_Value> ptr = utility::details::make_unique<details::_Array>(size);
|
||||
return web::json::value(std::move(ptr)
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
,
|
||||
value::Array
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
web::json::value web::json::value::array(std::vector<value> elements)
|
||||
{
|
||||
std::unique_ptr<details::_Value> ptr = utility::details::make_unique<details::_Array>(std::move(elements));
|
||||
return web::json::value(std::move(ptr)
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
,
|
||||
value::Array
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
const web::json::number& web::json::value::as_number() const { return m_value->as_number(); }
|
||||
|
||||
double web::json::value::as_double() const { return m_value->as_double(); }
|
||||
|
||||
int web::json::value::as_integer() const { return m_value->as_integer(); }
|
||||
|
||||
bool web::json::value::as_bool() const { return m_value->as_bool(); }
|
||||
|
||||
json::array& web::json::value::as_array() { return m_value->as_array(); }
|
||||
|
||||
const json::array& web::json::value::as_array() const { return m_value->as_array(); }
|
||||
|
||||
json::object& web::json::value::as_object() { return m_value->as_object(); }
|
||||
|
||||
const json::object& web::json::value::as_object() const { return m_value->as_object(); }
|
||||
|
||||
bool web::json::number::is_int32() const
|
||||
{
|
||||
switch (m_type)
|
||||
{
|
||||
case signed_type:
|
||||
return m_intval >= (std::numeric_limits<int32_t>::min)() && m_intval <= (std::numeric_limits<int32_t>::max)();
|
||||
case unsigned_type: return m_uintval <= (std::numeric_limits<int32_t>::max)();
|
||||
case double_type:
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool web::json::number::is_uint32() const
|
||||
{
|
||||
switch (m_type)
|
||||
{
|
||||
case signed_type: return m_intval >= 0 && m_intval <= (std::numeric_limits<uint32_t>::max)();
|
||||
case unsigned_type: return m_uintval <= (std::numeric_limits<uint32_t>::max)();
|
||||
case double_type:
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool web::json::number::is_int64() const
|
||||
{
|
||||
switch (m_type)
|
||||
{
|
||||
case signed_type: return true;
|
||||
case unsigned_type: return m_uintval <= static_cast<uint64_t>((std::numeric_limits<int64_t>::max)());
|
||||
case double_type:
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool web::json::details::_String::has_escape_chars(const _String& str)
|
||||
{
|
||||
return std::any_of(std::begin(str.m_string), std::end(str.m_string), [](utility::string_t::value_type const x) {
|
||||
if (x <= 31)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (x == '"')
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (x == '\\')
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
web::json::value::value_type json::value::type() const { return m_value->type(); }
|
||||
|
||||
bool json::value::is_integer() const
|
||||
{
|
||||
if (!is_number())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return m_value->is_integer();
|
||||
}
|
||||
|
||||
bool json::value::is_double() const
|
||||
{
|
||||
if (!is_number())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return m_value->is_double();
|
||||
}
|
||||
|
||||
json::value& web::json::details::_Object::index(const utility::string_t& key) { return m_object[key]; }
|
||||
|
||||
bool web::json::details::_Object::has_field(const utility::string_t& key) const
|
||||
{
|
||||
return m_object.find(key) != m_object.end();
|
||||
}
|
||||
|
||||
bool web::json::value::has_number_field(const utility::string_t& key) const
|
||||
{
|
||||
return has_field(key) && at(key).is_number();
|
||||
}
|
||||
|
||||
bool web::json::value::has_integer_field(const utility::string_t& key) const
|
||||
{
|
||||
return has_field(key) && at(key).is_integer();
|
||||
}
|
||||
|
||||
bool web::json::value::has_double_field(const utility::string_t& key) const
|
||||
{
|
||||
return has_field(key) && at(key).is_double();
|
||||
}
|
||||
|
||||
bool web::json::value::has_boolean_field(const utility::string_t& key) const
|
||||
{
|
||||
return has_field(key) && at(key).is_boolean();
|
||||
}
|
||||
|
||||
bool web::json::value::has_string_field(const utility::string_t& key) const
|
||||
{
|
||||
return has_field(key) && at(key).is_string();
|
||||
}
|
||||
|
||||
bool web::json::value::has_array_field(const utility::string_t& key) const
|
||||
{
|
||||
return has_field(key) && at(key).is_array();
|
||||
}
|
||||
|
||||
bool web::json::value::has_object_field(const utility::string_t& key) const
|
||||
{
|
||||
return has_field(key) && at(key).is_object();
|
||||
}
|
||||
|
||||
utility::string_t json::value::to_string() const
|
||||
{
|
||||
#ifndef _WIN32
|
||||
utility::details::scoped_c_thread_locale locale;
|
||||
#endif
|
||||
return m_value->to_string();
|
||||
}
|
||||
|
||||
bool json::value::operator==(const json::value& other) const
|
||||
{
|
||||
if (this->m_value.get() == other.m_value.get()) return true;
|
||||
if (this->type() != other.type()) return false;
|
||||
|
||||
switch (this->type())
|
||||
{
|
||||
case Null: return true;
|
||||
case Number: return this->as_number() == other.as_number();
|
||||
case Boolean: return this->as_bool() == other.as_bool();
|
||||
case String: return this->as_string() == other.as_string();
|
||||
case Object:
|
||||
return static_cast<const json::details::_Object*>(this->m_value.get())
|
||||
->is_equal(static_cast<const json::details::_Object*>(other.m_value.get()));
|
||||
case Array:
|
||||
return static_cast<const json::details::_Array*>(this->m_value.get())
|
||||
->is_equal(static_cast<const json::details::_Array*>(other.m_value.get()));
|
||||
}
|
||||
__assume(0);
|
||||
}
|
||||
|
||||
void web::json::value::erase(size_t index) { return this->as_array().erase(index); }
|
||||
|
||||
void web::json::value::erase(const utility::string_t& key) { return this->as_object().erase(key); }
|
||||
|
||||
// at() overloads
|
||||
web::json::value& web::json::value::at(size_t index) { return this->as_array().at(index); }
|
||||
|
||||
const web::json::value& web::json::value::at(size_t index) const { return this->as_array().at(index); }
|
||||
|
||||
web::json::value& web::json::value::at(const utility::string_t& key) { return this->as_object().at(key); }
|
||||
|
||||
const web::json::value& web::json::value::at(const utility::string_t& key) const { return this->as_object().at(key); }
|
||||
|
||||
web::json::value& web::json::value::operator[](const utility::string_t& key)
|
||||
{
|
||||
if (this->is_null())
|
||||
{
|
||||
m_value.reset(new web::json::details::_Object(details::g_keep_json_object_unsorted));
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
m_kind = value::Object;
|
||||
#endif
|
||||
}
|
||||
return m_value->index(key);
|
||||
}
|
||||
|
||||
web::json::value& web::json::value::operator[](size_t index)
|
||||
{
|
||||
if (this->is_null())
|
||||
{
|
||||
m_value.reset(new web::json::details::_Array());
|
||||
#ifdef ENABLE_JSON_VALUE_VISUALIZER
|
||||
m_kind = value::Array;
|
||||
#endif
|
||||
}
|
||||
return m_value->index(index);
|
||||
}
|
||||
|
||||
// Remove once VS 2013 is no longer supported.
|
||||
#if defined(_WIN32) && _MSC_VER < 1900
|
||||
static web::json::details::json_error_category_impl instance;
|
||||
#endif
|
||||
const web::json::details::json_error_category_impl& web::json::details::json_error_category()
|
||||
{
|
||||
#if !defined(_WIN32) || _MSC_VER >= 1900
|
||||
static web::json::details::json_error_category_impl instance;
|
||||
#endif
|
||||
return instance;
|
||||
}
|
||||
1279
deps/cpprestsdk/src/json/json_parsing.cpp
vendored
254
deps/cpprestsdk/src/json/json_serialization.cpp
vendored
@@ -1,254 +0,0 @@
|
||||
/***
|
||||
* Copyright (C) Microsoft. All rights reserved.
|
||||
* Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
|
||||
*
|
||||
* =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
||||
*
|
||||
* HTTP Library: JSON parser and writer
|
||||
*
|
||||
* For the latest on this and related APIs, please see: https://github.com/Microsoft/cpprestsdk
|
||||
*
|
||||
* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
****/
|
||||
|
||||
#include "pch.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef _WIN32
|
||||
#define __STDC_FORMAT_MACROS
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
|
||||
using namespace web;
|
||||
using namespace web::json;
|
||||
using namespace utility;
|
||||
using namespace utility::conversions;
|
||||
|
||||
//
|
||||
// JSON Serialization
|
||||
//
|
||||
|
||||
#ifdef _WIN32
|
||||
void web::json::value::serialize(std::ostream& stream) const
|
||||
{
|
||||
// This has better performance than writing directly to stream.
|
||||
std::string str;
|
||||
m_value->serialize_impl(str);
|
||||
stream << str;
|
||||
}
|
||||
void web::json::value::format(std::basic_string<wchar_t>& string) const { m_value->format(string); }
|
||||
#endif
|
||||
|
||||
void web::json::value::serialize(utility::ostream_t& stream) const
|
||||
{
|
||||
#ifndef _WIN32
|
||||
utility::details::scoped_c_thread_locale locale;
|
||||
#endif
|
||||
|
||||
// This has better performance than writing directly to stream.
|
||||
utility::string_t str;
|
||||
m_value->serialize_impl(str);
|
||||
stream << str;
|
||||
}
|
||||
|
||||
void web::json::value::format(std::basic_string<char>& string) const { m_value->format(string); }
|
||||
|
||||
template<typename CharType>
|
||||
void web::json::details::append_escape_string(std::basic_string<CharType>& str,
|
||||
const std::basic_string<CharType>& escaped)
|
||||
{
|
||||
for (const auto& ch : escaped)
|
||||
{
|
||||
switch (ch)
|
||||
{
|
||||
case '\"':
|
||||
str += '\\';
|
||||
str += '\"';
|
||||
break;
|
||||
case '\\':
|
||||
str += '\\';
|
||||
str += '\\';
|
||||
break;
|
||||
case '\b':
|
||||
str += '\\';
|
||||
str += 'b';
|
||||
break;
|
||||
case '\f':
|
||||
str += '\\';
|
||||
str += 'f';
|
||||
break;
|
||||
case '\r':
|
||||
str += '\\';
|
||||
str += 'r';
|
||||
break;
|
||||
case '\n':
|
||||
str += '\\';
|
||||
str += 'n';
|
||||
break;
|
||||
case '\t':
|
||||
str += '\\';
|
||||
str += 't';
|
||||
break;
|
||||
default:
|
||||
|
||||
// If a control character then must unicode escaped.
|
||||
if (ch >= 0 && ch <= 0x1F)
|
||||
{
|
||||
static const std::array<CharType, 16> intToHex = {
|
||||
{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}};
|
||||
str += '\\';
|
||||
str += 'u';
|
||||
str += '0';
|
||||
str += '0';
|
||||
str += intToHex[(ch & 0xF0) >> 4];
|
||||
str += intToHex[ch & 0x0F];
|
||||
}
|
||||
else
|
||||
{
|
||||
str += ch;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void web::json::details::format_string(const utility::string_t& key, utility::string_t& str)
|
||||
{
|
||||
str.push_back('"');
|
||||
append_escape_string(str, key);
|
||||
str.push_back('"');
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
void web::json::details::format_string(const utility::string_t& key, std::string& str)
|
||||
{
|
||||
str.push_back('"');
|
||||
append_escape_string(str, utility::conversions::to_utf8string(key));
|
||||
str.push_back('"');
|
||||
}
|
||||
#endif
|
||||
|
||||
void web::json::details::_String::format(std::basic_string<char>& str) const
|
||||
{
|
||||
str.push_back('"');
|
||||
|
||||
if (m_has_escape_char)
|
||||
{
|
||||
append_escape_string(str, utility::conversions::to_utf8string(m_string));
|
||||
}
|
||||
else
|
||||
{
|
||||
str.append(utility::conversions::to_utf8string(m_string));
|
||||
}
|
||||
|
||||
str.push_back('"');
|
||||
}
|
||||
|
||||
void web::json::details::_Number::format(std::basic_string<char>& stream) const
|
||||
{
|
||||
if (m_number.m_type != number::type::double_type)
|
||||
{
|
||||
// #digits + 1 to avoid loss + 1 for the sign + 1 for null terminator.
|
||||
const size_t tempSize = std::numeric_limits<uint64_t>::digits10 + 3;
|
||||
char tempBuffer[tempSize];
|
||||
|
||||
#ifdef _WIN32
|
||||
// This can be improved performance-wise if we implement our own routine
|
||||
if (m_number.m_type == number::type::signed_type)
|
||||
_i64toa_s(m_number.m_intval, tempBuffer, tempSize, 10);
|
||||
else
|
||||
_ui64toa_s(m_number.m_uintval, tempBuffer, tempSize, 10);
|
||||
|
||||
const auto numChars = strnlen_s(tempBuffer, tempSize);
|
||||
#else
|
||||
int numChars;
|
||||
if (m_number.m_type == number::type::signed_type)
|
||||
numChars = snprintf(tempBuffer, tempSize, "%" PRId64, m_number.m_intval);
|
||||
else
|
||||
numChars = snprintf(tempBuffer, tempSize, "%" PRIu64, m_number.m_uintval);
|
||||
#endif
|
||||
stream.append(tempBuffer, numChars);
|
||||
}
|
||||
else
|
||||
{
|
||||
// #digits + 2 to avoid loss + 1 for the sign + 1 for decimal point + 5 for exponent (e+xxx) + 1 for null
|
||||
// terminator
|
||||
const size_t tempSize = std::numeric_limits<double>::digits10 + 10;
|
||||
char tempBuffer[tempSize];
|
||||
#ifdef _WIN32
|
||||
const auto numChars = _sprintf_s_l(tempBuffer,
|
||||
tempSize,
|
||||
"%.*g",
|
||||
utility::details::scoped_c_thread_locale::c_locale(),
|
||||
std::numeric_limits<double>::digits10 + 2,
|
||||
m_number.m_value);
|
||||
#else
|
||||
const auto numChars =
|
||||
snprintf(tempBuffer, tempSize, "%.*g", std::numeric_limits<double>::digits10 + 2, m_number.m_value);
|
||||
#endif
|
||||
stream.append(tempBuffer, numChars);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
void web::json::details::_String::format(std::basic_string<wchar_t>& str) const
|
||||
{
|
||||
str.push_back(L'"');
|
||||
|
||||
if (m_has_escape_char)
|
||||
{
|
||||
append_escape_string(str, m_string);
|
||||
}
|
||||
else
|
||||
{
|
||||
str.append(m_string);
|
||||
}
|
||||
|
||||
str.push_back(L'"');
|
||||
}
|
||||
|
||||
void web::json::details::_Number::format(std::basic_string<wchar_t>& stream) const
|
||||
{
|
||||
if (m_number.m_type != number::type::double_type)
|
||||
{
|
||||
// #digits + 1 to avoid loss + 1 for the sign + 1 for null terminator.
|
||||
const size_t tempSize = std::numeric_limits<uint64_t>::digits10 + 3;
|
||||
wchar_t tempBuffer[tempSize];
|
||||
|
||||
if (m_number.m_type == number::type::signed_type)
|
||||
_i64tow_s(m_number.m_intval, tempBuffer, tempSize, 10);
|
||||
else
|
||||
_ui64tow_s(m_number.m_uintval, tempBuffer, tempSize, 10);
|
||||
|
||||
stream.append(tempBuffer, wcsnlen_s(tempBuffer, tempSize));
|
||||
}
|
||||
else
|
||||
{
|
||||
// #digits + 2 to avoid loss + 1 for the sign + 1 for decimal point + 5 for exponent (e+xxx) + 1 for null
|
||||
// terminator
|
||||
const size_t tempSize = std::numeric_limits<double>::digits10 + 10;
|
||||
wchar_t tempBuffer[tempSize];
|
||||
const int numChars = _swprintf_s_l(tempBuffer,
|
||||
tempSize,
|
||||
L"%.*g",
|
||||
utility::details::scoped_c_thread_locale::c_locale(),
|
||||
std::numeric_limits<double>::digits10 + 2,
|
||||
m_number.m_value);
|
||||
stream.append(tempBuffer, numChars);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
const utility::string_t& web::json::details::_String::as_string() const { return m_string; }
|
||||
|
||||
const utility::string_t& web::json::value::as_string() const { return m_value->as_string(); }
|
||||
|
||||
utility::string_t json::value::serialize() const
|
||||
{
|
||||
#ifndef _WIN32
|
||||
utility::details::scoped_c_thread_locale locale;
|
||||
#endif
|
||||
return m_value->to_string();
|
||||
}
|
||||
1490
deps/cpprestsdk/src/utilities/asyncrt_utils.cpp
vendored
260
deps/cpprestsdk/src/utilities/base64.cpp
vendored
@@ -1,260 +0,0 @@
|
||||
/***
|
||||
* Copyright (C) Microsoft. All rights reserved.
|
||||
* Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
|
||||
*
|
||||
* =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
||||
*
|
||||
* For the latest on this and related APIs, please see: https://github.com/Microsoft/cpprestsdk
|
||||
*
|
||||
* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
****/
|
||||
#include "pch.h"
|
||||
|
||||
using namespace web;
|
||||
using namespace utility;
|
||||
|
||||
std::vector<unsigned char> _from_base64(const utility::string_t& str);
|
||||
utility::string_t _to_base64(const unsigned char* ptr, size_t size);
|
||||
|
||||
std::vector<unsigned char> __cdecl conversions::from_base64(const utility::string_t& str) { return _from_base64(str); }
|
||||
|
||||
utility::string_t __cdecl conversions::to_base64(const std::vector<unsigned char>& input)
|
||||
{
|
||||
if (input.size() == 0)
|
||||
{
|
||||
// return empty string
|
||||
return utility::string_t();
|
||||
}
|
||||
|
||||
return _to_base64(&input[0], input.size());
|
||||
}
|
||||
|
||||
utility::string_t __cdecl conversions::to_base64(uint64_t input)
|
||||
{
|
||||
return _to_base64(reinterpret_cast<const unsigned char*>(&input), sizeof(input));
|
||||
}
|
||||
|
||||
static const char* _base64_enctbl = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
const std::array<unsigned char, 128> _base64_dectbl = {
|
||||
{255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
||||
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62,
|
||||
255, 255, 255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 254, 255, 255, 255, 0,
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
|
||||
23, 24, 25, 255, 255, 255, 255, 255, 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
|
||||
39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 255, 255, 255, 255, 255}};
|
||||
|
||||
struct _triple_byte
|
||||
{
|
||||
unsigned char _1_1 : 2;
|
||||
unsigned char _0 : 6;
|
||||
unsigned char _2_1 : 4;
|
||||
unsigned char _1_2 : 4;
|
||||
unsigned char _3 : 6;
|
||||
unsigned char _2_2 : 2;
|
||||
};
|
||||
|
||||
struct _double_byte
|
||||
{
|
||||
unsigned char _1_1 : 2;
|
||||
unsigned char _0 : 6;
|
||||
unsigned char _2_1 : 4;
|
||||
unsigned char _1_2 : 4;
|
||||
};
|
||||
|
||||
struct _single_byte
|
||||
{
|
||||
unsigned char _1_1 : 2;
|
||||
unsigned char _0 : 6;
|
||||
};
|
||||
|
||||
//
|
||||
// A note on the implementation of BASE64 encoding and decoding:
|
||||
//
|
||||
// This is a fairly basic and naive implementation; there is probably a lot of room for
|
||||
// performance improvement, as well as for adding options such as support for URI-safe base64,
|
||||
// ignoring CRLF, relaxed validation rules, etc. The decoder is currently pretty strict.
|
||||
//
|
||||
|
||||
#ifdef __GNUC__
|
||||
// gcc is concerned about the bitfield uses in the code, something we simply need to ignore.
|
||||
#pragma GCC diagnostic ignored "-Wconversion"
|
||||
#endif
|
||||
std::vector<unsigned char> _from_base64(const utility::string_t& input)
|
||||
{
|
||||
std::vector<unsigned char> result;
|
||||
|
||||
if (input.empty()) return result;
|
||||
|
||||
size_t padding = 0;
|
||||
|
||||
// Validation
|
||||
{
|
||||
auto size = input.size();
|
||||
|
||||
if ((size % 4) != 0)
|
||||
{
|
||||
throw std::runtime_error("length of base64 string is not an even multiple of 4");
|
||||
}
|
||||
|
||||
for (auto iter = input.begin(); iter != input.end(); ++iter, --size)
|
||||
{
|
||||
const size_t ch_sz = static_cast<size_t>(*iter);
|
||||
if (ch_sz >= _base64_dectbl.size() || _base64_dectbl[ch_sz] == 255)
|
||||
{
|
||||
throw std::runtime_error("invalid character found in base64 string");
|
||||
}
|
||||
if (_base64_dectbl[ch_sz] == 254)
|
||||
{
|
||||
padding++;
|
||||
// padding only at the end
|
||||
if (size > 2)
|
||||
{
|
||||
throw std::runtime_error("invalid padding character found in base64 string");
|
||||
}
|
||||
if (size == 2)
|
||||
{
|
||||
const size_t ch2_sz = static_cast<size_t>(*(iter + 1));
|
||||
if (ch2_sz >= _base64_dectbl.size() || _base64_dectbl[ch2_sz] != 254)
|
||||
{
|
||||
throw std::runtime_error("invalid padding character found in base64 string");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
auto size = input.size();
|
||||
const char_t* ptr = &input[0];
|
||||
|
||||
auto outsz = (size / 4) * 3;
|
||||
outsz -= padding;
|
||||
|
||||
result.resize(outsz);
|
||||
|
||||
size_t idx = 0;
|
||||
for (; size > 4; ++idx)
|
||||
{
|
||||
unsigned char target[3];
|
||||
memset(target, 0, sizeof(target));
|
||||
_triple_byte* record = reinterpret_cast<_triple_byte*>(target);
|
||||
|
||||
unsigned char val0 = _base64_dectbl[ptr[0]];
|
||||
unsigned char val1 = _base64_dectbl[ptr[1]];
|
||||
unsigned char val2 = _base64_dectbl[ptr[2]];
|
||||
unsigned char val3 = _base64_dectbl[ptr[3]];
|
||||
|
||||
record->_0 = val0;
|
||||
record->_1_1 = val1 >> 4;
|
||||
result[idx] = target[0];
|
||||
|
||||
record->_1_2 = val1 & 0xF;
|
||||
record->_2_1 = val2 >> 2;
|
||||
result[++idx] = target[1];
|
||||
|
||||
record->_2_2 = val2 & 0x3;
|
||||
record->_3 = val3 & 0x3F;
|
||||
result[++idx] = target[2];
|
||||
|
||||
ptr += 4;
|
||||
size -= 4;
|
||||
}
|
||||
|
||||
// Handle the last four bytes separately, to avoid having the conditional statements
|
||||
// in all the iterations (a performance issue).
|
||||
|
||||
{
|
||||
unsigned char target[3];
|
||||
memset(target, 0, sizeof(target));
|
||||
_triple_byte* record = reinterpret_cast<_triple_byte*>(target);
|
||||
|
||||
unsigned char val0 = _base64_dectbl[ptr[0]];
|
||||
unsigned char val1 = _base64_dectbl[ptr[1]];
|
||||
unsigned char val2 = _base64_dectbl[ptr[2]];
|
||||
unsigned char val3 = _base64_dectbl[ptr[3]];
|
||||
|
||||
record->_0 = val0;
|
||||
record->_1_1 = val1 >> 4;
|
||||
result[idx] = target[0];
|
||||
|
||||
record->_1_2 = val1 & 0xF;
|
||||
if (val2 != 254)
|
||||
{
|
||||
record->_2_1 = val2 >> 2;
|
||||
result[++idx] = target[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
// There shouldn't be any information (ones) in the unused bits,
|
||||
if (record->_1_2 != 0)
|
||||
{
|
||||
throw std::runtime_error("Invalid end of base64 string");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
record->_2_2 = val2 & 0x3;
|
||||
if (val3 != 254)
|
||||
{
|
||||
record->_3 = val3 & 0x3F;
|
||||
result[++idx] = target[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
// There shouldn't be any information (ones) in the unused bits.
|
||||
if (record->_2_2 != 0)
|
||||
{
|
||||
throw std::runtime_error("Invalid end of base64 string");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
utility::string_t _to_base64(const unsigned char* ptr, size_t size)
|
||||
{
|
||||
utility::string_t result;
|
||||
|
||||
for (; size >= 3;)
|
||||
{
|
||||
const _triple_byte* record = reinterpret_cast<const _triple_byte*>(ptr);
|
||||
unsigned char idx0 = record->_0;
|
||||
unsigned char idx1 = (record->_1_1 << 4) | record->_1_2;
|
||||
unsigned char idx2 = (record->_2_1 << 2) | record->_2_2;
|
||||
unsigned char idx3 = record->_3;
|
||||
result.push_back(char_t(_base64_enctbl[idx0]));
|
||||
result.push_back(char_t(_base64_enctbl[idx1]));
|
||||
result.push_back(char_t(_base64_enctbl[idx2]));
|
||||
result.push_back(char_t(_base64_enctbl[idx3]));
|
||||
size -= 3;
|
||||
ptr += 3;
|
||||
}
|
||||
switch (size)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
const _single_byte* record = reinterpret_cast<const _single_byte*>(ptr);
|
||||
unsigned char idx0 = record->_0;
|
||||
unsigned char idx1 = (record->_1_1 << 4);
|
||||
result.push_back(char_t(_base64_enctbl[idx0]));
|
||||
result.push_back(char_t(_base64_enctbl[idx1]));
|
||||
result.push_back('=');
|
||||
result.push_back('=');
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
const _double_byte* record = reinterpret_cast<const _double_byte*>(ptr);
|
||||
unsigned char idx0 = record->_0;
|
||||
unsigned char idx1 = (record->_1_1 << 4) | record->_1_2;
|
||||
unsigned char idx2 = (record->_2_1 << 2);
|
||||
result.push_back(char_t(_base64_enctbl[idx0]));
|
||||
result.push_back(char_t(_base64_enctbl[idx1]));
|
||||
result.push_back(char_t(_base64_enctbl[idx2]));
|
||||
result.push_back('=');
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
157
deps/cpprestsdk/src/utilities/web_utilities.cpp
vendored
@@ -1,157 +0,0 @@
|
||||
/***
|
||||
* Copyright (C) Microsoft. All rights reserved.
|
||||
* Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
|
||||
*
|
||||
* =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
||||
*
|
||||
* Credential and proxy utilities.
|
||||
*
|
||||
* For the latest on this and related APIs, please see: https://github.com/Microsoft/cpprestsdk
|
||||
*
|
||||
* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
****/
|
||||
|
||||
#include "pch.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#if defined(_WIN32) && !defined(__cplusplus_winrt)
|
||||
#include <Wincrypt.h>
|
||||
#endif
|
||||
|
||||
#if defined(__cplusplus_winrt)
|
||||
#include <robuffer.h>
|
||||
#endif
|
||||
|
||||
namespace web
|
||||
{
|
||||
namespace details
|
||||
{
|
||||
#if defined(_WIN32) && !defined(CPPREST_TARGET_XP)
|
||||
#if defined(__cplusplus_winrt)
|
||||
|
||||
// Helper function to zero out memory of an IBuffer.
|
||||
void winrt_secure_zero_buffer(Windows::Storage::Streams::IBuffer ^ buffer)
|
||||
{
|
||||
Microsoft::WRL::ComPtr<IInspectable> bufferInspectable(reinterpret_cast<IInspectable*>(buffer));
|
||||
Microsoft::WRL::ComPtr<Windows::Storage::Streams::IBufferByteAccess> bufferByteAccess;
|
||||
bufferInspectable.As(&bufferByteAccess);
|
||||
|
||||
// This shouldn't happen but if can't get access to the raw bytes for some reason
|
||||
// then we can't zero out.
|
||||
byte* rawBytes;
|
||||
if (bufferByteAccess->Buffer(&rawBytes) == S_OK)
|
||||
{
|
||||
SecureZeroMemory(rawBytes, buffer->Length);
|
||||
}
|
||||
}
|
||||
|
||||
winrt_encryption::winrt_encryption(const std::wstring& data)
|
||||
{
|
||||
auto provider = ref new Windows::Security::Cryptography::DataProtection::DataProtectionProvider(
|
||||
ref new Platform::String(L"Local=user"));
|
||||
|
||||
// Create buffer containing plain text password.
|
||||
Platform::ArrayReference<unsigned char> arrayref(
|
||||
reinterpret_cast<unsigned char*>(const_cast<std::wstring::value_type*>(data.c_str())),
|
||||
static_cast<unsigned int>(data.size()) * sizeof(std::wstring::value_type));
|
||||
Windows::Storage::Streams::IBuffer ^ plaintext =
|
||||
Windows::Security::Cryptography::CryptographicBuffer::CreateFromByteArray(arrayref);
|
||||
m_buffer = pplx::create_task(provider->ProtectAsync(plaintext));
|
||||
m_buffer.then(
|
||||
[plaintext](pplx::task<Windows::Storage::Streams::IBuffer ^>) { winrt_secure_zero_buffer(plaintext); });
|
||||
}
|
||||
|
||||
plaintext_string winrt_encryption::decrypt() const
|
||||
{
|
||||
// To fully guarantee asynchrony would require significant impact on existing code. This code path
|
||||
// is never run on a user's thread and is only done once when setting up a connection.
|
||||
auto encrypted = m_buffer.get();
|
||||
auto provider = ref new Windows::Security::Cryptography::DataProtection::DataProtectionProvider();
|
||||
auto plaintext = pplx::create_task(provider->UnprotectAsync(encrypted)).get();
|
||||
|
||||
// Get access to raw bytes in plain text buffer.
|
||||
Microsoft::WRL::ComPtr<IInspectable> bufferInspectable(reinterpret_cast<IInspectable*>(plaintext));
|
||||
Microsoft::WRL::ComPtr<Windows::Storage::Streams::IBufferByteAccess> bufferByteAccess;
|
||||
bufferInspectable.As(&bufferByteAccess);
|
||||
byte* rawPlaintext;
|
||||
const auto& result = bufferByteAccess->Buffer(&rawPlaintext);
|
||||
if (result != S_OK)
|
||||
{
|
||||
throw ::utility::details::create_system_error(result);
|
||||
}
|
||||
|
||||
// Construct string and zero out memory from plain text buffer.
|
||||
auto data = plaintext_string(
|
||||
new std::wstring(reinterpret_cast<const std::wstring::value_type*>(rawPlaintext), plaintext->Length / 2));
|
||||
SecureZeroMemory(rawPlaintext, plaintext->Length);
|
||||
return std::move(data);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
win32_encryption::win32_encryption(const std::wstring& data) : m_numCharacters(data.size())
|
||||
{
|
||||
// Early return because CryptProtectMemory crashes with empty string
|
||||
if (m_numCharacters == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (data.size() > (std::numeric_limits<DWORD>::max)() / sizeof(wchar_t))
|
||||
{
|
||||
throw std::length_error("Encryption string too long");
|
||||
}
|
||||
|
||||
const auto dataSizeDword = static_cast<DWORD>(data.size() * sizeof(wchar_t));
|
||||
|
||||
// Round up dataSizeDword to be a multiple of CRYPTPROTECTMEMORY_BLOCK_SIZE
|
||||
static_assert(CRYPTPROTECTMEMORY_BLOCK_SIZE == 16, "Power of 2 assumptions in this bit masking violated");
|
||||
const auto mask = static_cast<DWORD>(CRYPTPROTECTMEMORY_BLOCK_SIZE - 1u);
|
||||
const auto dataNumBytes = (dataSizeDword & ~mask) + ((dataSizeDword & mask) != 0) * CRYPTPROTECTMEMORY_BLOCK_SIZE;
|
||||
assert((dataNumBytes % CRYPTPROTECTMEMORY_BLOCK_SIZE) == 0);
|
||||
assert(dataNumBytes >= dataSizeDword);
|
||||
m_buffer.resize(dataNumBytes);
|
||||
memcpy_s(m_buffer.data(), m_buffer.size(), data.c_str(), dataNumBytes);
|
||||
if (!CryptProtectMemory(m_buffer.data(), dataNumBytes, CRYPTPROTECTMEMORY_SAME_PROCESS))
|
||||
{
|
||||
throw ::utility::details::create_system_error(GetLastError());
|
||||
}
|
||||
}
|
||||
|
||||
win32_encryption::~win32_encryption() { SecureZeroMemory(m_buffer.data(), m_buffer.size()); }
|
||||
|
||||
plaintext_string win32_encryption::decrypt() const
|
||||
{
|
||||
// Copy the buffer and decrypt to avoid having to re-encrypt.
|
||||
auto result = plaintext_string(new std::wstring(reinterpret_cast<const std::wstring::value_type*>(m_buffer.data()),
|
||||
m_buffer.size() / sizeof(wchar_t)));
|
||||
auto& data = *result;
|
||||
if (!m_buffer.empty())
|
||||
{
|
||||
if (!CryptUnprotectMemory(&data[0], static_cast<DWORD>(m_buffer.size()), CRYPTPROTECTMEMORY_SAME_PROCESS))
|
||||
{
|
||||
throw ::utility::details::create_system_error(GetLastError());
|
||||
}
|
||||
|
||||
assert(m_numCharacters <= m_buffer.size());
|
||||
SecureZeroMemory(&data[m_numCharacters], data.size() - m_numCharacters);
|
||||
data.erase(m_numCharacters);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
void zero_memory_deleter::operator()(::utility::string_t* data) const
|
||||
{
|
||||
CASABLANCA_UNREFERENCED_PARAMETER(data);
|
||||
#if defined(_WIN32)
|
||||
SecureZeroMemory(&(*data)[0], data->size() * sizeof(::utility::string_t::value_type));
|
||||
delete data;
|
||||
#endif
|
||||
}
|
||||
} // namespace details
|
||||
|
||||
} // namespace web
|
||||
@@ -1,26 +0,0 @@
|
||||
# Code Organization
|
||||
|
||||
## Rules
|
||||
|
||||
- **Follow the pattern of what you already see in the code**
|
||||
- Try to package new ideas/components into libraries that have nicely defined interfaces
|
||||
- Package new ideas into classes or refactor existing ideas into a class as you extend
|
||||
|
||||
## Code Overview
|
||||
|
||||
General project organization:
|
||||
|
||||
#### The [`deps`](/deps) folder
|
||||
Contains other projects that PowerToys uses as dependencies.
|
||||
|
||||
#### The [`doc`](/doc) folder
|
||||
Documentation for the project, including a [coding guide](/doc/coding) and [design docs](/doc/specs).
|
||||
|
||||
#### The [`installer`](/installer) folder
|
||||
Contains the source code of the PowerToys installer.
|
||||
|
||||
#### The [`src`](/src) folder
|
||||
Contains the source code of the PowerToys runner and of all of the PowerToys modules. **This is where the most of the magic happens.**
|
||||
|
||||
#### The [`tools`](/tools) folder
|
||||
Various tools used by PowerToys. Includes the Visual Studio 2019 project template for new PowerToys.
|
||||
@@ -1,5 +0,0 @@
|
||||
# Coding Style
|
||||
|
||||
## Philosophy
|
||||
1. If it's inserting something into the existing classes/functions, try to follow the existing style as closely as possible.
|
||||
1. If it's brand new code or refactoring a complete class or area of the code, please follow as Modern C++ of a style as you can and reference the [C++ Core Guidelines](https://github.com/isocpp/CppCoreGuidelines) as much as you possibly can.
|
||||
109
doc/devdocs/common.md
Normal file
@@ -0,0 +1,109 @@
|
||||
# Classes and structures
|
||||
|
||||
#### class Animation: [header](/src/common/animation.h) [source](/src/common/animation.cpp)
|
||||
Animation helper class with two easing-in animations: linear and exponential.
|
||||
|
||||
#### class AsyncMessageQueue: [header](/src/common/async_message_queue.h)
|
||||
Header-only asynchronous message queue. Used by `TwoWayPipeMessageIPC`.
|
||||
|
||||
#### class TwoWayPipeMessageIPC: [header](/src/common/two_way_pipe_message_ipc.h)
|
||||
Header-only asynchronous IPC messaging class. Used by the runner to communicate with the settings window.
|
||||
|
||||
#### class D2DSVG: [header](/src/common/d2d_svg.h) [source](/src/common/d2d_svg.cpp)
|
||||
Class for loading, rendering and for some basic modifications of SVG graphics.
|
||||
|
||||
#### class D2DText: [header](/src/common/d2d_text.h) [source](/src/common/d2d_text.cpp)
|
||||
Class for rendering text using DirectX.
|
||||
|
||||
#### class D2DWindow: [header](/src/common/d2d_window.h) [source](/src/common/d2d_window.cpp)
|
||||
Base class for creating borderless windows, with DirectX enabled rendering pipeline.
|
||||
|
||||
#### class DPIAware: [header](/src/common/dpi_aware.h) [source](/src/common/dpi_aware.cpp)
|
||||
Helper class for creating DPI-aware applications.
|
||||
|
||||
#### struct MonitorInfo: [header](/src/common/monitors.h) [source](/src/common/monitors.cpp)
|
||||
Class for obtaining information about physical displays connected to the machine.
|
||||
|
||||
#### class Settings, class PowerToyValues, class CustomActionObject: [header](/src/common/settings_objects.h) [source](/src/common/settings_objects.cpp)
|
||||
Classes used to define settings screens for the PowerToys modules.
|
||||
|
||||
#### class Tasklist: [header](/src/common/tasklist_positions.h) [source](/src/common/tasklist_positions.cpp)
|
||||
Class that can detect the position of the windows buttons on the taskbar. It also detects which window will react to pressing `WinKey + number`.
|
||||
|
||||
#### struct WindowsColors: [header](/src/common/windows_colors.h) [source](/src/common/windows_colors.cpp)
|
||||
Class for detecting the current Windows color scheme.
|
||||
|
||||
# Helpers
|
||||
|
||||
#### Common helpers: [header](/src/common/common.h) [source](/src/common/common.cpp)
|
||||
Various helper functions.
|
||||
|
||||
#### Settings helpers: [header](/src/common/settings_helpers.h)
|
||||
Helper methods for the settings.
|
||||
|
||||
#### Start visible helper: [header](/src/common/start_visible.h) [source](/src/common/start_visible.cpp)
|
||||
Contains function to test if the Start menu is visible.
|
||||
|
||||
# Toast Notifications
|
||||
|
||||
#### Notifications API [header](/src/common/notifications.h) [source](/src/common/notifications.cpp)
|
||||
To use UWP-style toast notifications, simply include the header and call one of these functions:
|
||||
|
||||
```cpp
|
||||
void show_toast(std::wstring_view message); // #1
|
||||
|
||||
void show_toast_background_activated( // #2
|
||||
std::wstring_view message,
|
||||
std::wstring_view background_handler_id,
|
||||
std::vector<std::wstring_view> button_labels);
|
||||
```
|
||||
We might add more functions in the future if the need arises, e.g. `show_toast_xml` which will accept raw XML for rich customization.
|
||||
|
||||
Description:
|
||||
- `#1` is for sending simple notifications without any callbacks or buttons
|
||||
- `#2` is capable of showing a toast with multiple buttons and background activation
|
||||
- `message` is a plain-text argument
|
||||
|
||||
Implement a toast activation handler/callback as a function in [handler_functions.cpp](/src/common/notifications_winrt/handler_functions.cpp) and register its `background_handler_id` via `handlers_map`, e.g.:
|
||||
|
||||
```cpp
|
||||
// Your .cpp where you'd like to show a toast
|
||||
|
||||
#include <common/notifications.h>
|
||||
|
||||
void some_func() {
|
||||
// ...
|
||||
notifications::show_toast_background_activated(
|
||||
L"Toast message!", // text displayed in a toast
|
||||
L"awesome_toast", // activation handler id
|
||||
{L"Press me!", L"Also could press me!", L"I'm here to be pressed!"} // buttons in a toast
|
||||
);
|
||||
```
|
||||
|
||||
```cpp
|
||||
// handler_functions.cpp
|
||||
void awesome_toast_handler(IBackgroundTaskInstance, const size_t button_id)
|
||||
{
|
||||
switch(button_id)
|
||||
{
|
||||
case 0:
|
||||
// handle "Press me!" button click
|
||||
case 1:
|
||||
// handle "Also could press me!" button click
|
||||
case 2:
|
||||
// handle "I'm here to be pressed!" button click
|
||||
}
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
const std::unordered_map<std::wstring_view, handler_function_t> handlers_map = {
|
||||
// ...other handlers...
|
||||
{L"awesome_toast", awesome_toast_handler}
|
||||
};}
|
||||
|
||||
```
|
||||
|
||||
Note: since _background activation_ implies that your toast handler will be invoked in a separate process, you can't share data directly from within a handler and your PT process. Also, since PT is currently a Desktop Bridge app, _foreground activation_ is [handled the same as background](https://docs.microsoft.com/en-US/windows/uwp/design/shell/tiles-and-notifications/send-local-toast-desktop-cpp-wrl#foreground-vs-background-activation), therefore we don't make a dedicated API for it. You can read more on the rationale of the current design [here](https://github.com/microsoft/PowerToys/pull/1178#issue-368768337).
|
||||
|
||||
|
||||
71
doc/devdocs/guidance.md
Normal file
@@ -0,0 +1,71 @@
|
||||
# Coding Guidance
|
||||
|
||||
## Working With Strings
|
||||
|
||||
In order to support localization **YOU SHOULD NOT** have hardcoded UI display strings in your code. Instead, use resource files to consume strings.
|
||||
|
||||
### For CPP
|
||||
Use [`StringTable` resource][String Table] to store the strings and resource header file(`resource.h`) to store Id's linked to the UI display string. Add the strings with Id's referenced from the header file to the resource-definition script file. You can use [Visual Studio Resource Editor][VS Resource Editor] to create and manage resource files.
|
||||
|
||||
- `resource.h`:
|
||||
|
||||
XXX must be a unique int in the list (mostly the int ID of the last string id plus one):
|
||||
|
||||
```cpp
|
||||
#define IDS_MODULE_DISPLAYNAME XXX
|
||||
```
|
||||
|
||||
- `StringTable` in resource-definition script file `validmodulename.rc`:
|
||||
|
||||
```
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
IDS_MODULE_DISPLAYNAME L"Module Name"
|
||||
END
|
||||
```
|
||||
|
||||
- Use the `GET_RESOURCE_STRING(UINT resource_id)` method to consume strings in your code.
|
||||
```cpp
|
||||
#include <common.h>
|
||||
|
||||
extern "C" IMAGE_DOS_HEADER __ImageBase;
|
||||
|
||||
std::wstring GET_RESOURCE_STRING(IDS_MODULE_DISPLAYNAME)
|
||||
```
|
||||
|
||||
### For C#
|
||||
Use [XML resource file(.resx)][Resx Files] to store the UI display strings and [`Resource Manager`][Resource Manager] to consume those strings in the code. You can use [Visual Studio][Resx Files VS] to create and manage XML resources files.
|
||||
|
||||
- `Resources.resx`
|
||||
|
||||
```xml
|
||||
<data name="ValidUIDisplayString" xml:space="preserve">
|
||||
<value>Description to be displayed on UI.</value>
|
||||
<comment>This text is displayed when XYZ button clicked.</comment>
|
||||
</data>
|
||||
```
|
||||
|
||||
- Use [`Resource Manager`][Resource Manager] to consume strings in code.
|
||||
```csharp
|
||||
System.Resources.ResourceManager manager = new System.Resources.ResourceManager(baseName, assembly);
|
||||
string validUIDisplayString = manager.GetString("ValidUIDisplayString", resourceCulture);
|
||||
```
|
||||
|
||||
In case of Visual Studio is used to create the resource file. Simply use the `Resources` class in auto-generated `Resources.Designer.cs` file to access the strings which encapsulate the [`Resource Manager`][Resource Manager] logic.
|
||||
|
||||
```csharp
|
||||
string validUIDisplayString = Resources.ValidUIDisplayString;
|
||||
```
|
||||
|
||||
## More On Coding Guidance
|
||||
Please review these brief docs below relating to our coding standards etc.
|
||||
|
||||
* [Coding Style](./style.md)
|
||||
* [Code Organization](./readme.md)
|
||||
|
||||
|
||||
[VS Resource Editor]: https://docs.microsoft.com/en-us/cpp/windows/resource-editors?view=vs-2019
|
||||
[String Table]: https://docs.microsoft.com/en-us/windows/win32/menurc/stringtable-resource
|
||||
[Resx Files VS]: https://docs.microsoft.com/en-us/dotnet/framework/resources/creating-resource-files-for-desktop-apps#resource-files-in-visual-studio
|
||||
[Resx Files]: https://docs.microsoft.com/en-us/dotnet/framework/resources/creating-resource-files-for-desktop-apps#resources-in-resx-files
|
||||
[Resource Manager]: https://docs.microsoft.com/en-us/dotnet/api/system.resources.resourcemanager?view=netframework-4.8
|
||||
85
doc/devdocs/modules/fancyzones.md
Normal file
@@ -0,0 +1,85 @@
|
||||
## FancyZones Lib
|
||||
|
||||
#### [`FancyZones.cpp`](/src/modules/fancyzones/lib/FancyZones.cpp)
|
||||
TODO
|
||||
|
||||
#### [`Settings.cpp`](/src/modules/fancyzones/lib/Settings.cpp)
|
||||
TODO
|
||||
|
||||
#### [`trace.cpp`](/src/modules/fancyzones/lib/trace.cpp)
|
||||
TODO
|
||||
|
||||
#### [`Zone.cpp`](/src/modules/fancyzones/lib/Zone.cpp)
|
||||
TODO
|
||||
|
||||
#### [`ZoneSet.cpp`](/src/modules/fancyzones/lib/ZoneSet.cpp)
|
||||
TODO
|
||||
|
||||
#### [`ZoneWindow.cpp`](/src/modules/fancyzones/lib/ZoneWindow.cpp)
|
||||
TODO
|
||||
|
||||
## FancyZones Editor
|
||||
|
||||
#### [`App.xaml.cs`](/src/modules/fancyzones/editor/App.xaml.cs)
|
||||
TODO
|
||||
|
||||
#### [`Properties\AssemblyInfo.cs`](/src/modules/fancyzones/editor/Properties\AssemblyInfo.cs)
|
||||
TODO
|
||||
|
||||
#### [`CanvasEditor.xaml.cs`](/src/modules/fancyzones/editor/CanvasEditor.xaml.cs)
|
||||
TODO
|
||||
|
||||
#### [`CanvasEditorWindow.xaml.cs`](/src/modules/fancyzones/editor/CanvasEditorWindow.xaml.cs)
|
||||
TODO
|
||||
|
||||
#### [`Models\CanvasLayoutModel.cs`](/src/modules/fancyzones/editor/Models\CanvasLayoutModel.cs)
|
||||
TODO
|
||||
|
||||
#### [`CanvasZone.xaml.cs`](/src/modules/fancyzones/editor/CanvasZone.xaml.cs)
|
||||
TODO
|
||||
|
||||
#### [`EditorOverlay.xaml.cs`](/src/modules/fancyzones/editor/EditorOverlay.xaml.cs)
|
||||
TODO
|
||||
|
||||
#### [`EditorWindow.cs`](/src/modules/fancyzones/editor/EditorWindow.cs)
|
||||
TODO
|
||||
|
||||
#### [`GridEditor.xaml.cs`](/src/modules/fancyzones/editor/GridEditor.xaml.cs)
|
||||
TODO
|
||||
|
||||
#### [`GridEditorWindow.xaml.cs`](/src/modules/fancyzones/editor/GridEditorWindow.xaml.cs)
|
||||
TODO
|
||||
|
||||
#### [`Models\GridLayoutModel.cs`](/src/modules/fancyzones/editor/Models\GridLayoutModel.cs)
|
||||
TODO
|
||||
|
||||
#### [`GridResizer.xaml.cs`](/src/modules/fancyzones/editor/GridResizer.xaml.cs)
|
||||
TODO
|
||||
|
||||
#### [`GridZone.xaml.cs`](/src/modules/fancyzones/editor/GridZone.xaml.cs)
|
||||
TODO
|
||||
|
||||
#### [`Models\LayoutModel.cs`](/src/modules/fancyzones/editor/Models/LayoutModel.cs)
|
||||
TODO
|
||||
|
||||
#### [`LayoutPreview.xaml.cs`](/src/modules/fancyzones/editor/LayoutPreview.xaml.cs)
|
||||
TODO
|
||||
|
||||
#### [`MainWindow.xaml.cs`](/src/modules/fancyzones/editor/MainWindow.xaml.cs)
|
||||
TODO
|
||||
|
||||
#### [`Properties\Resources.Designer.cs`](/src/modules/fancyzones/editor/Properties/Resources.Designer.cs)
|
||||
TODO
|
||||
|
||||
#### [`RowColInfo.cs`](/src/modules/fancyzones/editor/RowColInfo.cs)
|
||||
TODO
|
||||
|
||||
#### [`Models\Settings.cs`](/src/modules/fancyzones/editor/Models/Settings.cs)
|
||||
TODO
|
||||
|
||||
#### [`Properties\Settings.Designer.cs`](/src/modules/fancyzones/editor/Properties/Settings.Designer.cs)
|
||||
TODO
|
||||
|
||||
#### [`WindowLayout.xaml.cs`](/src/modules/fancyzones/editor/WindowLayout.xaml.cs)
|
||||
TODO
|
||||
|
||||
240
doc/devdocs/modules/interface.md
Normal file
@@ -0,0 +1,240 @@
|
||||
# Interface definition
|
||||
|
||||
```cpp
|
||||
class PowertoyModuleIface {
|
||||
public:
|
||||
virtual const wchar_t* get_name() = 0;
|
||||
virtual const wchar_t** get_events() = 0;
|
||||
virtual bool get_config(wchar_t* buffer, int *buffer_size) = 0;
|
||||
virtual void set_config(const wchar_t* config) = 0;
|
||||
virtual void call_custom_action(const wchar_t* action) {};
|
||||
virtual void enable() = 0;
|
||||
virtual void disable() = 0;
|
||||
virtual bool is_enabled() = 0;
|
||||
virtual intptr_t signal_event(const wchar_t* name, intptr_t data) = 0;
|
||||
virtual void register_system_menu_helper(PowertoySystemMenuIface* helper) = 0;
|
||||
virtual void signal_system_menu_action(const wchar_t* name) = 0;
|
||||
virtual void destroy() = 0;
|
||||
};
|
||||
|
||||
typedef PowertoyModuleIface* (__cdecl *powertoy_create_func)();
|
||||
```
|
||||
|
||||
# Runtime logic
|
||||
|
||||
The PowerToys runner will, for each PowerToy DLL:
|
||||
- load the DLL,
|
||||
- call [`powertoy_create()`](#powertoy_create_func) to create the PowerToy.
|
||||
|
||||
On the received object, the runner will call:
|
||||
- [`get_name()`](#get_name) to get the name of the PowerToy,
|
||||
- [`get_events()`](#get_events) to get the list of the events the PowerToy wants to subscribe to,
|
||||
- [`enable()`](#enable) to initialize the PowerToy.
|
||||
|
||||
While running, the runner might call the following methods between create_powertoy()
|
||||
and destroy():
|
||||
- [`disable()`](#disable)/[`enable()`](#enable)/[`is_enabled()`](#is_enabled) to change or get the PowerToy's enabled state,
|
||||
- [`get_config()`](#get_config) to get the available configuration settings,
|
||||
- [`set_config()`](#set_config) to set settings after they have been edited in the Settings editor,
|
||||
- [`call_custom_action()`](#call_custom_action) when the user selects a custom action in the Settings editor,
|
||||
- [`signal_event()`](#signal_event) to send an event the PowerToy registered to.
|
||||
- [`register_system_menu_helper()`](#register_system_menu_helper) to pass object, responsible for handling customized system menus, to module.
|
||||
- [`signal_system_menu_action()`](#signal_system_menu_action) to send an event when action is taken on system menu item.
|
||||
|
||||
When terminating, the runner will:
|
||||
- call [`disable()`](#disable),
|
||||
- call [`destroy()`](#destroy) which should free all the memory and delete the PowerToy object,
|
||||
- unload the DLL.
|
||||
|
||||
|
||||
# Method definition
|
||||
|
||||
This section contains a more detailed description of each of the interface methods.
|
||||
|
||||
## powertoy_create_func
|
||||
|
||||
```cpp
|
||||
typedef PowertoyModuleIface* (__cdecl *powertoy_create_func)()
|
||||
```
|
||||
|
||||
Typedef of the factory function that creates the PowerToy object.
|
||||
Must be exported by the DLL as `powertoy_create()`.
|
||||
|
||||
Called by the PowerToys runner to initialize each PowerToy.
|
||||
It will be called only once before a call to [`destroy()`](#destroy) is made.
|
||||
|
||||
The returned PowerToy should be in the disabled state. The runner will call the [`enable()`](#enable) method to start the PowerToy.
|
||||
|
||||
In case of errors returns `nullptr`.
|
||||
|
||||
## get_name
|
||||
|
||||
```cpp
|
||||
virtual const wchar_t* get_name()
|
||||
```
|
||||
|
||||
Returns the name of the PowerToy, it will be cached by the runner.
|
||||
|
||||
## get_events
|
||||
|
||||
```cpp
|
||||
virtual const wchar_t** get_events()
|
||||
```
|
||||
|
||||
Returns a null-terminated table of the names of the events the PowerToy wants to subscribe to. Available events:
|
||||
* ll_keyboard
|
||||
* win_hook_event
|
||||
|
||||
A nullptr can be returned to signal that the PowerToy does not want to subscribe to any event.
|
||||
|
||||
## get_config
|
||||
|
||||
```
|
||||
virtual bool get_config(wchar_t* buffer, int *buffer_size)
|
||||
```
|
||||
|
||||
Fills a buffer with the available configuration settings.
|
||||
|
||||
If `buffer` is a null pointer or the buffer size is not large enough sets the required buffer size in 'buffer_size' and return false.
|
||||
|
||||
Returns true if successful.
|
||||
|
||||
## set_config
|
||||
|
||||
```cpp
|
||||
virtual void set_config(const wchar_t* config)
|
||||
```
|
||||
|
||||
After the user has changed the module settings in the Settings editor, the runner calls this method to pass to the module the updated values. It's a good place to save the settings as well.
|
||||
|
||||
## call_custom_action
|
||||
|
||||
```cpp
|
||||
virtual void call_custom_action(const wchar_t* action)
|
||||
```
|
||||
|
||||
Calls a custom action in response to the user pressing the custom action button in the Settings editor.
|
||||
This can be used to spawn custom editors defined by the PowerToy.
|
||||
|
||||
## enable
|
||||
|
||||
```cpp
|
||||
virtual void enable()
|
||||
```
|
||||
|
||||
Enables the PowerToy.
|
||||
|
||||
## disable
|
||||
|
||||
```cpp
|
||||
virtual void disable()
|
||||
```
|
||||
|
||||
Disables the PowerToy, should free as much memory as possible.
|
||||
|
||||
## is_enabled
|
||||
|
||||
```cpp
|
||||
virtual bool is_enabled() = 0;
|
||||
```
|
||||
|
||||
Returns the PowerToy state.
|
||||
|
||||
## signal_event
|
||||
|
||||
```cpp
|
||||
virtual intptr_t signal_event(const wchar_t* name, intptr_t data) = 0;
|
||||
```
|
||||
|
||||
Handle event. Only the events the PowerToy subscribed to will be signaled.
|
||||
The data argument and return value meaning are event-specific:
|
||||
* ll_keyboard: see [`lowlevel_keyboard_event_data.h`](./lowlevel_keyboard_event_data.h).
|
||||
* win_hook_event: see [`win_hook_event_data.h`](./win_hook_event_data.h)
|
||||
|
||||
Please note that some of the events are currently being signalled from a separate thread.
|
||||
|
||||
## register_system_menu_helper
|
||||
|
||||
```cpp
|
||||
virtual void register_system_menu_helper(PowertoySystemMenuIface* helper) = 0;
|
||||
```
|
||||
|
||||
Register helper class to handle all system menu items related actions. Creation, deletion
|
||||
and all other actions taken on system menu item will be handled by provided class.
|
||||
Module will be informed when action is taken on any item created on request of the module.
|
||||
|
||||
## signal_system_menu_action
|
||||
|
||||
```cpp
|
||||
virtual void signal_system_menu_action(const wchar_t* name) = 0;
|
||||
```
|
||||
|
||||
Runner invokes this API when action is taken on item created on request from the module.
|
||||
Item name is passed as an argument, so that module can distinguish between different menu items.
|
||||
|
||||
## destroy
|
||||
|
||||
```cpp
|
||||
virtual void destroy()
|
||||
```
|
||||
Destroy the PowerToy and free all memory.
|
||||
|
||||
## Powertoys system menu helper interface
|
||||
|
||||
Interface for helper class responsible for handling all system menu related actions.
|
||||
```cpp
|
||||
class PowertoySystemMenuIface {
|
||||
public:
|
||||
struct ItemInfo {
|
||||
std::wstring name{};
|
||||
bool enable{ false };
|
||||
bool checkBox{ false };
|
||||
};
|
||||
virtual void SetConfiguration(PowertoyModuleIface* module, const std::vector<ItemInfo>& config) = 0;
|
||||
virtual void ProcessSelectedItem(PowertoyModuleIface* module, HWND window, const wchar_t* itemName) = 0;
|
||||
};
|
||||
```
|
||||
|
||||
## ItemInfo
|
||||
|
||||
```cpp
|
||||
struct ItemInfo {
|
||||
std::wstring name{};
|
||||
bool enable{ false };
|
||||
bool checkBox{ false };
|
||||
};
|
||||
```
|
||||
|
||||
Structure containing all relevant information for system menu item: name (and hotkey if available), item
|
||||
status at creation (enabled/disabled) and whether check box will appear next to item name when action is taken.
|
||||
|
||||
## SetConfiguration
|
||||
|
||||
```cpp
|
||||
virtual void SetConfiguration(PowertoyModuleIface* module, const std::vector<ItemInfo>& config) = 0;
|
||||
```
|
||||
|
||||
Module should use this interface to inform system menu helper class which custom system menu items to create.
|
||||
|
||||
## ProcessSelectedItem
|
||||
|
||||
```cpp
|
||||
virtual void ProcessSelectedItem(PowertoyModuleIface* module, HWND window, const wchar_t* itemName) = 0;
|
||||
```
|
||||
|
||||
Process action taken on specific system menu item.
|
||||
|
||||
# Code organization
|
||||
|
||||
### [`powertoy_module_interface.h`](/src/modules/interface/powertoy_module_interface.h)
|
||||
Contains the PowerToys interface definition.
|
||||
|
||||
### [`powertoy_system_menu.h`](/src/modules/interface/powertoy_system_module.h)
|
||||
Contains the PowerToys system menu helper interface definition.
|
||||
|
||||
### [`lowlevel_keyboard_event_data.h`](/src/modules/interface/lowlevel_keyboard_event_data.h)
|
||||
Contains the `LowlevelKeyboardEvent` structure that's passed to `signal_event` for `ll_keyboard` events.
|
||||
|
||||
### [`win_hook_event_data.h`](/src/modules/interface/win_hook_event_data.h)
|
||||
Contains the `WinHookEvent` structure that's passed to `signal_event` for `win_hook_event` events.
|
||||
|
||||
26
doc/devdocs/modules/powerrename.md
Normal file
@@ -0,0 +1,26 @@
|
||||
#### [`dllmain.cpp`](/src/modules/powerrename/dll/dllmain.cpp)
|
||||
TODO
|
||||
|
||||
#### [`PowerRenameExt.cpp`](/src/modules/powerrename/dll/PowerRenameExt.cpp)
|
||||
TODO
|
||||
|
||||
#### [`Helpers.cpp`](/src/modules/powerrename/lib/Helpers.cpp)
|
||||
TODO
|
||||
|
||||
#### [`PowerRenameItem.cpp`](/src/modules/powerrename/lib/PowerRenameItem.cpp)
|
||||
TODO
|
||||
|
||||
#### [`PowerRenameManager.cpp`](/src/modules/powerrename/lib/PowerRenameManager.cpp)
|
||||
TODO
|
||||
|
||||
#### [`PowerRenameRegEx.cpp`](/src/modules/powerrename/lib/PowerRenameRegEx.cpp)
|
||||
TODO
|
||||
|
||||
#### [`Settings.cpp`](/src/modules/powerrename/lib/Settings.cpp)
|
||||
TODO
|
||||
|
||||
#### [`trace.cpp`](/src/modules/powerrename/lib/trace.cpp)
|
||||
TODO
|
||||
|
||||
#### [`PowerRenameUI.cpp`](/src/modules/powerrename/ui/PowerRenameUI.cpp)
|
||||
TODO
|
||||
17
doc/devdocs/modules/shortcut_guide.md
Normal file
@@ -0,0 +1,17 @@
|
||||
#### [`dllmain.cpp`](/src/modules/shortcut_guide/dllmain.cpp)
|
||||
Contains DLL boilerplate code.
|
||||
|
||||
#### [`shortcut_guide.cpp`](/src/modules/shortcut_guide/shortcut_guide.cpp)
|
||||
Contains the module interface code. It initializes the settings values and the keyboard event listener.
|
||||
|
||||
#### [`overlay_window.cpp`](/src/modules/shortcut_guide/overlay_window.cpp)
|
||||
Contains the code for loading the SVGs, creating and rendering of the overlay window.
|
||||
|
||||
#### [`keyboard_state.cpp`](/src/modules/shortcut_guide/keyboard_state.cpp)
|
||||
Contains helper methods for checking the current state of the keyboard.
|
||||
|
||||
#### [`target_state.cpp`](/src/modules/shortcut_guide/target_state.cpp)
|
||||
State machine that handles the keyboard events. It’s responsible for deciding when to show the overlay, when to suppress the Start menu (if the overlay is displayed long enough), etc.
|
||||
|
||||
#### [`trace.cpp`](/src/modules/shortcut_guide/trace.cpp)
|
||||
Contains code for telemetry.
|
||||
159
doc/devdocs/readme.md
Normal file
@@ -0,0 +1,159 @@
|
||||
# Dev Documentation
|
||||
|
||||
## Rules
|
||||
|
||||
- **Follow the pattern of what you already see in the code.**
|
||||
- [Coding style](style.md).
|
||||
- Try to package new ideas/components into libraries that have nicely defined interfaces.
|
||||
- Package new ideas into classes or refactor existing ideas into a class as you extend.
|
||||
- When adding new classes/methods/changing existing code: add new unit tests or update the existing tests.
|
||||
|
||||
## Github Workflow
|
||||
|
||||
- Before starting to work on a fix/feature, make sure there is an open issue to track the work.
|
||||
- Add the `In progress` label to the issue, if not already present also add a `Cost-Small/Medium/Large` estimate and make sure all appropriate labels are set.
|
||||
- If you are a community contributor, you will not be able to add labels to the issue, in that case just add a comment saying that you started to work on the issue and try to give an estimate for the delivery date.
|
||||
- If the work item has a medium/large cost, using the markdown task list, list each sub item and update the list with a check mark after completing each sub item.
|
||||
- When opening a PR, follow the PR template.
|
||||
- When the PR is approved, let the owner of the PR merge it. For community contributions the reviewer that approved the PR can also merge it.
|
||||
- Use the `Squash and merge` option to merge a PR, if you don't want to squash it because there are logically different commits, use `Rebase and merge`.
|
||||
- We don't close issues automatically when referenced in a PR, so after the PR is merged:
|
||||
- mark the issue(s), that the PR solved, with the `Resolution-Fix-Committed` label, remove the `In progress` label and if the issue is assigned to a project, move the item to the `Done` status.
|
||||
- don't close the issue if it's a bug in the current released version since users tend to not search for closed issues, we will close the resolved issues when a new version is released.
|
||||
- if it's not a code fix that effects the end user, the issue can be closed (for example a fix in the build or a code refactoring and so on).
|
||||
|
||||
## Repository Overview
|
||||
|
||||
General project organization:
|
||||
|
||||
### The [`doc`](/doc) folder
|
||||
|
||||
Documentation for the project.
|
||||
|
||||
### The [`Wiki`](/wiki)
|
||||
|
||||
The Wiki contains the current specs for the project.
|
||||
|
||||
### The [`installer`](/installer) folder
|
||||
|
||||
Contains the source code of the PowerToys installer.
|
||||
|
||||
### The [`src`](/src) folder
|
||||
|
||||
Contains the source code of the PowerToys runner and of all of the PowerToys modules. **This is where the most of the magic happens.**
|
||||
|
||||
### The [`tools`](/tools) folder
|
||||
|
||||
Various tools used by PowerToys. Includes the Visual Studio 2019 project template for new PowerToys.
|
||||
|
||||
## Compiling PowerToys
|
||||
|
||||
### Prerequisites for Compiling PowerToys
|
||||
|
||||
1. Windows 10 April 2018 Update (version 1803) or newer
|
||||
2. Visual Studio Community/Professional/Enterprise 2019
|
||||
3. Run the command below in cmd/terminal to install all the workloads and components for VS.<br />
|
||||
**Note:** the script assumes VS is installed and Community edition. Please update path accordingly if Professional/Enterprise.
|
||||
|
||||
```shell
|
||||
"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vs_installer.exe" ^
|
||||
modify --installpath "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\community" ^
|
||||
--add Microsoft.VisualStudio.Workload.NativeDesktop ^
|
||||
--add Microsoft.VisualStudio.Workload.ManagedDesktop ^
|
||||
--add Microsoft.VisualStudio.Workload.Universal ^
|
||||
--add Microsoft.VisualStudio.Component.Windows10SDK.17134 ^
|
||||
--add Microsoft.VisualStudio.ComponentGroup.UWP.VC ^
|
||||
--add Microsoft.VisualStudio.Component.VC.Runtimes.x86.x64.Spectre ^
|
||||
--add Microsoft.VisualStudio.Component.VC.ATL.Spectre
|
||||
```
|
||||
|
||||
### Compiling Source Code
|
||||
|
||||
- Open `powertoys.sln` in Visual Studio, in the `Solutions Configuration` drop-down menu select `Release` or `Debug`, from the `Build` menu choose `Build Solution`.
|
||||
- The PowerToys binaries will be in your repo under `x64\Release`.
|
||||
- If you want to copy the `PowerToys.exe` binary to a different location, you'll also need to copy the `modules` and the `svgs` folders.
|
||||
|
||||
## Building the Installer (.MSI)
|
||||
|
||||
### Prerequisites Building the Installer (.MSI)
|
||||
|
||||
1. Install the [WiX Toolset Visual Studio 2019 Extension](https://marketplace.visualstudio.com/items?itemName=RobMensching.WiXToolset).
|
||||
2. Install the [WiX Toolset build tools](https://wixtoolset.org/releases/).
|
||||
|
||||
### Compiling Installer (.MSI)
|
||||
|
||||
- From the `installer` folder open `PowerToysSetup.sln` in Visual Studio, in the `Solutions Configuration` drop-down menu select `Release`, from the `Build` menu choose `Build Solution`.
|
||||
- The resulting `PowerToysSetup.msi` installer will be available in the `installer\PowerToysSetup\x64\Release\` folder.
|
||||
|
||||
## Debugging
|
||||
|
||||
The following configuration issue only applies if the user is a member of the Administrators group.
|
||||
|
||||
Some PowerToys modules require being run with the highest permission level if the current user is a member of the Administrators group. The highest permission level is required to be able to perform some actions when an elevated application (e.g. Task Manager) is in the foreground or is the target of an action. Without elevated privileges some PowerToys modules will still work but with some limitations:
|
||||
|
||||
- The `FancyZones` module will be not be able to move an elevated window to a zone.
|
||||
- The `Shortcut Guide` module will not appear if the foreground window belongs to an elevated application.
|
||||
|
||||
To run and debug PowerToys from Visual Studio when the user is a member of the Administrators group, Visual Studio has to be started with elevated privileges. If you want to avoid running Visual Studio with elevated privileges and don't mind the limitations described above, you can do the following: open the `runner` project properties and navigate to the `Linker -> Manifest File` settings, edit the `UAC Execution Level` property and change it from `highestAvailable (level='highestAvailable')` to `asInvoker (/level='asInvoker')`, save the changes.
|
||||
|
||||
## How to create new PowerToys
|
||||
|
||||
See the instructions on [how to install the PowerToys Module project template](tools/project_template). <br />
|
||||
Specifications for the [PowerToys settings API](doc/specs/PowerToys-settings.md).
|
||||
|
||||
## Implementation details
|
||||
|
||||
### [`Runner`](runner.md)
|
||||
|
||||
The PowerToys Runner contains the project for the PowerToys.exe executable.
|
||||
It's responsible for:
|
||||
|
||||
- Loading the individual PowerToys modules.
|
||||
- Passing registered events to the PowerToys.
|
||||
- Showing a system tray icon to manage the PowerToys.
|
||||
- Bridging between the PowerToys modules and the Settings editor.
|
||||
|
||||

|
||||
|
||||
### [`Interface`](modules/interface.md)
|
||||
|
||||
Definition of the interface used by the [`runner`](/src/runner) to manage the PowerToys. All PowerToys must implement this interface.
|
||||
|
||||
### [`Common`](common.md)
|
||||
|
||||
The common lib, as the name suggests, contains code shared by multiple PowerToys components and modules, e.g. [json parsing](/src/common/json.h) and [IPC primitives](/src/common/two_way_pipe_message_ipc.h).
|
||||
|
||||
### [`Settings`](settings.md)
|
||||
|
||||
WebView project for editing the PowerToys settings.
|
||||
|
||||
The html portion of the project that is shown in the WebView is contained in [`settings-html`](/src/settings/settings-heml).
|
||||
Instructions on how build a new version and update this project are in the [Web project for the Settings UI](./settings-web.md).
|
||||
|
||||
While developing, it's possible to connect the WebView to the development server running in localhost by setting the `_DEBUG_WITH_LOCALHOST` flag to `1` and following the instructions near it in `./main.cpp`.
|
||||
|
||||
### [`Settings-web`](settings-web.md)
|
||||
This project generates the web UI shown in the [PowerToys Settings](/src/editor).
|
||||
It's a `ReactJS` project created using [Fluent UI](https://developer.microsoft.com/en-us/fluentui#/).
|
||||
|
||||
## Current modules
|
||||
### [`FancyZones`](modules/fancyzones.md)
|
||||
The FancyZones PowerToy that allows users to create custom zones on the screen, to which the windows will snap when moved.
|
||||
|
||||
### [`PowerRename`](modules/powerrename.md)
|
||||
PowerRename is a Windows Shell Context Menu Extension for advanced bulk renaming using simple search and replace or more powerful regular expression matching.
|
||||
|
||||
### [`Shortcut Guide`](modules/shortcut_guide.md)
|
||||
The Windows Shortcut Guide, displayed when the WinKey is held for some time.
|
||||
|
||||
#### Options
|
||||
|
||||
This module has a setting to serve as an example for each of the currently implemented settings property:
|
||||
|
||||
- BoolToggle property
|
||||
- IntSpinner property
|
||||
- String property
|
||||
- ColorPicker property
|
||||
- CustomAction property
|
||||
|
||||

|
||||
50
doc/devdocs/run-as-admin-detection.md
Normal file
@@ -0,0 +1,50 @@
|
||||
# PowerToys and running as Administrator
|
||||
|
||||
## Too long, Didn't Read 😁
|
||||
|
||||
If you're running any application as an administrator (aka elevated) and PowerToys is not, a few things may not work correctly when the elevated applications are in focus or trying to interact with a PowerToys feature like FancyZones.
|
||||
|
||||
## Having PowerToys keep functioning properly
|
||||
|
||||
We understand users will run applications elevated. We do as well. We have two options for you when this scenario happens:
|
||||
|
||||
1. **Recommended:** PowerToys will prompt when we detect a process that is elevated. Go to PowerToys settings inside the General Tab and click "Relaunch as administrator".
|
||||
2. Enable "Always run as administrator" in the PowerToys settings.
|
||||
|
||||
## What is "Run as Administrator" / Elevated processes
|
||||
|
||||
This is when a process runs with "elevated" privileges. Typically this would be associated with the administrator accounts on a system.
|
||||
|
||||
Basically it runs with additional access to the operating system. Most things do not need run elevated. A common scenario would be needing to run certain PowerShell commands or edit the registry.
|
||||
|
||||
How do i know my application is "elevated"? If you see this prompt (User Access Control prompt), the application is requesting it:
|
||||
|
||||
![alt text][uac]
|
||||
|
||||
At times also, elevated terminals for instance, they will typically have the phrase "Administrator" appended to the title bar. Be warned, this isn't always the case it will be appended.
|
||||
|
||||
![alt text][elevatedWindow]
|
||||
|
||||
## When does PowerToys need this
|
||||
|
||||
PowerToys in itself does not. It only needs to be elevated when it has to interact with other applications that are running elevated. If those applications are in focus, PowerToys may not function unless it is elevated as well.
|
||||
|
||||
These are the two scenarios we will not work in:
|
||||
|
||||
1. Intercepting certain types of keyboard strokes
|
||||
2. Resizing / Moving windows
|
||||
|
||||
### PowerToys affected
|
||||
|
||||
1. FancyZones
|
||||
- Snapping a window into a zone
|
||||
- Moving the window to a different zone
|
||||
2. Shortcut guide
|
||||
- Display shortcut
|
||||
3. Keyboard remapper
|
||||
- key to key remapping
|
||||
- Global level shortcuts remapping
|
||||
- App-targeted shortcuts remapping
|
||||
|
||||
[uac]: ../images/runAsAdmin/uac.png "User access control (UAC)"
|
||||
[elevatedWindow]: ../images/runAsAdmin/elevatedWindows.png "Run as admin"
|
||||
36
doc/devdocs/runner.md
Normal file
@@ -0,0 +1,36 @@
|
||||
#### [`main.cpp`](/src/runner/main.cpp)
|
||||
Contains the executable starting point, initialization code and the list of known PowerToys. All singletones are also initialized here at the start. Loads all the powertoys by scanning the `./modules` folder and `enable()`s those marked as enabled in `%LOCALAPPDATA%\Microsoft\PowerToys\settings.json` config. Then it runs [a message loop](https://docs.microsoft.com/en-us/windows/win32/winmsg/using-messages-and-message-queues) for the tray UI. Note that this message loop also [handles lowlevel_keyboard_hook events](https://github.com/microsoft/PowerToys/blob/1760af50c8803588cb575167baae0439af38a9c1/src/runner/lowlevel_keyboard_event.cpp#L24).
|
||||
|
||||
#### [`general_settings.cpp`](./general_settings.cpp)
|
||||
#### [`powertoy_module.h`](/src/runner/powertoy_module.h) and [`powertoy_module.cpp`](/src/runner/powertoy_module.cpp)
|
||||
Contains code for initializing and managing the PowerToy modules. `PowertoyModule` is a RAII-style holder for the `PowertoyModuleIface` pointer, which we got by [invoking module DLL's `powertoy_create` function](https://github.com/microsoft/PowerToys/blob/1760af50c8803588cb575167baae0439af38a9c1/src/runner/powertoy_module.cpp#L13-L24).
|
||||
|
||||
#### [`powertoys_events.cpp`](/src/runner/powertoys_events.cpp)
|
||||
Contains code that handles the various events listeners, and forwards those events to the PowerToys modules. You can learn more about the current event architecture [here](/doc/devdocs/shared-hooks.md).
|
||||
|
||||
#### [`lowlevel_keyboard_event.cpp`](/src/runner/lowlevel_keyboard_event.cpp)
|
||||
Contains code for registering the low level keyboard event hook that listens for keyboard events. Please note that `signal_event` is called from the main thread for this event.
|
||||
|
||||
#### [`win_hook_event.cpp`](/src/runner/win_hook_event.cpp)
|
||||
Contains code for registering a Windows event hook through `SetWinEventHook`, that listens for various events raised when a window is interacted with. Please note, that `signal_event` is called from a separate `dispatch_thread_proc` worker thread, so you must provide thread-safety for your `signal_event` if you intend to receive it. This is a subject to change.
|
||||
|
||||
#### [`tray_icon.cpp`](/src/runner/tray_icon.cpp)
|
||||
Contains code for managing the PowerToys tray icon and its menu commands. Note that `dispatch_run_on_main_ui_thread` is used to
|
||||
transfer received json message from the [Settings window](/doc/devdocs/settings.md) to the main thread, since we're communicating with it from [a dedicated thread](https://github.com/microsoft/PowerToys/blob/7357e40d3f54de51176efe54fda6d57028837b8c/src/runner/settings_window.cpp#L267-L271).
|
||||
#### [`settings_window.cpp`](/src/runner/settings_window.cpp)
|
||||
Contains code for starting the PowerToys settings window and communicating with it. Settings window is a separate process, so we're using [Windows pipes](https://docs.microsoft.com/en-us/windows/win32/ipc/pipes) as a transport for json messages.
|
||||
|
||||
#### [`general_settings.cpp`](/src/runner/general_settings.cpp)
|
||||
Contains code for loading, saving and applying the general setings.
|
||||
|
||||
#### [`auto_start_helper.cpp`](/src/runner/auto_start_helper.cpp)
|
||||
Contains helper code for registering and unregistering PowerToys to run when the user logs in.
|
||||
|
||||
#### [`unhandled_exception_handler.cpp`](/src/runner/unhandled_exception_handler.cpp)
|
||||
Contains helper code to get stack traces in builds. Can be used by adding a call to `init_global_error_handlers` in [`WinMain`](./main.cpp).
|
||||
|
||||
#### [`trace.cpp`](/src/runner/trace.cpp)
|
||||
Contains code for telemetry.
|
||||
|
||||
#### [`svgs`](/src/runner/svgs/)
|
||||
Contains the SVG assets used by the PowerToys modules.
|
||||
597
doc/devdocs/settings-reference.md
Normal file
@@ -0,0 +1,597 @@
|
||||
# Settings
|
||||
|
||||
While the module interface passes the settings and values thorough a JSON string, **use our helper functions**. In future we might move to a different implementation. All current modules use:
|
||||
* `load_module_settings` to load the settings from the disk.
|
||||
* `PowerToySettings::Settings` class to define module properties and the settings screen.
|
||||
* `PowerToySettings::PowerToyValues` class to parse the JSON passed by the runner.
|
||||
* `save_module_settings` to store the settings on the disk.
|
||||
|
||||
Most functions provide two overloads - one that accepts UINT with a resource ID and one that accepts strings. **Put all strings in the resource file and use the resource ID overload.**
|
||||
|
||||
|
||||
The following documents internal workings of the settings system.
|
||||
|
||||
## Overview
|
||||
|
||||
PowerToys runner provides a generic way for modules to define their settings.
|
||||
|
||||
Each module on startup is responsible for loading its own settings and initializing accordingly. When the user wants to edit settings, the runner will call [`get_config()`](modules/interface.md#get_config) module method. The module must provide a JSON which includes the module name, description but also what settings options are provided.
|
||||
|
||||
When settings from all modules are collected, a separate [settings editor app](/src/settings) is spawned. The editor wraps [an React app](/src/settings-web) and handles the communication with the runner.
|
||||
|
||||
When loaded, the React app receives the JSON passed by the runner. When user saves the settings, the editor passes the new settings values as JSON string to the runner. Runner in turn will call [`set_config()`](modules/interface.md#set_config) for all modules with appropriate JSON. When user initiates a custom action (like the Zone Editor in FancyZones), the runner will call [`call_custom_action()`](modules/interface.md#call_custom_action) providing the action name in a JSON.
|
||||
|
||||
There are C++ helper functions in [/src/common/settings_objects.h](/src/common/settings_objects.h) and [/src/common/settings_helpers.h](/src/common/settings_helpers.h). Those include classes for creating the settings options JSON and ones for parsing the incoming settings JSON.
|
||||
|
||||
### Module settings
|
||||
The value returned by the [`get_config()`](modules/interface.md#get_config) call should provide a JSON object with following fields:
|
||||
* `name` - The name of the PowerToy. Used on the nav panel on the left.
|
||||
* `version` - The settings version. Needs to be set to `"1.0"`.
|
||||
* `description` - Description of the PowerToy module.
|
||||
* `overview_link`, `video_link` - Optional links to the documentation and video preview of the PowerToy module.
|
||||
* `icon_key` - Name of the icon of the PowerToy. The SVGs for the icons are located in [/src/settings-web/src/svg](/src/settings-web/src/svg). They also need to be added in [/settings-web/src/setup_icons.tsx](/settings-web/src/setup_icons.tsx).
|
||||
* `properties` - Optional object that contains the definition of the settings screen.
|
||||
|
||||
The `properties` JSON object defines what settings controls are available to the user. Each key defines one control. The controls have some common properties:
|
||||
* The key in the `properties` which identifies the control.
|
||||
* `editor_type` - Defines the type of the control. Those are listed further.
|
||||
* `order` - Defines the order of the elements on the settings screen.
|
||||
|
||||
Each `editor_type` has its own set of properties.
|
||||
|
||||
Example module JSON (taken from Shortcut Guide):
|
||||
```json
|
||||
{
|
||||
"name": "Shortcut Guide",
|
||||
"version": "1.0",
|
||||
"description": "Shows a help overlay with Windows shortcuts when the Windows key is pressed.",
|
||||
"overview_link": "https://github.com/.../README.md",
|
||||
"icon_key": "pt-shortcut-guide",
|
||||
"properties": {
|
||||
"press_time": {
|
||||
"editor_type": "int_spinner",
|
||||
"order": 1,
|
||||
"display_name": "How long to press the Windows key before showing the Shortcut Guide (ms)",
|
||||
"value": 900,
|
||||
"min": 100,
|
||||
"max": 10000,
|
||||
"step": 100
|
||||
},
|
||||
"overlay_opacity": {
|
||||
"editor_type": "int_spinner",
|
||||
"order": 2,
|
||||
"display_name": "Opacity of the Shortcut Guide's overlay background (%)",
|
||||
"value": 90,
|
||||
"min": 0,
|
||||
"max": 100,
|
||||
"step": 1
|
||||
},
|
||||
"theme":{
|
||||
"editor_type": "choice_group",
|
||||
"order": 3,
|
||||
"display_name": "Choose Shortcut Guide overlay color",
|
||||
"value": "system",
|
||||
"options": [ {"key": "system", "text": "System default app mode"},
|
||||
{"key": "light", "text": "Light"},
|
||||
{"key": "dark", "text": "Dark"} ]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
produces this settings screen:
|
||||
|
||||

|
||||
|
||||
### Helper methods
|
||||
|
||||
PowerToys provides [a helper class](/src/common/json.h) to parse and generate JSON strings.
|
||||
|
||||
In [`settings_helpers.h`](/src/common/settings_helpers.h) there are two helper functions: `load_module_settings(powertoy_name)` and `save_general_settings(settings)` for loading and saving the module configuration.
|
||||
|
||||
In [`settings_objects.h`](/src/common/settings_objects.h) there are some helper classes:
|
||||
* `Settings` - for generating JSON with module settings definition.
|
||||
* `PowerToyValues` - for parsing JSON with settings - either loaded from file or from the settings editor.
|
||||
* `CustomActionObject` and `HotkeyObject` - for parsing custom actions and hotkey input specific JSON.
|
||||
|
||||
### General settings
|
||||
General settings control the PowerToys runner and decide which modules are enabled and which are not. The general settings screen is special - while modules provide the definition of the settings controls, the available settings on the general screen are hardcoded.
|
||||
|
||||
General settings has following properties:
|
||||
* `enabled` - Enabled/disabled status of each PowerToy.
|
||||
* `startup` - Should PowerToys start at user logon.
|
||||
* `theme` - Settings editor theme - `light`, `dark` or `system`.
|
||||
* `system_theme` - Current Windows theme - `light` or `dark`.
|
||||
* `powertoys_version` - The version of the PowerToys.
|
||||
|
||||
This JSON:
|
||||
```json
|
||||
{
|
||||
"enabled": {
|
||||
"FancyZones": true,
|
||||
"PowerRename": true,
|
||||
"Shortcut Guide": true
|
||||
},
|
||||
"startup": true,
|
||||
"theme": "light",
|
||||
"system_theme": "dark",
|
||||
"powertoys_version": "0.14.2.0"
|
||||
}
|
||||
```
|
||||
Produces this general settings screen:
|
||||
|
||||

|
||||
|
||||
## Putting it all together
|
||||
The runner combines general settings and each module settings into a single JSON that is passed to the settings editor. Example combined settings look like this:
|
||||
|
||||
```json
|
||||
{
|
||||
"general": {
|
||||
"enabled": {
|
||||
"FancyZones": true,
|
||||
"PowerRename": true,
|
||||
"Shortcut Guide": true
|
||||
},
|
||||
"startup": true,
|
||||
"theme": "light",
|
||||
"system_theme": "dark",
|
||||
"powertoys_version": "0.14.2.0"
|
||||
},
|
||||
"powertoys": {
|
||||
"FancyZones": { ... },
|
||||
"PowerRename": { ... },
|
||||
"Shortcut Guide":{
|
||||
"name": "Shortcut Guide",
|
||||
"version": "1.0",
|
||||
"description": "Shows a help overlay with Windows shortcuts when the Windows key is pressed.",
|
||||
"overview_link": "https://github.com/.../README.md",
|
||||
"icon_key": "pt-shortcut-guide",
|
||||
"properties": { ... }
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## C++ helpers
|
||||
While you can generate and parse JSON yourself there are helper methods provided.
|
||||
|
||||
### Loading settings
|
||||
When a PowerToy module is created, it should load its configuration. This can be done by calling
|
||||
```c++
|
||||
json::JsonObject PTSettingsHelper::load_module_settings(std::wstring_view powertoy_name);
|
||||
```
|
||||
declared in [`settings_helpers.h`](/src/common/settings_helpers.h). The function will return an `json::JsonObject` object containing the module settings.
|
||||
|
||||
Another option is using [`PowerToySettings::PowerToyValues`](/src/common/settings_objects.h#L67) class. A static method
|
||||
```c++
|
||||
PowerToyValues PowerToyValues::load_from_settings_file(std::wstring_view powertoy_name);
|
||||
```
|
||||
will load and parse the settings. You can also use
|
||||
```c++
|
||||
PowerToyValues PowerToyValues::from_json_string(std::wstring_view json);
|
||||
```
|
||||
to parse JSON string - for example when implementing [`set_config()`](modules/interface.md#set_config). The returned `PowerToyValues` object has helper methods that return `std::optional` with values, for example:
|
||||
```c++
|
||||
auto settings = PowerToyValues::load_from_settings_file(L"some_powertoy");
|
||||
std::optional<std::wstring> str_prop = settings.get_string_value(L"some_string_property");
|
||||
auto int_prop = settings.get_int_value(L"some_int_property");
|
||||
```
|
||||
|
||||
### Generating settings screen
|
||||
The [`PowerToySettings::Settings`](/src/common/settings_objects.h) can be used to generate settings:
|
||||
```c++
|
||||
// Need to get strings from the resource file.
|
||||
extern "C" IMAGE_DOS_HEADER __ImageBase;
|
||||
|
||||
auto hinstance = reinterpret_cast<HINSTANCE>(&__ImageBase);
|
||||
PowerToysSettings::Settings settings(hinstance, L"example_powertoy");
|
||||
settings.set_description(L"Example powertoy.");
|
||||
settings.set_overview_link(L"https://example.com");
|
||||
settings.set_icon_key(L"pt-example");
|
||||
settings.add_string(L"string_val", L"Example string label", L"example value");
|
||||
settings.add_int_spinner(L"int_val", L"Example int label", 0, 0, 100, 10);
|
||||
```
|
||||
You can then use `std::wstring serialize()` or `bool serialize_to_buffer(wchar_t* buffer, int* buffer_size)` methods to generate output JSON string.
|
||||
|
||||
### Saving settings
|
||||
Use
|
||||
```c++
|
||||
void PTSettingsHelper::save_module_settings(std::wstring_view powertoy_name, json::JsonObject& settings);
|
||||
```
|
||||
declared in [`settings_helpers.h`](/src/common/settings_helpers.h).
|
||||
|
||||
## Module settings elements
|
||||
|
||||
### Bool toggle
|
||||
```c++
|
||||
add_bool_toggle(name, description, value)
|
||||
```
|
||||
A simple on-off toggle. Parameters:
|
||||
* `name` - Key for the element in the JSON.
|
||||
* `description` - String or resource ID of the text displayed to the user.
|
||||
* `value` - Initial state of the toggle (`true` - on, `false` - off).
|
||||
|
||||
This C++:
|
||||
```c++
|
||||
settings.add_bool_toggle(L"bool_name", L"description", true);
|
||||
```
|
||||
produces this settings element:
|
||||
|
||||

|
||||
|
||||
and this generated JSON:
|
||||
```json
|
||||
{
|
||||
"properties": {
|
||||
"bool_name": {
|
||||
"editor_type": "bool_toggle",
|
||||
"order": autoincremented_number,
|
||||
"display_name": "description",
|
||||
"value": true
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The toggle value is stored as bool:
|
||||
```c++
|
||||
std::optional<bool> bool_value = settings.get_bool_value(L"bool_name");
|
||||
```
|
||||
|
||||
### Int Spinner
|
||||
```c++
|
||||
add_int_spinner(name, description, value, min, max, step)
|
||||
```
|
||||
Numeric input with dials to increment and decrement the value. Parameters:
|
||||
* `name` - Key for element in the JSON.
|
||||
* `description` - String or resource ID of the text displayed to the user.
|
||||
* `value` - Initial control value.
|
||||
* `min`, `max` - Minimum and maximum values for the input. User cannot use dials to move beyond those values, if a value out of range is inserted using the keyboard, it will get clamped to the allowed range.
|
||||
* `step` - How much the dials change the value.
|
||||
|
||||
This C++:
|
||||
```c++
|
||||
settings.add_int_spinner(L"int_spinner_name", L"description", 50, -100, 100, 10);
|
||||
```
|
||||
produces this settings element:
|
||||
|
||||

|
||||
|
||||
and this generated JSON:
|
||||
```json
|
||||
{
|
||||
"properties": {
|
||||
"int_spinner_name": {
|
||||
"editor_type": "int_spinner",
|
||||
"order": autoincremented_number,
|
||||
"display_name": "description",
|
||||
"value": 50,
|
||||
"min": -100,
|
||||
"max": 100,
|
||||
"step": 10
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The spinner value is stored as int:
|
||||
```c++
|
||||
std::optional<int> int_value = settings.get_int_value(L"int_spinner_name");
|
||||
```
|
||||
|
||||
### String
|
||||
```c++
|
||||
add_string(name, description, value)
|
||||
```
|
||||
Single line text input. Parameters:
|
||||
* `name` - Key for element in the JSON.
|
||||
* `description` - String or resource ID of the text displayed to the user.
|
||||
* `value` - Default value for the input.
|
||||
|
||||
This C++:
|
||||
```c++
|
||||
settings.add_string(L"string_name", L"description", L"value");
|
||||
```
|
||||
produces this settings element:
|
||||
|
||||

|
||||
|
||||
and this generated JSON:
|
||||
```json
|
||||
{
|
||||
"properties": {
|
||||
"string_name": {
|
||||
"editor_type": "string_text",
|
||||
"order": autoincremented_number,
|
||||
"display_name": "description",
|
||||
"value": "value"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The input value is stored as `std::wstring`:
|
||||
```c++
|
||||
std::optional<std::wstring> string_value = settings.get_string_value(L"string_name");
|
||||
```
|
||||
|
||||
### Multiline string
|
||||
```c++
|
||||
add_multiline_string(name, description, value)
|
||||
```
|
||||
Multiline text input. Parameters:
|
||||
* `name` - Key for element in the JSON.
|
||||
* `description` - String or resource ID of the text displayed to the user.
|
||||
* `value` - Default value for the input. Can have multiple lines.
|
||||
|
||||
This C++:
|
||||
```c++
|
||||
settings.add_multiline_string(L"multiline_name", L"description", L"multiline1\nmultiline2");
|
||||
```
|
||||
produces this settings element:
|
||||
|
||||

|
||||
|
||||
and this generated JSON:
|
||||
```json
|
||||
{
|
||||
"properties": {
|
||||
"multiline_name": {
|
||||
"editor_type": "string_text",
|
||||
"multiline": true,
|
||||
"order": autoincremented_number,
|
||||
"display_name": "description",
|
||||
"value": "multiline1\nmultiline2"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The input value is stored as string:
|
||||
```c++
|
||||
std::optional<std::wstring> value = settings.get_string_value(L"multiline_name");
|
||||
```
|
||||
|
||||
### Color picker
|
||||
```c++
|
||||
add_color_picker(name, description, value)
|
||||
```
|
||||
|
||||
Allows user to pick a color. Parameters:
|
||||
* `name` - Key for element in the JSON.
|
||||
* `description` - String or resource ID of the text displayed to the user.
|
||||
* `value` - Initial color, as a string in `"#RRGGBB"` format.
|
||||
|
||||
This C++:
|
||||
```c++
|
||||
settings.add_color_picker(L"colorpicker_name", L"description", L"#102040");
|
||||
```
|
||||
produces this settings element:
|
||||
|
||||

|
||||
|
||||
and this generated JSON:
|
||||
```json
|
||||
{
|
||||
"properties": {
|
||||
"colorpicker_name": {
|
||||
"editor_type": "color_picker",
|
||||
"order": autoincremented_number,
|
||||
"display_name": "description",
|
||||
"value": "#102040"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The color picker value is stored as `std::wstring`:
|
||||
```c++
|
||||
std::optional<std::wstring> value = settings.get_string_value(L"colorpicker_name");
|
||||
```
|
||||
|
||||
### Hotkey
|
||||
```c++
|
||||
settings.add_hotkey(name, description, hotkey)
|
||||
```
|
||||
Input for capturing hotkeys. Parameters:
|
||||
* `name` - Key for element in the JSON.
|
||||
* `description` - String or resource ID of the text displayed to the user.
|
||||
* `hotkey` - Instance of `PowerToysSettings::HotkeyObject` class.
|
||||
|
||||
You can create `PowerToysSettings::HotkeyObject` object either by using helper `from_settings` static method or by providing JSON object to `from_json` static method:
|
||||
|
||||
The `PowerToysSettings::HotkeyObject::from_settings` take following parameters:
|
||||
* `win_pressed` - Is the WinKey pressed.
|
||||
* `ctrl_pressed` - Is the Ctrl key pressed.
|
||||
* `alt_pressed` - Is the Alt key pressed.
|
||||
* `shift_pressed` - Is the Shift key pressed.
|
||||
* `vk_code` - The [virtual key-code](https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes) of the key.
|
||||
|
||||
The displayed key is deduced from the `vk_code` using the users keyboard layout and language settings.
|
||||
|
||||
Similar parameters can be passed using the `from_json` static method:
|
||||
```c++
|
||||
json::JsonObject json;
|
||||
json.SetNamedValue(L"win", json::value(win_pressed));
|
||||
json.SetNamedValue(L"ctrl", json::value(ctrl_pressed));
|
||||
json.SetNamedValue(L"alt", json::value(alt_pressed));
|
||||
json.SetNamedValue(L"shift", json::value(shift_pressed));
|
||||
json.SetNamedValue(L"code", json::value(vk_code));
|
||||
json.SetNamedValue(L"key", json::value(L"string with key name"));
|
||||
auto hotkey = PowerToysSettings::HotkeyObject::from_json(json);
|
||||
```
|
||||
|
||||
|
||||
This C++:
|
||||
```c++
|
||||
settings.add_hotkey(L"hotkey_name",
|
||||
L"description",
|
||||
PowerToysSettings::HotkeyObject::from_settings(true, true, true, true, VK_F5));
|
||||
```
|
||||
produces this settings element:
|
||||
|
||||

|
||||
|
||||
and this generated JSON (`114` is the value of `VK_F5`):
|
||||
```json
|
||||
{
|
||||
"properties": {
|
||||
"hotkey_name": {
|
||||
"editor_type": "hotkey",
|
||||
"order": autoincremented_number,
|
||||
"display_name": "description",
|
||||
"value": {
|
||||
"win": true,
|
||||
"ctrl": true,
|
||||
"alt": true,
|
||||
"shift": true,
|
||||
"code": 114,
|
||||
"key": "F5"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The hotkey value is returned as JSON, with the same format as `from_json` method uses. You can use `HotkeyObject` class to parse this JSON, since it offers some helper methods. A typical example of registering a hotkey:
|
||||
```c++
|
||||
std::optional<json::JsonObject> value = settings.get_json(L"hotkey_name");
|
||||
if (value) {
|
||||
auto hotkey = PowerToysSettings::HotkeyObject::from_json(*value);
|
||||
RegisterHotKey(hwnd, 1, hotkey.get_modifiers(), hotkey.get_code());
|
||||
}
|
||||
```
|
||||
|
||||
### Choice group
|
||||
```c++
|
||||
add_choice_group(name, description, value, vector<pair<wstring, wstring>> keys_and_texts)
|
||||
add_choice_group(name, description, value, vector<pair<wstring, UINT>> keys_and_texts)
|
||||
```
|
||||
|
||||
A radio buttons group. Parameters:
|
||||
* `name` - Key for element in the JSON.
|
||||
* `description` - String or resource ID of the text displayed to the user.
|
||||
* `value` - Key selected by default.
|
||||
* `keys_and_text` - Vector of radio buttons definitions: key and the displayed label. The texts can either be strings or resource IDs.
|
||||
|
||||
This C++:
|
||||
```c++
|
||||
settings.add_choice_group(L"choice_group_name", L"description", L"val1", { { L"val1", L"value-1" },
|
||||
{ L"val2", L"value-2" },
|
||||
{ L"val3", L"value-3" } });
|
||||
```
|
||||
produces this settings element:
|
||||
|
||||

|
||||
|
||||
and this generated JSON:
|
||||
```json
|
||||
{
|
||||
"properties": {
|
||||
"choice_group_name": {
|
||||
"editor_type": "choice_group",
|
||||
"order": autoincremented_number,
|
||||
"display_name": "description",
|
||||
"value": "val1",
|
||||
"options": [ {"key": "val1", "text": "value-1"},
|
||||
{"key": "val2", "text": "value-2"},
|
||||
{"key": "val3", "text": "value-3"} ]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The chosen button value is stored as a string with the key of the button selected by the user:
|
||||
```c++
|
||||
std::optional<std::wstring> value = settings.get_string_value(L"choice_group_name");
|
||||
```
|
||||
|
||||
### Dropdown
|
||||
```c++
|
||||
add_dropdown(name, description, value, vector<pair<wstring, wstring>> keys_and_texts)
|
||||
add_dropdown(name, description, value, vector<pair<wstring, UINT>> keys_and_texts)
|
||||
```
|
||||
|
||||
A dropdown. Parameters:
|
||||
* `name` - Key for element in the JSON.
|
||||
* `description` - String or resource ID of the text displayed to the user.
|
||||
* `value` - Key selected by default.
|
||||
* `keys_and_text` - Vector of the options definitions: key and the displayed label. The texts can either be strings or resource IDs.
|
||||
|
||||
This C++:
|
||||
```c++
|
||||
settings.add_dropdown(L"dropdown_name", L"description", L"val2", { { L"val1", L"value-1" },
|
||||
{ L"val2", L"value-2" },
|
||||
{ L"val3", L"value-3" } });
|
||||
```
|
||||
produces this settings element:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
and this generated JSON:
|
||||
```json
|
||||
{
|
||||
"properties": {
|
||||
"dropdown_name": {
|
||||
"editor_type": "dropdown",
|
||||
"order": autoincremented_number,
|
||||
"display_name": "description",
|
||||
"value": "val1",
|
||||
"options": [ {"key": "val1", "text": "value-1"},
|
||||
{"key": "val2", "text": "value-2"},
|
||||
{"key": "val3", "text": "value-3"} ]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The chosen value is stored as a string with the key of the option selected by the user:
|
||||
```c++
|
||||
std::optional<std::wstring> value = settings.get_string_value(L"dropdown_name");
|
||||
```
|
||||
### Custom action
|
||||
|
||||
```c++
|
||||
add_custom_action(name, description, button_text, ext_description)
|
||||
```
|
||||
|
||||
Adds a button with a description. Parameters:
|
||||
* `name` - Key for element in the JSON.
|
||||
* `description` - String or resource ID of the text displayed to the user.
|
||||
* `button_text` - String or resource ID for the button label.
|
||||
* `ext_description` - String or resource ID for the extended description.
|
||||
|
||||
This C++:
|
||||
```c++
|
||||
settings.add_custom_action(L"custom_action_name", L"description", L"button_text", L"ext_description");
|
||||
```
|
||||
produces this settings element:
|
||||
|
||||

|
||||
|
||||
and this generated JSON:
|
||||
```json
|
||||
{
|
||||
"properties": {
|
||||
"custom_action_name": {
|
||||
"editor_type": "custom_action",
|
||||
"order": autoincremented_number,
|
||||
"display_name": "description",
|
||||
"button_text": "button_text",
|
||||
"value": "ext_description"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
When the button is pressed, the `call_custom_action` method of the module will be called, with JSON containing the name of the action. In our example:
|
||||
```json
|
||||
{
|
||||
"action_name":"custom_action_name",
|
||||
"value":"ext_description"
|
||||
}
|
||||
```
|
||||
@@ -1,10 +1,3 @@
|
||||
# Web project for the Settings UI
|
||||
|
||||
## Introduction
|
||||
|
||||
This project generates the web UI shown in the [PowerToys Settings](/src/editor).
|
||||
It's a `ReactJS` project created using [UI Fabric](https://developer.microsoft.com/en-us/fabric#/).
|
||||
|
||||
## Build Commands
|
||||
|
||||
Here are the commands to build and test this project:
|
||||
@@ -22,9 +15,11 @@ npm run start
|
||||
npm run build
|
||||
```
|
||||
|
||||
**Note:** you will need to rebuild the settings project to pick up the changes
|
||||
|
||||
## Updating the icons
|
||||
|
||||
Icons inside [`src/icons/`](./src/icons/) were generated from the [Office UI Fabric Icons subset generation tool.](https://uifabricicons.azurewebsites.net/)
|
||||
Icons inside [`src/icons/`](/src/settings-web/src/icons/) were generated from the [Office UI Fabric Icons subset generation tool.](https://uifabricicons.azurewebsites.net/)
|
||||
|
||||
In case the subset needs to be changed, additional steps are needed to include the icon font in the built `dist/bundle.js`:
|
||||
- Copy the inline font data taken from [`src/icons/css/fabric-icons-inline.css`](src/icons/css/fabric-icons-inline.css) and place it in the `fontFace` `src` value in [`src/icons/src/fabric-icons.ts`](src/icons/src/fabric-icons.ts).
|
||||
@@ -37,44 +32,44 @@ SVG icons, including the icons for each PowerToy listed in the Settings, are con
|
||||
|
||||
The project structure is based on the [`UI Fabric` scaffold](https://developer.microsoft.com/en-us/fabric#/get-started/web#option-1-quick-start) obtained by initializing it with `npm init uifabric`.
|
||||
|
||||
#### [index.html](./index.html)
|
||||
#### [index.html](/src/settings-web/index.html)
|
||||
The HTML entry-point of the project.
|
||||
Loads the `ReactJS` distribution script.
|
||||
Defines JavaScript functions to receive and send messages to the [PowerToys Settings](/src/editor) window.
|
||||
|
||||
#### [src/index.tsx](./src/index.tsx)
|
||||
#### [src/index.tsx](/src/settings-web/src/index.tsx)
|
||||
Main `ReactJS` entrypoint, initializing the `ReactDOM`.
|
||||
|
||||
#### [src/setup_icons.tsx](./src/setup_icons.tsx)
|
||||
#### [src/setup_icons.tsx](/src/settings-web/src/setup_icons.tsx)
|
||||
Defines the `setup_powertoys_icons` function that registers the icons to be used in the components.
|
||||
|
||||
#### [src/components/](./src/components/)
|
||||
#### [src/components/](/src/settings-web/src/components/)
|
||||
Contains the `ReactJS` components, including the Settings controls for each type of setting.
|
||||
|
||||
#### [src/components/App.tsx](./src/components/App.tsx)
|
||||
#### [src/components/App.tsx](/src/settings-web/src/components/App.tsx)
|
||||
Defines the main App component, containing the UI layout, navigation menu, dialogs and main load/save logic.
|
||||
|
||||
#### [src/components/GeneralSettings.tsx](./src/components/GeneralSettings.tsx)
|
||||
#### [src/components/GeneralSettings.tsx](/src/settings-web/src/components/GeneralSettings.tsx)
|
||||
Defines the PowerToys General Settings component, including logic to construct the object sent to PowerToys to change the General settings.
|
||||
|
||||
#### [src/components/ModuleSettings.tsx](./src/components/ModuleSettings.tsx)
|
||||
#### [src/components/ModuleSettings.tsx](/src/settings-web/src/components/ModuleSettings.tsx)
|
||||
Defines the component that generates the settings screen for a PowerToy depending on its settings definition.
|
||||
|
||||
#### [src/components/BaseSettingsControl.tsx](./src/components/BaseSettingsControl.tsx)
|
||||
#### [src/components/BaseSettingsControl.tsx](/src/settings-web/src/components/BaseSettingsControl.tsx)
|
||||
Defines the base class for a Settings control.
|
||||
|
||||
#### [src/css/layout.css](./src/css/layout.css)
|
||||
#### [src/css/layout.css](/src/settings-web/src/css/layout.css)
|
||||
General layout styles.
|
||||
|
||||
#### [src/icons/](./src/icons/)
|
||||
#### [src/icons/](/src/settings-web/src/icons/)
|
||||
Icons generated from the [Office UI Fabric Icons subset generation tool.](https://uifabricicons.azurewebsites.net/)
|
||||
|
||||
#### [src/svg/](./src/svg/)
|
||||
#### [src/svg/](/src/settings-web/src/svg/)
|
||||
SVG icon assets.
|
||||
|
||||
## Creating a new settings control
|
||||
|
||||
The [`BaseSettingsControl` class](./src/components/BaseSettingsControl.tsx) can be extended to create a new Settings control type.
|
||||
The [`BaseSettingsControl` class](/src/settings-web/src/components/BaseSettingsControl.tsx) can be extended to create a new Settings control type.
|
||||
|
||||
```tsx
|
||||
export class BaseSettingsControl extends React.Component <any, any> {
|
||||
@@ -92,7 +87,7 @@ export class BaseSettingsControl extends React.Component <any, any> {
|
||||
A settings control overrides the `get_value` function to return the value to be used for the Setting the control is representing.
|
||||
It will use the `parent_on_change` property to signal that the user made some changes to the settings.
|
||||
|
||||
Here's the [`StringTextSettingsControl`](./src/components/StringTextSettingsControl.tsx) component to serve as an example:
|
||||
Here's the [`StringTextSettingsControl`](/src/settings-web/src/components/StringTextSettingsControl.tsx) component to serve as an example:
|
||||
|
||||
```tsx
|
||||
export class StringTextSettingsControl extends BaseSettingsControl {
|
||||
@@ -153,8 +148,8 @@ Each settings property has a `editor_type` field that's used to differentiate be
|
||||
}
|
||||
```
|
||||
|
||||
A new Settings control component can be added to [`src/components/`](./src/components/).
|
||||
To render the new Settings control, its `editor_type` and component instance need to be added to the [`ModuleSettings` component render()](./src/components/ModuleSettings.tsx):
|
||||
A new Settings control component can be added to [`src/components/`](/src/settings-web/src/components/).
|
||||
To render the new Settings control, its `editor_type` and component instance need to be added to the [`ModuleSettings` component render()](/src/settings-web/src/components/ModuleSettings.tsx):
|
||||
```tsx
|
||||
import React from 'react';
|
||||
import {StringTextSettingsControl} from './StringTextSettingsControl';
|
||||
287
doc/devdocs/settings.md
Normal file
@@ -0,0 +1,287 @@
|
||||
# Settings
|
||||
|
||||
## Overview
|
||||
|
||||
PowerToys provides a common framework for settings. It can be used to save and load settings on disk, and provides a user interface for changing the options.
|
||||
|
||||
## Initialization
|
||||
When a PowerToy module is created, it should load its configuration using [`PowerToyValues`](/src/common/settings_objects.h) class. The class provides static `load_from_settings_file` method which takes one parameter - the PowerToy module name. The `PowerToyValues` class provides methods to extract values. The method return `std::optional` - it is possible, that the method will return `std::nullopt` in which case you must use defaults.
|
||||
```c++
|
||||
class ExamplePowertoy : public PowertoyModuleIface
|
||||
{
|
||||
public:
|
||||
ExamplePowertoy()
|
||||
{
|
||||
auto settings = PowerToySettings::PowerToyValues::load_from_settings_file(L"Example Powertoy");
|
||||
// See if value is set, otherwise keep the default value
|
||||
if (auto int_value = settings.get_int_value(L"int_setting"))
|
||||
{
|
||||
m_int_setting = *int_value;
|
||||
}
|
||||
if (auto string_value = setting.get_string_value("string_setting"))
|
||||
{
|
||||
m_string_setting = *string_value;
|
||||
}
|
||||
}
|
||||
// ...
|
||||
private:
|
||||
// Settings and their default values
|
||||
int m_int_setting = 10;
|
||||
std::wstring m_string_setting = L"default";
|
||||
}
|
||||
```
|
||||
|
||||
## Settings screen
|
||||
When users starts the settings screen, the runner will call the [`get_config()`](modules/interface.md) method. The interface expects the method to fill provided buffer. Use the [`Settings`](/src/common/settings_objects.h) class to construct proper response with proper format. The class has helper method to set description and links fields, it also provides a way to define the content of the settings screen. Keep all the strings in the resource file and provide the resource IDs to the methods.
|
||||
```c++
|
||||
extern "C" IMAGE_DOS_HEADER __ImageBase; // Needed to get strings from the resource file
|
||||
|
||||
bool ExamplePowertoy::get_config(wchar_t* buffer, int* buffer_size)
|
||||
{
|
||||
PowerToySettings::Settings settings(reinterpret_cast<HINSTANCE>(&__ImageBase), L"Example Powertoy");
|
||||
// Set PowerToy description
|
||||
settings.set_description(IDS_POWERTOY_DESCRIPTION);
|
||||
settings.set_icon_key("pt_icon_key");
|
||||
settings.set_overview_link(IDS_POWERTOY_OVERVIEW_LINK);
|
||||
settings.set_video_link(IDS_POWERTOY_OVERVIEW_LINK);
|
||||
|
||||
// Add int and string settings, provide current values:
|
||||
settings.add_int_spinner(L"int_setting", IDS_INT_SETTING_DESCRIPTION, m_int_setting, 0, 100, 10);
|
||||
settings.add_string(L"string_setting", IDS_STRING_SETTING_DESCRIPTION, m_string_setting);
|
||||
|
||||
// Use the build-in machinery to return the configuration:
|
||||
return settings.serialize_to_buffer(buffer, buffer_size);
|
||||
}
|
||||
```
|
||||
The list of all the available settings elements and their description is [further in this doc](#available-settings-elements). New PowerToy icons need to be [added to the `settings-web` project](https://github.com/microsoft/PowerToys/blob/master/doc/devdocs/settings-web.md#updating-the-icons).
|
||||
|
||||
## User changes settings
|
||||
When user closes the settings screen, the runner will call the [`get_config()`](modules/interface.md) method. Use [`PowerToyValues`](/src/common/settings_objects.h) class static `from_json_string` method to parse the settings. After that, the code is similar to loading the settings from disk:
|
||||
```c++
|
||||
void ExamplePowertoy::set_config(const wchar_t* config)
|
||||
{
|
||||
auto settings = PowerToySettings::PowerToyValues::from_json_string(config);
|
||||
// See if value is set update the values
|
||||
if (auto int_value = settings.get_int_value(L"int_setting"))
|
||||
{
|
||||
m_int_setting = *int_value;
|
||||
}
|
||||
if (auto string_value = setting.get_string_value("string_setting"))
|
||||
{
|
||||
m_string_setting = *string_value;
|
||||
}
|
||||
// Save the new settings to disk
|
||||
settings.save_to_settings_file();
|
||||
}
|
||||
```
|
||||
|
||||
## Detailed reference
|
||||
For a detailed reference of how the settings are implemented in the runner and in the settings editor, consult [this detailed guide](settings-reference.md).
|
||||
|
||||
# Available settings elements
|
||||
|
||||
## Bool toggle
|
||||
<table><tr><td align="center">
|
||||
<img src="../images/settings/bool_toggle.png" width="80%">
|
||||
</td></tr></table>
|
||||
|
||||
```c++
|
||||
settings.add_bool_toggle(name, description, value)
|
||||
```
|
||||
A simple on-off toggle. Parameters:
|
||||
* `name` - Key for the element in the JSON.
|
||||
* `description` - Resource ID of the text displayed to the user.
|
||||
* `value` - Initial state of the toggle (`true` - on, `false` - off).
|
||||
|
||||
The toggle value is stored as bool:
|
||||
```c++
|
||||
std::optional<bool> bool_value = settings.get_bool_value(L"bool_name");
|
||||
```
|
||||
|
||||
## Int Spinner
|
||||
<table><tr><td align="center">
|
||||
<img src="../images/settings/int_spinner.png" width="80%">
|
||||
</td></tr></table>
|
||||
|
||||
```c++
|
||||
settings.add_int_spinner(name, description, value, min, max, step)
|
||||
```
|
||||
Numeric input with dials to increment and decrement the value. Parameters:
|
||||
* `name` - Key for element in the JSON.
|
||||
* `description` - Resource ID of the text displayed to the user.
|
||||
* `value` - Initial control value.
|
||||
* `min`, `max` - Minimum and maximum values for the input. User cannot use dials to move beyond those values, if a value out of range is inserted using the keyboard, it will get clamped to the allowed range.
|
||||
* `step` - How much the dials change the value.
|
||||
|
||||
The spinner value is stored as int:
|
||||
```c++
|
||||
std::optional<int> int_value = settings.get_int_value(L"int_spinner_name");
|
||||
```
|
||||
|
||||
## String
|
||||
<table><tr><td align="center">
|
||||
<img src="../images/settings/string.png" width="80%">
|
||||
</td></tr></table>
|
||||
|
||||
```c++
|
||||
settings.add_string(name, description, value)
|
||||
```
|
||||
Single line text input. Parameters:
|
||||
* `name` - Key for element in the JSON.
|
||||
* `description` - Resource ID of the text displayed to the user.
|
||||
* `value` - Default value for the input.
|
||||
|
||||
The input value is stored as `std::wstring`:
|
||||
```c++
|
||||
std::optional<std::wstring> string_value = settings.get_string_value(L"string_name");
|
||||
```
|
||||
|
||||
## Multiline string
|
||||
<table><tr><td align="center">
|
||||
<img src="../images/settings/multiline.png" width="80%">
|
||||
</td></tr></table>
|
||||
|
||||
```c++
|
||||
settings.add_multiline_string(name, description, value)
|
||||
```
|
||||
Multiline text input. Parameters:
|
||||
* `name` - Key for element in the JSON.
|
||||
* `description` - Resource ID of the text displayed to the user.
|
||||
* `value` - Default value for the input. Can have multiple lines.
|
||||
|
||||
The input value is stored as string:
|
||||
```c++
|
||||
std::optional<std::wstring> value = settings.get_string_value(L"multiline_name");
|
||||
```
|
||||
|
||||
## Color picker
|
||||
<table><tr><td align="center">
|
||||
<img src="../images/settings/color_picker.png" width="80%">
|
||||
</td></tr></table>
|
||||
|
||||
```c++
|
||||
settings.add_color_picker(name, description, value)
|
||||
```
|
||||
|
||||
Allows user to pick a color. Parameters:
|
||||
* `name` - Key for element in the JSON.
|
||||
* `description` - Resource ID of the text displayed to the user.
|
||||
* `value` - Initial color, as a string in `"#RRGGBB"` format.
|
||||
|
||||
The color picker value is stored as `std::wstring` as `#RRGGBB`:
|
||||
```c++
|
||||
std::optional<std::wstring> value = settings.get_string_value(L"colorpicker_name");
|
||||
```
|
||||
|
||||
## Hotkey
|
||||
<table><tr><td align="center">
|
||||
<img src="../images/settings/hotkey.png" width="80%">
|
||||
</td></tr></table>
|
||||
|
||||
```c++
|
||||
settings.add_hotkey(name, description, hotkey)
|
||||
```
|
||||
Input for capturing hotkeys. Parameters:
|
||||
* `name` - Key for element in the JSON.
|
||||
* `description` - Resource ID of the text displayed to the user.
|
||||
* `hotkey` - Instance of `PowerToysSettings::HotkeyObject` class.
|
||||
|
||||
You can create `PowerToysSettings::HotkeyObject` object either by using helper `from_settings` static method or by providing a JSON object to `from_json` static method.
|
||||
|
||||
The `PowerToysSettings::HotkeyObject::from_settings` take following parameters:
|
||||
* `win_pressed` - Is the WinKey pressed.
|
||||
* `ctrl_pressed` - Is the Ctrl key pressed.
|
||||
* `alt_pressed` - Is the Alt key pressed.
|
||||
* `shift_pressed` - Is the Shift key pressed.
|
||||
* `vk_code` - The [virtual key-code](https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes) of the key.
|
||||
|
||||
The displayed key is deduced from the `vk_code` using the users keyboard layout and language settings.
|
||||
|
||||
The hotkey value is returned as JSON, which can be used with the `from_json` method to create a `HotkeyObject` object. A typical example of registering a hotkey:
|
||||
```c++
|
||||
std::optional<json::JsonObject> value = settings.get_json(L"hotkey_name");
|
||||
if (value) {
|
||||
auto hotkey = PowerToysSettings::HotkeyObject::from_json(*value);
|
||||
RegisterHotKey(hwnd, 1, hotkey.get_modifiers(), hotkey.get_code());
|
||||
}
|
||||
```
|
||||
|
||||
## Choice group
|
||||
<table><tr><td align="center">
|
||||
<img src="../images/settings/choice_group.png" width="80%">
|
||||
</td></tr></table>
|
||||
|
||||
```c++
|
||||
add_choice_group(name, description, value, vector<pair<wstring, UINT>> keys_and_texts)
|
||||
```
|
||||
A radio buttons group. Parameters:
|
||||
* `name` - Key for element in the JSON.
|
||||
* `description` - Resource ID of the text displayed to the user.
|
||||
* `value` - Key selected by default.
|
||||
* `keys_and_text` - Vector of radio buttons definitions: key and the displayed label.
|
||||
|
||||
|
||||
The chosen button value is stored as a string with the key of the button selected by the user:
|
||||
```c++
|
||||
std::optional<std::wstring> value = settings.get_string_value(L"choice_group_name");
|
||||
```
|
||||
|
||||
## Dropdown
|
||||
<table>
|
||||
<tr><td align="center">
|
||||
<img src="../images/settings/dropdown_1.png" width="80%">
|
||||
</td></tr>
|
||||
<tr><td align="center">
|
||||
<img src="../images/settings/dropdown_2.png" width="80%">
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
```c++
|
||||
add_dropdown(name, description, value, vector<pair<wstring, UINT>> keys_and_texts)
|
||||
```
|
||||
|
||||
A dropdown. Parameters:
|
||||
* `name` - Key for element in the JSON.
|
||||
* `description` - Resource ID of the text displayed to the user.
|
||||
* `value` - Key selected by default.
|
||||
* `keys_and_text` - Vector of the options definitions: key and the displayed label.
|
||||
|
||||
The chosen value is stored as a string with the key of the option selected by the user:
|
||||
```c++
|
||||
std::optional<std::wstring> value = settings.get_string_value(L"dropdown_name");
|
||||
```
|
||||
## Custom action
|
||||
<table><tr><td align="center">
|
||||
<img src="../images/settings/custom_action.png" width="80%">
|
||||
</td></tr></table>
|
||||
|
||||
```c++
|
||||
add_custom_action(name, description, button_text, ext_description)
|
||||
```
|
||||
|
||||
Adds a button with a description. Parameters:
|
||||
* `name` - Key for element in the JSON.
|
||||
* `description` - Resource ID of the text displayed to the user.
|
||||
* `button_text` - Resource ID for the button label.
|
||||
* `ext_description` - Resource ID for the extended description.
|
||||
|
||||
When the button is pressed, the `call_custom_action` method of the module will be called, with JSON containing the name of the action. Parse it using `PowerToysSettings::CustomActionObject`:
|
||||
```c++
|
||||
void ExamplePowertoy::call_custom_action(const wchar_t* action) override
|
||||
{
|
||||
auto action_object = PowerToysSettings::CustomActionObject::from_json_string(action);
|
||||
auto name = action_object.get_name(); // same value as the 'name' parameter
|
||||
// .. do stuff ..
|
||||
}
|
||||
```
|
||||
|
||||
# File organization
|
||||
|
||||
### [main.cpp](/src/settings/main.cpp)
|
||||
Contains the main executable code, initializing and managing the Window containing the WebView and communication with the main PowerToys executable.
|
||||
|
||||
### [StreamURIResolverFromFile.cpp](/src/settings/StreamURIResolverFromFile.cpp)
|
||||
Defines a class implementing `IUriToStreamResolver`. Allows the WebView to navigate to filesystem files in this Win32 project.
|
||||
|
||||
### [settings-html/](/src/settings/settings-html/)
|
||||
Contains the assets file from building the [Web project for the Settings UI](/src/settings./settings-web). It will be loaded by the WebView.
|
||||
@@ -1,85 +1,85 @@
|
||||
# Shared hooks
|
||||
|
||||
To minimize the performance impact on the machine only `runner` installs global hooks, passing the events to registered callbacks in each PowerToy module.
|
||||
|
||||
When a PowerToy module is loaded, the `runner` calls the [`get_events()`](/src/modules/interface/powertoy_module_interface.h#L40) method to get a NULL-terminated array of NULL-terminated strings with the names of the events that the PowerToy wants to subscribe to. A `const wchar_t*` string is provided for each of the event names.
|
||||
|
||||
Events are signalled by the `runner` calling the [`signal_event(name, data)`](/src/modules/interface/powertoy_module_interface.h#L53) method of the PowerToy module. The `name` parameter contains the NULL-terminated name of the event. The `data` parameter and the method return value are specific for each event.
|
||||
|
||||
Currently supported hooks:
|
||||
* `"ll_keyboard"` - [Low Level Keyboard Hook](#low-level-keyboard-hook)
|
||||
* `"win_hook_event"` - [Windows Event Hook](#windows-event-hook)
|
||||
|
||||
## Low Level Keyboard Hook
|
||||
|
||||
This event is signaled whenever the user presses or releases a key on the keyboard. To subscribe to this event, add `"ll_keyboard"` to the table returned by the `get_events()` method.
|
||||
|
||||
The PowerToys runner installs low-level keyboard hook using `SetWindowsHookEx(WH_KEYBOARD_LL, ...)`. See [this MSDN page](https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms644985(v%3Dvs.85)) for details.
|
||||
|
||||
When a keyboard event is signaled and `ncCode` equals `HC_ACTION`, the `wParam` and `lParam` event parameters are passed to all subscribed clients in the [`LowlevelKeyboardEvent`](/src/modules/interface/lowlevel_keyboard_event_data.h#L38-L41) struct.
|
||||
|
||||
The `intptr_t data` event argument is a pointer to the `LowlevelKeyboardEvent` struct.
|
||||
|
||||
A non-zero return value from any of the subscribed PowerToys will cause the runner hook proc to return 1, thus swallowing the keyboard event.
|
||||
|
||||
Example usage, that makes Windows ignore the L key:
|
||||
|
||||
```c++
|
||||
virtual const wchar_t** get_events() override {
|
||||
static const wchar_t* events[2] = { ll_keyboard,
|
||||
nullptr };
|
||||
return events;
|
||||
}
|
||||
|
||||
virtual intptr_t signal_event(const wchar_t* name, intptr_t data) override {
|
||||
if (wcscmp(name, ll_keyboard) == 0) {
|
||||
auto& event = *(reinterpret_cast<LowlevelKeyboardEvent*>(data));
|
||||
// The L key has vkCode of 0x4C, see:
|
||||
// https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
|
||||
if (event.wParam == WM_KEYDOWN && event.lParam->vkCode == 0x4C) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Windows Event Hook
|
||||
|
||||
This event is signaled for [a range of events](https://docs.microsoft.com/pl-pl/windows/win32/winauto/event-constants). To subscribe to this event, add `"win_hook_event"` to the table returned by the `get_events()` method. See [this MSDN doc](https://docs.microsoft.com/pl-pl/windows/win32/api/winuser/nf-winuser-setwineventhook) for details.
|
||||
|
||||
The `intptr_t data` event argument is a pointer to the [`WinHookEvent`](/src/modules/interface/win_hook_event_data.h#L43-L50) struct.
|
||||
|
||||
The return value of the event handler is ignored.
|
||||
|
||||
Example usage, that detects a window being resized:
|
||||
|
||||
```c++
|
||||
virtual const wchar_t** get_events() override {
|
||||
static const wchar_t* events[2] = { win_hook_event,
|
||||
nullptr };
|
||||
return events;
|
||||
}
|
||||
|
||||
virtual intptr_t signal_event(const wchar_t* name, intptr_t data) override {
|
||||
if (wcscmp(name, win_hook_event) == 0) {
|
||||
auto& event = *(reinterpret_cast<WinHookEvent*>(data));
|
||||
switch (event.event) {
|
||||
case EVENT_SYSTEM_MOVESIZESTART:
|
||||
size_start(event.hwnd);
|
||||
break;
|
||||
case EVENT_SYSTEM_MOVESIZEEND:
|
||||
size_end(event.hwnd);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
Taking too long to process the events has negative impact on the whole system performance. To address this, the events are signaled from a different thread, not from the event hook callback itself.
|
||||
# Shared hooks
|
||||
|
||||
To minimize the performance impact on the machine only `runner` installs global hooks, passing the events to registered callbacks in each PowerToy module.
|
||||
|
||||
When a PowerToy module is loaded, the `runner` calls the [`get_events()`](/src/modules/interface/powertoy_module_interface.h#L40) method to get a NULL-terminated array of NULL-terminated strings with the names of the events that the PowerToy wants to subscribe to. A `const wchar_t*` string is provided for each of the event names.
|
||||
|
||||
Events are signalled by the `runner` calling the [`signal_event(name, data)`](/src/modules/interface/powertoy_module_interface.h#L53) method of the PowerToy module. The `name` parameter contains the NULL-terminated name of the event. The `data` parameter and the method return value are specific for each event.
|
||||
|
||||
Currently supported hooks:
|
||||
* `"ll_keyboard"` - [Low Level Keyboard Hook](#low-level-keyboard-hook)
|
||||
* `"win_hook_event"` - [Windows Event Hook](#windows-event-hook)
|
||||
|
||||
## Low Level Keyboard Hook
|
||||
|
||||
This event is signaled whenever the user presses or releases a key on the keyboard. To subscribe to this event, add `"ll_keyboard"` to the table returned by the `get_events()` method.
|
||||
|
||||
The PowerToys runner installs low-level keyboard hook using `SetWindowsHookEx(WH_KEYBOARD_LL, ...)`. See [this MSDN page](https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms644985(v%3Dvs.85)) for details.
|
||||
|
||||
When a keyboard event is signaled and `ncCode` equals `HC_ACTION`, the `wParam` and `lParam` event parameters are passed to all subscribed clients in the [`LowlevelKeyboardEvent`](/src/modules/interface/lowlevel_keyboard_event_data.h#L38-L41) struct.
|
||||
|
||||
The `intptr_t data` event argument is a pointer to the `LowlevelKeyboardEvent` struct.
|
||||
|
||||
A non-zero return value from any of the subscribed PowerToys will cause the runner hook proc to return 1, thus swallowing the keyboard event.
|
||||
|
||||
Example usage, that makes Windows ignore the L key:
|
||||
|
||||
```c++
|
||||
virtual const wchar_t** get_events() override {
|
||||
static const wchar_t* events[2] = { ll_keyboard,
|
||||
nullptr };
|
||||
return events;
|
||||
}
|
||||
|
||||
virtual intptr_t signal_event(const wchar_t* name, intptr_t data) override {
|
||||
if (wcscmp(name, ll_keyboard) == 0) {
|
||||
auto& event = *(reinterpret_cast<LowlevelKeyboardEvent*>(data));
|
||||
// The L key has vkCode of 0x4C, see:
|
||||
// https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
|
||||
if (event.wParam == WM_KEYDOWN && event.lParam->vkCode == 0x4C) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Windows Event Hook
|
||||
|
||||
This event is signaled for [a range of events](https://docs.microsoft.com/pl-pl/windows/win32/winauto/event-constants). To subscribe to this event, add `"win_hook_event"` to the table returned by the `get_events()` method. See [this MSDN doc](https://docs.microsoft.com/pl-pl/windows/win32/api/winuser/nf-winuser-setwineventhook) for details.
|
||||
|
||||
The `intptr_t data` event argument is a pointer to the [`WinHookEvent`](/src/modules/interface/win_hook_event_data.h#L43-L50) struct.
|
||||
|
||||
The return value of the event handler is ignored.
|
||||
|
||||
Example usage, that detects a window being resized:
|
||||
|
||||
```c++
|
||||
virtual const wchar_t** get_events() override {
|
||||
static const wchar_t* events[2] = { win_hook_event,
|
||||
nullptr };
|
||||
return events;
|
||||
}
|
||||
|
||||
virtual intptr_t signal_event(const wchar_t* name, intptr_t data) override {
|
||||
if (wcscmp(name, win_hook_event) == 0) {
|
||||
auto& event = *(reinterpret_cast<WinHookEvent*>(data));
|
||||
switch (event.event) {
|
||||
case EVENT_SYSTEM_MOVESIZESTART:
|
||||
size_start(event.hwnd);
|
||||
break;
|
||||
case EVENT_SYSTEM_MOVESIZEEND:
|
||||
size_end(event.hwnd);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
Taking too long to process the events has negative impact on the whole system performance. To address this, the events are signaled from a different thread, not from the event hook callback itself.
|
||||
12
doc/devdocs/style.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# Coding Style
|
||||
|
||||
## Philosophy
|
||||
1. If it's inserting something into the existing classes/functions, try to follow the existing style as closely as possible.
|
||||
1. If it's brand new code or refactoring a complete class or area of the code, please follow as Modern C++ of a style as you can and reference the [C++ Core Guidelines](https://github.com/isocpp/CppCoreGuidelines) as much as you possibly can.
|
||||
|
||||
## Formatting
|
||||
|
||||
- We use [`.clang-format`](https://github.com/microsoft/PowerToys/blob/master/.clang-format) style file to enable automatic code formatting. You can [easily format source files from Visual Studio](https://devblogs.microsoft.com/cppblog/clangformat-support-in-visual-studio-2017-15-7-preview-1/). For example, `CTRL+K CTRL+D` formats the current document.
|
||||
- If you prefer another text editor or have ClangFormat disabled in Visual Studio, you could invoke [`format_sources`](https://github.com/microsoft/PowerToys/blob/master/format_sources.ps1) powershell script from command line. It gets a list of all currently modified files from `git` and invokes clang-format on them.
|
||||
Please note that you should also have `clang-format.exe` in `%PATH%` for it to work. The script can infer the path of `clang-format.exe` version which is shipped with Visual Studio at `%VCINSTALLDIR%\Tools\Llvm\bin\`, if you launch it from the *Native Tools Command Prompt for VS*.
|
||||
- CI doesn't enforce code formatting yet, since we're gradually applying code formatting to the codebase, but please adhere to our formatting style for any new code.
|
||||
BIN
doc/images/Logo-HiRes.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
30
doc/images/Logo.svg
Normal file
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="176px" height="60px" viewBox="0 0 176 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 54.1 (76490) - https://sketchapp.com -->
|
||||
<title>Microsoft PowerToys</title>
|
||||
<desc>Logo for Microsoft PowerToys</desc>
|
||||
<g id="Devices" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Final-Logo" transform="translate(-309.000000, -228.000000)">
|
||||
<g id="Group" transform="translate(309.000000, 228.000000)">
|
||||
<g id="Group-2-Copy-7">
|
||||
<rect id="Rectangle-Copy-40" fill="#E4292E" x="12.3529412" y="8.82352941" width="7" height="21.1764706"></rect>
|
||||
<rect id="Rectangle-Copy-41" fill="#E76643" x="19" y="8.82352941" width="7" height="21.1764706"></rect>
|
||||
<rect id="Rectangle-Copy-42" fill="#F4C81D" x="26" y="8.82352941" width="7" height="21.1764706"></rect>
|
||||
<rect id="Rectangle-Copy-43" fill="#4EB445" x="33" y="8.82352941" width="7" height="21.1764706"></rect>
|
||||
<rect id="Rectangle-Copy-50" fill="#02A3E8" x="40" y="8.82352941" width="7" height="21.1764706"></rect>
|
||||
<rect id="Rectangle-Copy-44" fill="#D6CDB2" x="12.3529412" y="33.5294118" width="7.05882353" height="7.05882353"></rect>
|
||||
<rect id="Rectangle-Copy-45" fill="#D6CDB2" x="26.4705882" y="33.5294118" width="7.05882353" height="7.05882353"></rect>
|
||||
<rect id="Rectangle-Copy-46" fill="#D6CDB2" x="40.5882353" y="33.5294118" width="7.05882353" height="7.05882353"></rect>
|
||||
<rect id="Rectangle-Copy-47" fill="#D6CDB2" x="12.3529412" y="44.1176471" width="7.05882353" height="7.05882353"></rect>
|
||||
<rect id="Rectangle-Copy-48" fill="#D6CDB2" x="26.4705882" y="44.1176471" width="7.05882353" height="7.05882353"></rect>
|
||||
<rect id="Rectangle-Copy-49" fill="#D6CDB2" x="40.5882353" y="44.1176471" width="7.05882353" height="7.05882353"></rect>
|
||||
<polygon id="Line-5-Copy-13" fill="#D6CDB2" fill-rule="nonzero" points="3.52941176 3.52941176 3.52941176 0 56.4705882 0 56.4705882 3.52941176"></polygon>
|
||||
<polygon id="Line-5-Copy-14" fill="#D6CDB2" fill-rule="nonzero" points="3.52941176 60 3.52941176 56.4705882 56.4705882 56.4705882 56.4705882 60"></polygon>
|
||||
<polygon id="Line-5-Copy-15" fill="#D6CDB2" fill-rule="nonzero" transform="translate(58.235294, 30.000000) rotate(-270.000000) translate(-58.235294, -30.000000) " points="31.7647059 31.7647059 31.7647059 28.2352941 84.7058824 28.2352941 84.7058824 31.7647059"></polygon>
|
||||
<polygon id="Line-5-Copy-16" fill="#D6CDB2" fill-rule="nonzero" transform="translate(1.764706, 30.000000) rotate(-270.000000) translate(-1.764706, -30.000000) " points="-24.7058824 31.7647059 -24.7058824 28.2352941 28.2352941 28.2352941 28.2352941 31.7647059"></polygon>
|
||||
</g>
|
||||
<path d="M87.9970703,10.0039062 L87.9970703,6 L79.9990234,6 L79.9990234,10.0039062 L87.9970703,10.0039062 Z M76,26 L76,2.00097656 L91.9960938,2.00097656 L91.9960938,14.0029297 L79.9990234,14.0029297 L79.9990234,26 L76,26 Z M99.9990234,26 L99.9990234,22.0009766 L107.99707,22.0009766 L107.99707,26 L99.9990234,26 Z M96,22.0009766 L96,10.0039062 L99.9990234,10.0039062 L99.9990234,22.0009766 L96,22.0009766 Z M107.99707,22.0009766 L107.99707,10.0039062 L111.996094,10.0039062 L111.996094,22.0009766 L107.99707,22.0009766 Z M99.9990234,10.0039062 L99.9990234,6 L107.99707,6 L107.99707,10.0039062 L99.9990234,10.0039062 Z M119.999023,26 L119.999023,22.0009766 L123.998047,22.0009766 L123.998047,26 L119.999023,26 Z M127.99707,26 L127.99707,22.0009766 L131.996094,22.0009766 L131.996094,26 L127.99707,26 Z M123.998047,22.0009766 L123.998047,14.0029297 L127.99707,14.0029297 L127.99707,22.0009766 L123.998047,22.0009766 Z M116,22.0009766 L116,6 L119.999023,6 L119.999023,22.0009766 L116,22.0009766 Z M131.996094,22.0009766 L131.996094,6 L136,6 L136,22.0009766 L131.996094,22.0009766 Z M151.996094,14.0029297 L151.996094,10.0039062 L143.998047,10.0039062 L143.998047,14.0029297 L151.996094,14.0029297 Z M143.996094,10.0029297 L143.996094,6.00390625 L139.996094,6.00390625 L139.996094,10.0029297 L143.996094,10.0029297 Z M139.999023,26 L139.999023,6 L155.995117,6 L155.995117,18.0019531 L143.998047,18.0019531 L143.998047,22.0009766 L155.995117,22.0009766 L155.995117,26 L139.999023,26 Z M159.999023,26 L159.999023,6 L175.995117,6 L175.995117,10.0039062 L163.998047,10.0039062 L163.998047,26 L159.999023,26 Z M83.9980469,56 L83.9980469,36 L76,36 L76,32.0009766 L96,32.0009766 L96,36 L87.9970703,36 L87.9970703,56 L83.9980469,56 Z M103.998047,56 L103.998047,52.0009766 L111.996094,52.0009766 L111.996094,56 L103.998047,56 Z M99.9990234,52.0009766 L99.9990234,40.0039062 L103.998047,40.0039062 L103.998047,52.0009766 L99.9990234,52.0009766 Z M111.996094,52.0009766 L111.996094,40.0039062 L115.995117,40.0039062 L115.995117,52.0009766 L111.996094,52.0009766 Z M103.998047,40.0039062 L103.998047,36 L111.996094,36 L111.996094,40.0039062 L103.998047,40.0039062 Z M119.999023,56 L119.999023,52.0009766 L131.996094,52.0009766 L131.996094,48.0019531 L119.999023,48.0019531 L119.999023,36 L123.998047,36 L123.998047,44.0029297 L131.996094,44.0029297 L131.996094,36 L135.995117,36 L135.995117,56 L119.999023,56 Z M139.999023,56 L139.999023,52.0009766 L151.996094,52.0009766 L151.996094,48.0019531 L139.999023,48.0019531 L139.999023,36 L155.995117,36 L155.995117,40.0039062 L143.998047,40.0039062 L143.998047,44.0029297 L155.995117,44.0029297 L155.995117,56 L139.999023,56 Z" id="PowerToys-Copy-2" fill="#D6CDB2" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.7 KiB |
6551
doc/images/Logo/AI/PowerToys_UWP_Assets.ai
Normal file
BIN
doc/images/Logo/ICO/PowerToys.ico
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
doc/images/Logo/ICO/PowerToys_14.ico
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
doc/images/Logo/PNG/PowerToysAppList.targetsize-14-in-16.png
Normal file
|
After Width: | Height: | Size: 454 B |
BIN
doc/images/Logo/PNG/PowerToysAppList.targetsize-144.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
doc/images/Logo/PNG/PowerToysAppList.targetsize-16.png
Normal file
|
After Width: | Height: | Size: 336 B |
BIN
doc/images/Logo/PNG/PowerToysAppList.targetsize-20.png
Normal file
|
After Width: | Height: | Size: 514 B |
BIN
doc/images/Logo/PNG/PowerToysAppList.targetsize-24.png
Normal file
|
After Width: | Height: | Size: 637 B |
BIN
doc/images/Logo/PNG/PowerToysAppList.targetsize-256.png
Normal file
|
After Width: | Height: | Size: 7.1 KiB |
BIN
doc/images/Logo/PNG/PowerToysAppList.targetsize-30.png
Normal file
|
After Width: | Height: | Size: 728 B |
BIN
doc/images/Logo/PNG/PowerToysAppList.targetsize-32.png
Normal file
|
After Width: | Height: | Size: 724 B |
BIN
doc/images/Logo/PNG/PowerToysAppList.targetsize-36.png
Normal file
|
After Width: | Height: | Size: 812 B |
BIN
doc/images/Logo/PNG/PowerToysAppList.targetsize-40.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
doc/images/Logo/PNG/PowerToysAppList.targetsize-44.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
doc/images/Logo/PNG/PowerToysAppList.targetsize-48.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
doc/images/Logo/PNG/PowerToysAppList.targetsize-60.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
doc/images/Logo/PNG/PowerToysAppList.targetsize-64.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
doc/images/Logo/PNG/PowerToysAppList.targetsize-72.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
doc/images/Logo/PNG/PowerToysAppList.targetsize-80.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
doc/images/Logo/PNG/PowerToysAppList.targetsize-96.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
doc/images/overview/FancyZones_small.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
doc/images/overview/ImageResizer_small.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
doc/images/overview/KBM_small.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
doc/images/overview/PT hero image.png
Normal file
|
After Width: | Height: | Size: 447 KiB |
BIN
doc/images/overview/PowerLauncher_small.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
doc/images/overview/PowerPreview_small.PNG
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
doc/images/overview/PowerRename_small.PNG
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
doc/images/overview/Shortcut guide_small.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
doc/images/preview_pane/general-settings.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
doc/images/preview_pane/settings-ui.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
doc/images/runAsAdmin/elevatedWindows.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
doc/images/runAsAdmin/uac.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
doc/images/settings/bool_toggle.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
BIN
doc/images/settings/choice_group.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
doc/images/settings/color_picker.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
doc/images/settings/custom_action.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
doc/images/settings/dropdown_1.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
doc/images/settings/dropdown_2.png
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
BIN
doc/images/settings/general_settings.png
Normal file
|
After Width: | Height: | Size: 97 KiB |
BIN
doc/images/settings/hotkey.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
BIN
doc/images/settings/int_spinner.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
doc/images/settings/multiline.png
Normal file
|
After Width: | Height: | Size: 4.0 KiB |
BIN
doc/images/settings/shortcut_guide_settings.png
Normal file
|
After Width: | Height: | Size: 65 KiB |