Compare commits
1183 Commits
help-docs-
...
release_mo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f7f1227fa4 | ||
|
|
5ea93c0935 | ||
|
|
943fffbcf9 | ||
|
|
81e40b0872 | ||
|
|
cbe7c32150 | ||
|
|
06a30078da | ||
|
|
97bdcffd9d | ||
|
|
162a2efe71 | ||
|
|
3a46f9994f | ||
|
|
f053b7962b | ||
|
|
76a479064e | ||
|
|
ffb19c3a65 | ||
|
|
ddcfd2ff43 | ||
|
|
3c7b1c6c5e | ||
|
|
d04ee0aa71 | ||
|
|
ce020d4398 | ||
|
|
028a5cf827 | ||
|
|
c60288b0df | ||
|
|
2fba8a2705 | ||
|
|
54aec6e0db | ||
|
|
7edb1fab7b | ||
|
|
21738995cc | ||
|
|
b752af7046 | ||
|
|
60b044e61a | ||
|
|
98364405c6 | ||
|
|
23558a2584 | ||
|
|
035f40dc0a | ||
|
|
058543b287 | ||
|
|
dff77233db | ||
|
|
910a64dc1c | ||
|
|
8c5bc316f9 | ||
|
|
645bb485a7 | ||
|
|
dab331535b | ||
|
|
3873946046 | ||
|
|
68fa4d87eb | ||
|
|
f527624027 | ||
|
|
fb06332272 | ||
|
|
4fda4b5773 | ||
|
|
68efbc2bed | ||
|
|
e47d6a8ece | ||
|
|
09466f05c6 | ||
|
|
738088e8a5 | ||
|
|
54dde95545 | ||
|
|
7ded133caf | ||
|
|
fe2f066733 | ||
|
|
5034fb4496 | ||
|
|
b854730533 | ||
|
|
a538e852bd | ||
|
|
436a5811cb | ||
|
|
27a400743c | ||
|
|
4e692fce1f | ||
|
|
0f13558ae3 | ||
|
|
09de1f2d46 | ||
|
|
2caf773bbe | ||
|
|
edc015d589 | ||
|
|
d5707a030b | ||
|
|
a2bb263c49 | ||
|
|
8ed7fa0e4c | ||
|
|
4f9e9f30aa | ||
|
|
f08f72c46a | ||
|
|
4885c13d86 | ||
|
|
46b0b7ce70 | ||
|
|
bd267edf3f | ||
|
|
b0d44f3799 | ||
|
|
bb91471cdc | ||
|
|
7f24ffd7ef | ||
|
|
fb03c88a5d | ||
|
|
07420304d0 | ||
|
|
aa26a48e67 | ||
|
|
bd776dc98d | ||
|
|
dc3f0be186 | ||
|
|
5cc68e5bb5 | ||
|
|
092d8aa9f5 | ||
|
|
2d87237d10 | ||
|
|
579c2620bf | ||
|
|
3c2eeadec6 | ||
|
|
1b178ec6ab | ||
|
|
944b2ec4b8 | ||
|
|
ac7e4eeccf | ||
|
|
0bddd91b2e | ||
|
|
ae225cf89d | ||
|
|
8569b27e8f | ||
|
|
4f4649f7a2 | ||
|
|
b69f1bd237 | ||
|
|
59e9967518 | ||
|
|
0621c3d30b | ||
|
|
236a51b0b8 | ||
|
|
c9f5c03e17 | ||
|
|
1a3b38f219 | ||
|
|
ce377308e3 | ||
|
|
155bb5a214 | ||
|
|
9d9b7a87f5 | ||
|
|
0c3b751b30 | ||
|
|
6a8cfe31de | ||
|
|
c9175bee04 | ||
|
|
76939691fd | ||
|
|
c2b6bfa1ed | ||
|
|
0056d87009 | ||
|
|
eaefeebe83 | ||
|
|
d92183bd0b | ||
|
|
27605ce156 | ||
|
|
df3a6a5a22 | ||
|
|
eeff3d5cdf | ||
|
|
0565b71653 | ||
|
|
8e5786c6fb | ||
|
|
4b826d1aed | ||
|
|
556177358e | ||
|
|
19f4acfc94 | ||
|
|
599e59c548 | ||
|
|
19b508d869 | ||
|
|
c4719f7d9d | ||
|
|
d5eea09c8a | ||
|
|
04125bc30c | ||
|
|
fda415aab1 | ||
|
|
ab052dcb89 | ||
|
|
5210a5a0ba | ||
|
|
7607d2a14a | ||
|
|
0abf4354aa | ||
|
|
6c3cc168c9 | ||
|
|
516420d872 | ||
|
|
358a86f18f | ||
|
|
52d024a263 | ||
|
|
da3df70544 | ||
|
|
e3ed92e930 | ||
|
|
cfce0bc198 | ||
|
|
f9b2b90f4e | ||
|
|
c60aed7f0f | ||
|
|
1cc9115972 | ||
|
|
332d4219ac | ||
|
|
3bda830156 | ||
|
|
00799c531a | ||
|
|
883b5b66e9 | ||
|
|
759bea83bb | ||
|
|
51ba11cfcc | ||
|
|
4c82d6bc84 | ||
|
|
f66f6ab9be | ||
|
|
5f76391379 | ||
|
|
fa39effe9c | ||
|
|
61a7b4f07a | ||
|
|
798a03007a | ||
|
|
8386e3a4f1 | ||
|
|
3575704724 | ||
|
|
e8b68d7d28 | ||
|
|
c7bf3a0a9d | ||
|
|
66617ada86 | ||
|
|
edacaaa334 | ||
|
|
dfec66f971 | ||
|
|
70faf61391 | ||
|
|
9903201fa8 | ||
|
|
4a0f0f295d | ||
|
|
16a2a5cc13 | ||
|
|
6405886aca | ||
|
|
ad0cf583b5 | ||
|
|
2608a8c9ab | ||
|
|
d4e9bdd035 | ||
|
|
b6de9497d3 | ||
|
|
e27f4544d0 | ||
|
|
ac8efa9d7d | ||
|
|
489c806923 | ||
|
|
e1a2946a2b | ||
|
|
354c08921b | ||
|
|
a7f89d0077 | ||
|
|
7d8fb296af | ||
|
|
7509a367c5 | ||
|
|
5f0154f9fe | ||
|
|
0c6cc8f7a1 | ||
|
|
7f0ac9629e | ||
|
|
c4a9b2e4f9 | ||
|
|
fcef3fd4e5 | ||
|
|
a434862b2f | ||
|
|
c91ad8348e | ||
|
|
cac053f4e9 | ||
|
|
99b379280f | ||
|
|
0529c8cf9b | ||
|
|
5ae5341658 | ||
|
|
b3bff83a40 | ||
|
|
9efd99fd10 | ||
|
|
7fc4f36970 | ||
|
|
fc5837ea3b | ||
|
|
7ebb039b35 | ||
|
|
f33eb83eef | ||
|
|
81947c61ab | ||
|
|
8d3057e011 | ||
|
|
d5a46f273a | ||
|
|
b02e987fdc | ||
|
|
ed6e401688 | ||
|
|
1256852259 | ||
|
|
5b360a549a | ||
|
|
0337cccea4 | ||
|
|
7514b93261 | ||
|
|
f5c5ffd86d | ||
|
|
ac4b737e89 | ||
|
|
4792775630 | ||
|
|
f22ca13205 | ||
|
|
7076deb46e | ||
|
|
4eebcc03b9 | ||
|
|
7eed321c99 | ||
|
|
9b39dd2697 | ||
|
|
8e34fa7bf3 | ||
|
|
4be696dd6d | ||
|
|
ea90f5c6cb | ||
|
|
ccaa00152e | ||
|
|
1b4ead7f77 | ||
|
|
a9b454a631 | ||
|
|
a44db791d3 | ||
|
|
23b017c17d | ||
|
|
4a81c56a55 | ||
|
|
5141b04695 | ||
|
|
e70d704ced | ||
|
|
3f87fd1a5a | ||
|
|
72028ec9d2 | ||
|
|
7af11786fb | ||
|
|
61fb167cec | ||
|
|
9fd950f928 | ||
|
|
a888d40722 | ||
|
|
5d594b4952 | ||
|
|
55a21c1233 | ||
|
|
49e2ae3120 | ||
|
|
5ee16e992b | ||
|
|
ad269fe995 | ||
|
|
17937f8c54 | ||
|
|
886ceec05c | ||
|
|
433be55081 | ||
|
|
e664a3ec70 | ||
|
|
ad9fd6d547 | ||
|
|
d921541d5d | ||
|
|
6b16f7f172 | ||
|
|
e463d68688 | ||
|
|
41cda039ec | ||
|
|
4989204b59 | ||
|
|
04ae708f33 | ||
|
|
d803c31d63 | ||
|
|
903c46bae0 | ||
|
|
6b965b1aa6 | ||
|
|
04395739d5 | ||
|
|
c5ec0891c9 | ||
|
|
3213735a4d | ||
|
|
b854a603af | ||
|
|
641f48e27d | ||
|
|
7016861281 | ||
|
|
ae5144635e | ||
|
|
a0a0556037 | ||
|
|
be8d1932b1 | ||
|
|
b127cf724b | ||
|
|
cc1177150b | ||
|
|
9f82c3788b | ||
|
|
67be26604f | ||
|
|
ec4deb5179 | ||
|
|
f02f10f832 | ||
|
|
eb75b2addf | ||
|
|
a0061da938 | ||
|
|
e5fbd5fde5 | ||
|
|
6c53421e36 | ||
|
|
e38477aa64 | ||
|
|
27380d3c42 | ||
|
|
a70f9327aa | ||
|
|
5dd6482937 | ||
|
|
6465106302 | ||
|
|
5b6d0e7a2a | ||
|
|
8b46cf6bc5 | ||
|
|
090e8bbf40 | ||
|
|
4ccb782740 | ||
|
|
54722ac5c3 | ||
|
|
8e1711c951 | ||
|
|
088630ccce | ||
|
|
799b1b0d03 | ||
|
|
dc787a2754 | ||
|
|
aea62fcd2c | ||
|
|
b8eb200295 | ||
|
|
f16b75ae9c | ||
|
|
47359051a1 | ||
|
|
b273a70a3e | ||
|
|
3b3038ebb9 | ||
|
|
569a16cc5b | ||
|
|
3780d41765 | ||
|
|
78b9ce1674 | ||
|
|
601a1d029b | ||
|
|
5c55e52cc1 | ||
|
|
2740ad75af | ||
|
|
e3a72987ce | ||
|
|
6870ed24f2 | ||
|
|
ab2d49b162 | ||
|
|
cd98458ada | ||
|
|
909cba41bc | ||
|
|
3fdfb6c57d | ||
|
|
2fbce97f89 | ||
|
|
e4fd78250d | ||
|
|
cef3679bb3 | ||
|
|
e65b5cefdc | ||
|
|
71650df31f | ||
|
|
b785fe69f4 | ||
|
|
67c3375ace | ||
|
|
bdb5f5894e | ||
|
|
a0d4326d62 | ||
|
|
a16b20122d | ||
|
|
b981152dee | ||
|
|
63c1e63035 | ||
|
|
2c2b8f77cb | ||
|
|
ef4b9ebc42 | ||
|
|
1babaf529e | ||
|
|
f4ec5f348d | ||
|
|
5a881440d9 | ||
|
|
44f8d80b22 | ||
|
|
477c01bc55 | ||
|
|
b2df63e499 | ||
|
|
038de1d7ad | ||
|
|
5f1e393ac7 | ||
|
|
e38a39200a | ||
|
|
217b40a107 | ||
|
|
938e7284d7 | ||
|
|
8fe3182b79 | ||
|
|
d271472984 | ||
|
|
3acb04f4cc | ||
|
|
9628bf8723 | ||
|
|
4161371a8e | ||
|
|
0bb10f2ee0 | ||
|
|
3f50771e18 | ||
|
|
9d707fcb48 | ||
|
|
a13db6b268 | ||
|
|
2b9d80d23f | ||
|
|
8706b368ba | ||
|
|
d46b27e81f | ||
|
|
58f3144ea0 | ||
|
|
d65aeaf181 | ||
|
|
da8b9daff0 | ||
|
|
a6a1b4baa8 | ||
|
|
b9f6d19152 | ||
|
|
324d2fbe4f | ||
|
|
86446ab8bf | ||
|
|
380289e660 | ||
|
|
c66ee58d85 | ||
|
|
37a70125b9 | ||
|
|
c8715ca846 | ||
|
|
d3491b80ee | ||
|
|
fa62abb7be | ||
|
|
2b57a59b47 | ||
|
|
3bf3018d22 | ||
|
|
fd331c0733 | ||
|
|
b5f12b56fa | ||
|
|
096a1dd043 | ||
|
|
02e2abef07 | ||
|
|
e629db5bb1 | ||
|
|
1274ea21d4 | ||
|
|
6fda320c83 | ||
|
|
7a3cd9a139 | ||
|
|
06a5611a56 | ||
|
|
db8fa98ac6 | ||
|
|
952f8212dc | ||
|
|
24507f5f23 | ||
|
|
66079b0af2 | ||
|
|
88498f11fc | ||
|
|
c5afc6d453 | ||
|
|
5d7848752f | ||
|
|
bf93e28a3d | ||
|
|
124006929f | ||
|
|
bf8713ba21 | ||
|
|
878b46631f | ||
|
|
4832739ff8 | ||
|
|
67f43453aa | ||
|
|
43eb6ca30f | ||
|
|
2449c6d592 | ||
|
|
f41bd1818d | ||
|
|
8f8056a918 | ||
|
|
c14846f4fc | ||
|
|
2eaa2d6ee2 | ||
|
|
d183000fe3 | ||
|
|
396b893f43 | ||
|
|
fffb1e2734 | ||
|
|
4419090831 | ||
|
|
f6e464bb21 | ||
|
|
88d3f2388c | ||
|
|
7bbbeceab5 | ||
|
|
8d35e16abe | ||
|
|
282f908ffd | ||
|
|
9f86b3fdd2 | ||
|
|
a3c011070a | ||
|
|
ef76904b4d | ||
|
|
aa4b44f8bd | ||
|
|
311b7ef77e | ||
|
|
2678b94433 | ||
|
|
eac85d1708 | ||
|
|
766608696d | ||
|
|
59b761bf33 | ||
|
|
b93f78b3c9 | ||
|
|
bcc293358f | ||
|
|
4c30d9d6d1 | ||
|
|
022dd35d5a | ||
|
|
9351c1121e | ||
|
|
a7a69aa558 | ||
|
|
3923f18cd8 | ||
|
|
fbd0bf257e | ||
|
|
86d09d997a | ||
|
|
241e1cbf88 | ||
|
|
fc4379f4e1 | ||
|
|
d84c42e5c1 | ||
|
|
b092fcaf29 | ||
|
|
3dd9696f75 | ||
|
|
0eba503d2f | ||
|
|
b6ea502bc3 | ||
|
|
e603853e52 | ||
|
|
fa137dcccc | ||
|
|
7719c4604e | ||
|
|
4b82516909 | ||
|
|
17648c582a | ||
|
|
1559ae7f42 | ||
|
|
498a60d752 | ||
|
|
22b6707e92 | ||
|
|
08b92cc560 | ||
|
|
37bc453de6 | ||
|
|
493fe4b3a5 | ||
|
|
f22a065c15 | ||
|
|
6b50b24abf | ||
|
|
b0b8169e2e | ||
|
|
53ab5b05c3 | ||
|
|
bd93fe5538 | ||
|
|
96ebaf3c7f | ||
|
|
0ba9bdb666 | ||
|
|
f66a433442 | ||
|
|
c14021f2a7 | ||
|
|
85ac983ab9 | ||
|
|
3f0897ae77 | ||
|
|
f7e96794cd | ||
|
|
1624ef52d7 | ||
|
|
b7541e02e1 | ||
|
|
db69caedf9 | ||
|
|
9dac908dc1 | ||
|
|
7211f4992a | ||
|
|
606a838ad0 | ||
|
|
65bf785cce | ||
|
|
3bcab0216f | ||
|
|
cb83a19edf | ||
|
|
6df16159d0 | ||
|
|
a840950fbb | ||
|
|
8ae29074c5 | ||
|
|
f22372c271 | ||
|
|
568d4eadff | ||
|
|
755de42dbe | ||
|
|
1016706a6b | ||
|
|
76bff25de1 | ||
|
|
d1c393b177 | ||
|
|
4e52caf23b | ||
|
|
03462771a4 | ||
|
|
c9304c1992 | ||
|
|
2baeaf1119 | ||
|
|
6cdc6ce9b4 | ||
|
|
97307598f0 | ||
|
|
de4bbf44d7 | ||
|
|
bc39f60183 | ||
|
|
45308a70a8 | ||
|
|
450c7b187f | ||
|
|
f3438751ed | ||
|
|
919d1a4503 | ||
|
|
de0f3205ac | ||
|
|
d8f2965f82 | ||
|
|
7954b143b5 | ||
|
|
17d33fc9f6 | ||
|
|
c18b1a7e83 | ||
|
|
21ec31d4d3 | ||
|
|
bd0f04258a | ||
|
|
7d995bd83a | ||
|
|
98fd2021b7 | ||
|
|
63fc066301 | ||
|
|
d9fa30dbef | ||
|
|
012a3bef0a | ||
|
|
c23cd8d2f0 | ||
|
|
9e80aeb061 | ||
|
|
cbf82f464d | ||
|
|
eb5a0cb1db | ||
|
|
43b96776e4 | ||
|
|
57d919b56f | ||
|
|
54b9661ddc | ||
|
|
b13f4c0b18 | ||
|
|
d8e5526655 | ||
|
|
e4de98b9d6 | ||
|
|
130148e5d6 | ||
|
|
e2f40f1e33 | ||
|
|
13c9afb219 | ||
|
|
a32a6e9b9e | ||
|
|
64d04ca22d | ||
|
|
1996bc2612 | ||
|
|
eaa15b0d66 | ||
|
|
8003b8a6b8 | ||
|
|
904a2c9743 | ||
|
|
c3d4214ad0 | ||
|
|
f641fac98c | ||
|
|
b03bdfb9d6 | ||
|
|
f3484eff79 | ||
|
|
55aa8d73f0 | ||
|
|
07da6cece6 | ||
|
|
6799acf965 | ||
|
|
b3bb79ecd4 | ||
|
|
858d9d3f04 | ||
|
|
caa180ba1a | ||
|
|
d58388e5d2 | ||
|
|
6b5c4f07c2 | ||
|
|
03e7ad6268 | ||
|
|
61bd4eefa7 | ||
|
|
92e33c8c20 | ||
|
|
82063ce972 | ||
|
|
fd8bbc3c95 | ||
|
|
9cca314ea9 | ||
|
|
33a64106be | ||
|
|
519287805f | ||
|
|
83bf37c8bb | ||
|
|
8af2aa35d4 | ||
|
|
f743dc14d5 | ||
|
|
573d269aac | ||
|
|
18ef86ddc3 | ||
|
|
d6a340ac79 | ||
|
|
b217093bc9 | ||
|
|
d265181c26 | ||
|
|
a022d4aaa2 | ||
|
|
c4f6ed6938 | ||
|
|
6e3a0b1b94 | ||
|
|
f6b6cfa4d0 | ||
|
|
3ba6ecc3c2 | ||
|
|
bdfaf6dcd2 | ||
|
|
6e5fb95e8f | ||
|
|
0c81d2ff56 | ||
|
|
d1dd9aacfe | ||
|
|
7f18c4e669 | ||
|
|
fe334c0a24 | ||
|
|
8e0172eb03 | ||
|
|
95b73953d8 | ||
|
|
34c606ddba | ||
|
|
63597b3bc4 | ||
|
|
7dd6e46543 | ||
|
|
c090609045 | ||
|
|
4c9e7956c1 | ||
|
|
1b0bc7fd1e | ||
|
|
2baa16bba7 | ||
|
|
3587f8cafd | ||
|
|
8e756215c0 | ||
|
|
6512820653 | ||
|
|
8dd4a178dd | ||
|
|
89cb13ffde | ||
|
|
81cb6c5ee4 | ||
|
|
d3cd20ef1a | ||
|
|
0670d02bb8 | ||
|
|
eef3f19644 | ||
|
|
b1e1f877d0 | ||
|
|
6be2d19b35 | ||
|
|
1b700c894d | ||
|
|
2ec460a01e | ||
|
|
ac25abf7d5 | ||
|
|
19d6f437e3 | ||
|
|
c9edc409bc | ||
|
|
599ca52e16 | ||
|
|
023de8274d | ||
|
|
1b77d0eca6 | ||
|
|
e9092fe01d | ||
|
|
8bc60f9b5b | ||
|
|
a851a1132d | ||
|
|
93930d0636 | ||
|
|
d9941a7711 | ||
|
|
d8be34000b | ||
|
|
da993fa9f6 | ||
|
|
f76e07337d | ||
|
|
b09f7d57a0 | ||
|
|
2c1dd14098 | ||
|
|
6249e5e4d6 | ||
|
|
3aa6e5712b | ||
|
|
a9d2b09260 | ||
|
|
a964976b67 | ||
|
|
e48caecfe0 | ||
|
|
686ab262b2 | ||
|
|
2418c24901 | ||
|
|
9c5e46ee11 | ||
|
|
1bbdefbd41 | ||
|
|
3dcd2570ad | ||
|
|
2ed28c3b70 | ||
|
|
3c87ef0d28 | ||
|
|
d0fc047fc9 | ||
|
|
3e0448bbe5 | ||
|
|
773d98e20c | ||
|
|
29afe01c40 | ||
|
|
d49288a1c0 | ||
|
|
d7faaa6592 | ||
|
|
b99b3646da | ||
|
|
d4ca156f53 | ||
|
|
4e59a4af5f | ||
|
|
15eb0321ac | ||
|
|
f7dfb5df24 | ||
|
|
52103c4b2f | ||
|
|
9fd724ff2d | ||
|
|
230244f2e5 | ||
|
|
7f14bdd0a0 | ||
|
|
f71e5accce | ||
|
|
e055c750aa | ||
|
|
11f2cce274 | ||
|
|
69eef7043f | ||
|
|
60cc6fda96 | ||
|
|
ee603ba82e | ||
|
|
8c8f0b46ef | ||
|
|
231a77239f | ||
|
|
89f58bf043 | ||
|
|
4dc3421ab9 | ||
|
|
ce9c227780 | ||
|
|
0d77c0a49b | ||
|
|
f9b67e2197 | ||
|
|
114ff5dc9b | ||
|
|
2a85d17cc1 | ||
|
|
d430a5cf31 | ||
|
|
f484f953fa | ||
|
|
c23d9cb96f | ||
|
|
eca8f3432e | ||
|
|
2edce34f29 | ||
|
|
af0fccf36e | ||
|
|
f00d04c0b8 | ||
|
|
a310fbe14f | ||
|
|
fc1e119fcd | ||
|
|
569423af12 | ||
|
|
8cd25252f8 | ||
|
|
1e63fe72cf | ||
|
|
1a5a7d71b6 | ||
|
|
91198d02e3 | ||
|
|
aa45fe898a | ||
|
|
92e013d5c9 | ||
|
|
9acfbf355c | ||
|
|
59f64da447 | ||
|
|
31f3958925 | ||
|
|
c78588c9c2 | ||
|
|
2dbeffe380 | ||
|
|
9f9aa17cb4 | ||
|
|
44ea3d92e2 | ||
|
|
21d3f42e2a | ||
|
|
b4052fcc00 | ||
|
|
fc7b8c18cb | ||
|
|
6983dd9364 | ||
|
|
5877d64449 | ||
|
|
cc54faf78a | ||
|
|
446b7bbd00 | ||
|
|
53468c9c3e | ||
|
|
67e1cddfa1 | ||
|
|
5c83f3aa15 | ||
|
|
d32b44bc2d | ||
|
|
b70c216131 | ||
|
|
58e2b8ab52 | ||
|
|
8b7e630bed | ||
|
|
323c37c34e | ||
|
|
b593f2d390 | ||
|
|
3800ba1dc9 | ||
|
|
8a00cfe2e7 | ||
|
|
e8e0ff63fc | ||
|
|
c324267c5f | ||
|
|
6a481f40da | ||
|
|
d02650047a | ||
|
|
b908fd8efb | ||
|
|
0aaed84549 | ||
|
|
7b980d83c1 | ||
|
|
dc9a90046e | ||
|
|
3cd5610b45 | ||
|
|
48a392ef78 | ||
|
|
1e324b3e5c | ||
|
|
37967ecc05 | ||
|
|
b3776600e6 | ||
|
|
90f3deb5e7 | ||
|
|
79d35f3710 | ||
|
|
5b2463258c | ||
|
|
7607003dd5 | ||
|
|
c4abdc3230 | ||
|
|
de079ca3b8 | ||
|
|
80f1420170 | ||
|
|
e3c7c8c994 | ||
|
|
dabdb01ce6 | ||
|
|
6a4a971863 | ||
|
|
de6a0ab5bc | ||
|
|
41102dab4b | ||
|
|
9ac77d832f | ||
|
|
2ab250e7db | ||
|
|
75e289640a | ||
|
|
6bf4b9faf4 | ||
|
|
15925b47fb | ||
|
|
a58ab7cd16 | ||
|
|
e566b1596d | ||
|
|
a61389b776 | ||
|
|
14c9dad567 | ||
|
|
fc1f3d66a2 | ||
|
|
1d45f09162 | ||
|
|
33c321c7ff | ||
|
|
6b336ed19a | ||
|
|
c6d57fe689 | ||
|
|
154fb77a1f | ||
|
|
de1a87b855 | ||
|
|
d121bd5ed2 | ||
|
|
fb55b785c2 | ||
|
|
9ec9282492 | ||
|
|
cf8ad57eea | ||
|
|
0dad2dedeb | ||
|
|
276d75b47d | ||
|
|
1230ed3018 | ||
|
|
c0d26e80b3 | ||
|
|
ea439c939f | ||
|
|
7976873384 | ||
|
|
bedda2cbc4 | ||
|
|
dd8a355ac4 | ||
|
|
f2bc7a3f20 | ||
|
|
5820bb6c1b | ||
|
|
d93f52ad1a | ||
|
|
383c12f11b | ||
|
|
5839bbd690 | ||
|
|
60b040f54b | ||
|
|
60c7adbb8a | ||
|
|
d45d3c38e6 | ||
|
|
89897aef4b | ||
|
|
dc3a242dcb | ||
|
|
03f418245d | ||
|
|
8046e2fd74 | ||
|
|
2e05ff06f4 | ||
|
|
bf831a3057 | ||
|
|
8b691fe905 | ||
|
|
7b8230fa6c | ||
|
|
379491f3de | ||
|
|
9643b244f6 | ||
|
|
48c16e92e9 | ||
|
|
6143b68eb1 | ||
|
|
73521f8253 | ||
|
|
673ae95aa8 | ||
|
|
33a64c9887 | ||
|
|
576350bc1f | ||
|
|
ad3a85d80b | ||
|
|
e27cc11a49 | ||
|
|
8504b3984a | ||
|
|
68f5f08df5 | ||
|
|
29024b91fe | ||
|
|
d96a24c2ca | ||
|
|
0f41eb99f2 | ||
|
|
7ad277c666 | ||
|
|
002cfd5419 | ||
|
|
9e8e57051a | ||
|
|
08c446a57c | ||
|
|
fe59a6f5b9 | ||
|
|
c234688542 | ||
|
|
f96e7507bc | ||
|
|
beac9f5756 | ||
|
|
3eb700661b | ||
|
|
17f9c8299f | ||
|
|
7cecb80a64 | ||
|
|
e4ae03a252 | ||
|
|
c52df50faf | ||
|
|
3502579b11 | ||
|
|
d58c500c97 | ||
|
|
3ee741abbb | ||
|
|
cf424e59f6 | ||
|
|
634a4e595c | ||
|
|
3da404a714 | ||
|
|
bdcd75a3be | ||
|
|
a75b9c0574 | ||
|
|
f407af363a | ||
|
|
17378319f6 | ||
|
|
86dc335137 | ||
|
|
4d9b7fa905 | ||
|
|
9fde80593f | ||
|
|
fdc428bde4 | ||
|
|
4edc144255 | ||
|
|
e5b60d434d | ||
|
|
7ee222925d | ||
|
|
42a6697531 | ||
|
|
223fd9a7d5 | ||
|
|
9693cb3c8d | ||
|
|
898c0e31a1 | ||
|
|
bab661914d | ||
|
|
3c4a92612d | ||
|
|
000002c327 | ||
|
|
dc051e75e3 | ||
|
|
b500912650 | ||
|
|
7e13f8b1cc | ||
|
|
d535cfc5a4 | ||
|
|
25b96825cc | ||
|
|
6d952cc89e | ||
|
|
e0303cd2a6 | ||
|
|
4d0a6e93ea | ||
|
|
15f844e538 | ||
|
|
56db78d699 | ||
|
|
a9cf299a4f | ||
|
|
5f75db4e1f | ||
|
|
8459d7ead6 | ||
|
|
64e671b0d2 | ||
|
|
23609c4bb9 | ||
|
|
331521306e | ||
|
|
141b5603eb | ||
|
|
8585f3881c | ||
|
|
432d44f4af | ||
|
|
49b4adc843 | ||
|
|
228bf55a8d | ||
|
|
00aabfc283 | ||
|
|
8463dc8721 | ||
|
|
fe224b5ab2 | ||
|
|
6e9f3bfbe2 | ||
|
|
d44fe31277 | ||
|
|
709a9f5996 | ||
|
|
71867dd63e | ||
|
|
3db9ded294 | ||
|
|
844b893ebf | ||
|
|
a6c69b80e3 | ||
|
|
7885ad18c6 | ||
|
|
dab8b634bd | ||
|
|
d59eed6974 | ||
|
|
b1837dec75 | ||
|
|
b5edd39517 | ||
|
|
0931e590a9 | ||
|
|
89917d6168 | ||
|
|
41ebc50538 | ||
|
|
f7ace0a57f | ||
|
|
b7b7d2382b | ||
|
|
49d3b033cb | ||
|
|
5a78b77da5 | ||
|
|
34f3c55573 | ||
|
|
6521921687 | ||
|
|
806bf2cd31 | ||
|
|
ff3d105271 | ||
|
|
4d30d8837a | ||
|
|
f35e2fb49c | ||
|
|
cae140b239 | ||
|
|
b11452d29a | ||
|
|
155d939ae8 | ||
|
|
11383d3689 | ||
|
|
00d4d27277 | ||
|
|
97309e9a6e | ||
|
|
501bba0283 | ||
|
|
e51506b9f8 | ||
|
|
df5b46e0d3 | ||
|
|
55dd0ea830 | ||
|
|
7e76f40f43 | ||
|
|
1c2e81353d | ||
|
|
bf53b61d03 | ||
|
|
6256ddfc78 | ||
|
|
6937701fa4 | ||
|
|
29962197d7 | ||
|
|
287e6da537 | ||
|
|
069958d220 | ||
|
|
d95fb14f8e | ||
|
|
4c231691f6 | ||
|
|
718a81e41d | ||
|
|
8d67d07f27 | ||
|
|
e965aa370c | ||
|
|
daaefd8e18 | ||
|
|
138b4a5cc4 | ||
|
|
ed48c74885 | ||
|
|
27b816e50e | ||
|
|
b5ac9a9591 | ||
|
|
7ec1eaf334 | ||
|
|
e1e66ca670 | ||
|
|
673a8df520 | ||
|
|
f55e718aca | ||
|
|
15008d0559 | ||
|
|
a1a45df14e | ||
|
|
c7b06d8a69 | ||
|
|
c0b0fa44af | ||
|
|
38bacb17e0 | ||
|
|
6febb54478 | ||
|
|
263bfa55e5 | ||
|
|
4c9a09866b | ||
|
|
a43d19fb79 | ||
|
|
999cc91f6c | ||
|
|
488886d685 | ||
|
|
485fbcf393 | ||
|
|
f434e0dd67 | ||
|
|
cbb35a8e3c | ||
|
|
caff966d3b | ||
|
|
7539a1003c | ||
|
|
ee24d12d8c | ||
|
|
4dc424464e | ||
|
|
977552fa81 | ||
|
|
644bfe72af | ||
|
|
fc21932a34 | ||
|
|
a1a480f35e | ||
|
|
61d07242ad | ||
|
|
ea217404e9 | ||
|
|
6f7250d179 | ||
|
|
9e27951c3e | ||
|
|
91891fc5b5 | ||
|
|
b62ea7b28f | ||
|
|
893e1e307d | ||
|
|
6b4653a996 | ||
|
|
06dcc697f9 | ||
|
|
f62872808d | ||
|
|
0fe5b45f8b | ||
|
|
44e71d8b09 | ||
|
|
abc1f2cd64 | ||
|
|
8a8d0e4069 | ||
|
|
ec3df01606 | ||
|
|
851fd08d5d | ||
|
|
c7cb728feb | ||
|
|
43ae1de2b5 | ||
|
|
13bac40aeb | ||
|
|
1e5abf20cd | ||
|
|
6a796debb8 | ||
|
|
7373a07a71 | ||
|
|
f9fc6b83d0 | ||
|
|
6ff586c3e9 | ||
|
|
fc9b2a186b | ||
|
|
dfbf51fa36 | ||
|
|
6a417750b2 | ||
|
|
0d08907e9c | ||
|
|
589acf459d | ||
|
|
5d0dff7172 | ||
|
|
9827ca5048 | ||
|
|
c7341e65e9 | ||
|
|
c1a2c76a38 | ||
|
|
3d58698bfc | ||
|
|
71c70dcc8c | ||
|
|
584ca125a6 | ||
|
|
4b616dcbe1 | ||
|
|
ac59eae329 | ||
|
|
44a1e6c28b | ||
|
|
d6500f8cb7 | ||
|
|
769704f0fc | ||
|
|
ba7fbcc02f | ||
|
|
613a08dd3a | ||
|
|
7087de0c94 | ||
|
|
afa0d87c76 | ||
|
|
a6428608e6 | ||
|
|
550d026061 | ||
|
|
45a41497df | ||
|
|
a0e9d8340c | ||
|
|
a48b40fc0c | ||
|
|
fa7d534c56 | ||
|
|
92d1a9d335 | ||
|
|
b8f8d90d13 | ||
|
|
c1c40581d5 | ||
|
|
4aacd1e47a | ||
|
|
4cc9311343 | ||
|
|
9f0e5d712f | ||
|
|
92096e6a21 | ||
|
|
002ef8ca5c | ||
|
|
0e4ce445e0 | ||
|
|
7a11547a14 | ||
|
|
29ac7b7df9 | ||
|
|
3b749f0e75 | ||
|
|
edc9917b57 | ||
|
|
bab5c3697b | ||
|
|
043b8e42c0 | ||
|
|
29d955933d | ||
|
|
a3b5d8dcfd | ||
|
|
86ba7a6d7a | ||
|
|
38bbd8a5d7 | ||
|
|
8339e9e1ca | ||
|
|
b359258d8b | ||
|
|
f94a65fcfb | ||
|
|
58c4ada254 | ||
|
|
a57b2448d0 | ||
|
|
f8093a65a6 | ||
|
|
81eff305d3 | ||
|
|
093ff9c395 | ||
|
|
857fabadbe | ||
|
|
9074441c5a | ||
|
|
d2b33defa1 | ||
|
|
aec107b6b7 | ||
|
|
7d56db701c | ||
|
|
de9e48aa98 | ||
|
|
6d13535d8d | ||
|
|
0df7b20fae | ||
|
|
84f7b96998 | ||
|
|
b1810c7ea6 | ||
|
|
6aeb508d6e | ||
|
|
d9d4ebdc01 | ||
|
|
2b70b22117 | ||
|
|
a12088f2f1 | ||
|
|
dbea39c182 | ||
|
|
269e9ceea7 | ||
|
|
80adeecb6b | ||
|
|
19eb3a5141 | ||
|
|
25bc6220b3 | ||
|
|
a938c82fc6 | ||
|
|
147b06f08e | ||
|
|
55be8bc5d7 | ||
|
|
dfd80a136b | ||
|
|
31f393ad5b | ||
|
|
5b3f15de34 | ||
|
|
009408581d | ||
|
|
960d2fd2b1 | ||
|
|
b4b34e89bc | ||
|
|
cc8dc77f92 | ||
|
|
350af6a43f | ||
|
|
71308f28c3 | ||
|
|
2d2f9d348d | ||
|
|
6d5a2a956f | ||
|
|
938afa34c9 | ||
|
|
4df59e7bf2 | ||
|
|
613230d218 | ||
|
|
65add2e448 | ||
|
|
bfa396b93f | ||
|
|
e473c1852c | ||
|
|
088cf4adef | ||
|
|
5b0a04142f | ||
|
|
d1d7af4f7e | ||
|
|
7b0190ff8a | ||
|
|
e2d103f20f | ||
|
|
7bfb2f0fe8 | ||
|
|
8adebbba3f | ||
|
|
719c8f7b9c | ||
|
|
af0f1600d9 | ||
|
|
b014cb57c0 | ||
|
|
1832f9f996 | ||
|
|
a94a0f199a | ||
|
|
2c0dc85d70 | ||
|
|
ca748f731e | ||
|
|
ebf6c15655 | ||
|
|
95271a45b6 | ||
|
|
e5d5ea9d3e | ||
|
|
94351f68fb | ||
|
|
87c1877736 | ||
|
|
bc6529a35f | ||
|
|
d2ee45653c | ||
|
|
d0d35937e8 | ||
|
|
f9d428e2c1 | ||
|
|
68fda97f9e | ||
|
|
f8fa731a32 | ||
|
|
38a4d96035 | ||
|
|
9cacbb4f34 | ||
|
|
bc6fce30ed | ||
|
|
930070ad14 | ||
|
|
11e5704414 | ||
|
|
81eca40f13 | ||
|
|
0fdb27ccd7 | ||
|
|
8b4e66e37c | ||
|
|
d409935ceb | ||
|
|
4d985abd07 | ||
|
|
3a127bcd8b | ||
|
|
a1e506eb85 | ||
|
|
b82427a6cf | ||
|
|
a3b4a0b80c | ||
|
|
df0b8cc44e | ||
|
|
709eb66614 | ||
|
|
0381cf66dc | ||
|
|
2317a4cadb | ||
|
|
5c6397e8ad | ||
|
|
6f0828858d | ||
|
|
76cff8d386 | ||
|
|
37c0fa1cd6 | ||
|
|
63830b798b | ||
|
|
b707b3e3dc | ||
|
|
af391346d1 | ||
|
|
e96774e325 | ||
|
|
e3329a8d73 | ||
|
|
da8174bcc7 | ||
|
|
5b1b52e529 | ||
|
|
0165f07bb9 | ||
|
|
7dee2c1526 | ||
|
|
52d2bea970 | ||
|
|
e26f78d9ed | ||
|
|
e0b62ded5a | ||
|
|
b17821685f | ||
|
|
a5016b0984 | ||
|
|
b5ad82f5ba | ||
|
|
14da860973 | ||
|
|
2b381e7e2f | ||
|
|
4152751d52 | ||
|
|
e8a35bf6e6 | ||
|
|
abdc3bbca1 | ||
|
|
8519183013 | ||
|
|
7c0450c364 | ||
|
|
eed1341003 | ||
|
|
3671080cfc | ||
|
|
c8481fdb3e | ||
|
|
146db578b6 | ||
|
|
c98726e4d0 | ||
|
|
4b49bab0bd | ||
|
|
385f35b6e5 | ||
|
|
a86e9b8f57 | ||
|
|
e06ccc35a0 | ||
|
|
7bdcbcca02 | ||
|
|
e1cb8e06a1 | ||
|
|
1a15bcb7e0 | ||
|
|
2df06ccf61 | ||
|
|
560533b2d4 | ||
|
|
60a2febe46 | ||
|
|
ed2a98b341 | ||
|
|
e8187356af | ||
|
|
21febab897 | ||
|
|
250aad43bc | ||
|
|
5e9e8bd76b | ||
|
|
7b3ea32963 | ||
|
|
ac9cee8fa3 | ||
|
|
4a3d503992 | ||
|
|
7bfc63ffc7 | ||
|
|
b359d97b95 | ||
|
|
19a0a8a7ec | ||
|
|
51a736dbce | ||
|
|
36928e4f39 | ||
|
|
bfe738c846 | ||
|
|
47c52e31ae | ||
|
|
d62865f9e5 | ||
|
|
f7dcaffc32 | ||
|
|
c88a43d2dc | ||
|
|
a5fe20b0e9 | ||
|
|
3dffebf733 | ||
|
|
4be5ac8780 | ||
|
|
d858fdef75 | ||
|
|
f1d9fc61c5 | ||
|
|
931dafd264 | ||
|
|
40f3ad592f | ||
|
|
723362fc33 | ||
|
|
94c5cf316b | ||
|
|
5de4b3c1b0 | ||
|
|
6eab85b7e1 | ||
|
|
40e7d58c0b | ||
|
|
c85aac613e | ||
|
|
9387320948 | ||
|
|
9e1b1b0850 | ||
|
|
b656d4fe1f | ||
|
|
76cca72bec | ||
|
|
3f6a706e9a | ||
|
|
9245af5080 | ||
|
|
7953337f15 | ||
|
|
3facf47540 | ||
|
|
629d902745 | ||
|
|
107e8e665a | ||
|
|
d9040047ec | ||
|
|
4fb2be51e0 | ||
|
|
a99cdbedc4 | ||
|
|
a543b8c0f6 | ||
|
|
f5ca4a9d15 | ||
|
|
496691d236 | ||
|
|
f1a6af048d | ||
|
|
22e32baf34 | ||
|
|
b17ba26268 | ||
|
|
e2fbb26dce | ||
|
|
81bfc83e9d | ||
|
|
cc98ca70d5 | ||
|
|
544078a40c | ||
|
|
229d438181 | ||
|
|
aab1450c3f | ||
|
|
07d7635464 | ||
|
|
277b88f332 | ||
|
|
0473bcc543 | ||
|
|
79c1affc39 | ||
|
|
4d27341787 | ||
|
|
45d8c236fe | ||
|
|
4412b016ce | ||
|
|
3cea8e8a90 | ||
|
|
9a0722ffcc | ||
|
|
49dcb55de7 | ||
|
|
fa37b11c7f | ||
|
|
20314a5d2d | ||
|
|
2bb839e26c | ||
|
|
63d0f23742 | ||
|
|
36e7a664ff | ||
|
|
e9631c2eb2 | ||
|
|
b43bc8a5bd | ||
|
|
27932679dd | ||
|
|
ab3808adbf | ||
|
|
8d8de53167 | ||
|
|
09199180f3 | ||
|
|
d9f36f1949 | ||
|
|
e9b95cce62 | ||
|
|
3ea09df4c0 | ||
|
|
8c58e536de | ||
|
|
8eed8a67ee | ||
|
|
89ba442731 | ||
|
|
81965d0d36 | ||
|
|
674642ac7c | ||
|
|
08889bd608 | ||
|
|
990d185e86 | ||
|
|
8db7fb3842 | ||
|
|
f18dd26716 | ||
|
|
25c5efbb8c | ||
|
|
f5e0a006c8 | ||
|
|
5141493337 | ||
|
|
e0f8e791b3 | ||
|
|
2bb28f83c1 | ||
|
|
af52644a4b | ||
|
|
eb71113d73 | ||
|
|
cd5288eb47 | ||
|
|
c8e5246f44 | ||
|
|
00c0f36d71 | ||
|
|
aaca6d62f3 | ||
|
|
f62e76eb02 | ||
|
|
9717a92142 | ||
|
|
cfe091b5b3 | ||
|
|
a450004c19 | ||
|
|
939b30c1b2 | ||
|
|
68886d72ce | ||
|
|
15947c311d | ||
|
|
da7247357a | ||
|
|
2bc84f446b | ||
|
|
c3f970b5fe | ||
|
|
7a69ac730b | ||
|
|
0b83bbbe40 | ||
|
|
e7bf39a770 | ||
|
|
3d1b6a40e2 | ||
|
|
8d55d310da |
@@ -39,6 +39,13 @@
|
||||
"title": "Ankama",
|
||||
"slug": "ankama"
|
||||
},
|
||||
{
|
||||
"title": "Ankara University",
|
||||
"slug": "ankara_university",
|
||||
"altNames": [
|
||||
"Ankara Üniversitesi"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Anycoin Direct",
|
||||
"slug": "anycoindirect"
|
||||
@@ -475,6 +482,16 @@
|
||||
"title": "FreeTaxUSA",
|
||||
"slug": "freetaxusa"
|
||||
},
|
||||
{
|
||||
"title": "FZJ",
|
||||
"slug": "fzj",
|
||||
"hex": "023d6b",
|
||||
"altNames": [
|
||||
"Forschungszentrum Jülich",
|
||||
"FZJ IdP",
|
||||
"iffLogin"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "G2A"
|
||||
},
|
||||
@@ -553,6 +570,14 @@
|
||||
"Hugging Face"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "IBKR",
|
||||
"slug": "ibkr",
|
||||
"altNames": [
|
||||
"Interactive Brokers",
|
||||
"IB"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "IceDrive",
|
||||
"slug": "ice_drive"
|
||||
@@ -674,6 +699,10 @@
|
||||
"飞书"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "LaunchDarkly",
|
||||
"hex": "858585"
|
||||
},
|
||||
{
|
||||
"title": "Letterboxd"
|
||||
},
|
||||
@@ -739,8 +768,11 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Mercado Livre",
|
||||
"slug": "mercado_livre",
|
||||
"title": "Memed"
|
||||
},
|
||||
{
|
||||
"title": "Mercado Libre",
|
||||
"slug": "mercado_libre",
|
||||
"altNames": [
|
||||
"Mercado Libre",
|
||||
"MercadoLibre",
|
||||
@@ -1020,6 +1052,14 @@
|
||||
"qiniu"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "R10.net",
|
||||
"slug": "r10",
|
||||
"altNames": [
|
||||
"R10",
|
||||
"r10.net"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Raindrop.io",
|
||||
"slug": "raindrop_io",
|
||||
@@ -1104,6 +1144,16 @@
|
||||
"title": "Seafile",
|
||||
"slug": "seafile"
|
||||
},
|
||||
{
|
||||
"title": "SEI",
|
||||
"altNames": [
|
||||
"sei",
|
||||
"sei!",
|
||||
"SEI!",
|
||||
"Sistema Eletrônico de Informações",
|
||||
"SEI/SEDE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Sendgrid"
|
||||
},
|
||||
@@ -1399,6 +1449,37 @@
|
||||
},
|
||||
{
|
||||
"title": "CoinSpot"
|
||||
},
|
||||
{
|
||||
"title": "Aternos",
|
||||
"slug": "aternos"
|
||||
},
|
||||
{
|
||||
"title": "Toshl Finance",
|
||||
"slug": "toshl_finance",
|
||||
"altNames": [
|
||||
"Toshl"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Tebex",
|
||||
"slug": "tebex",
|
||||
"altNames": [
|
||||
"tebex",
|
||||
"tebex.io",
|
||||
"buycraft"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "xAI",
|
||||
"slug": "xai"
|
||||
},
|
||||
{
|
||||
"title": "Cronometer",
|
||||
"slug": "cronometer"
|
||||
},
|
||||
{
|
||||
"title": "Zitadel"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
1
auth/assets/custom-icons/icons/ankara_university.svg
Normal file
|
After Width: | Height: | Size: 20 KiB |
13
auth/assets/custom-icons/icons/aternos.svg
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||
<svg version="1.0" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" xml:space="preserve"
|
||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300mm" height="300mm" viewBox="0 0 16000 16000" preserveAspectRatio="xMidYMid meet">
|
||||
<g>
|
||||
<path fill="#2b87d3" d="M0 8000 l0 -8000 8000 0 8000 0 0 8000 0 8000 -8000 0 -8000 0 0 -8000z m13990 0 l0 -5990 -5990 0 -5990 0 0 5990 0 5990 5990 0 5990 0 0 -5990z"/>
|
||||
<path fill="#2b87d3" d="M2995 12998 c-3 -7 -4 -911 -3 -2008 l3 -1995 1005 0 1005 0 3 997 2 998 998 2 997 3 0 1005 0 1005 -2003 3 c-1597 2 -2004 0 -2007 -10z"/>
|
||||
<path fill="#2b87d3" d="M8995 12998 c-3 -7 -4 -461 -3 -1008 l3 -995 997 -3 998 -2 2 -998 3 -997 1005 0 1005 0 0 2005 0 2005 -2003 3 c-1597 2 -2004 0 -2007 -10z"/>
|
||||
<path fill="#2b87d3" d="M5995 9998 c-3 -7 -4 -911 -3 -2008 l3 -1995 2005 0 2005 0 0 2005 0 2005 -2003 3 c-1597 2 -2004 0 -2007 -10z"/>
|
||||
<path fill="#2b87d3" d="M2995 6998 c-3 -7 -4 -911 -3 -2008 l3 -1995 2005 0 2005 0 0 1005 0 1005 -997 3 -998 2 -2 998 -3 997 -1003 3 c-797 2 -1004 0 -1007 -10z"/>
|
||||
<path fill="#2b87d3" d="M10997 7003 c-4 -3 -7 -453 -7 -1000 l0 -993 -997 -2 -998 -3 0 -1005 0 -1005 2005 0 2005 0 0 2005 0 2005 -1001 3 c-550 1 -1004 -1 -1007 -5z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
25
auth/assets/custom-icons/icons/cronometer.svg
Normal file
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="107.51429"
|
||||
height="102.75398"
|
||||
viewBox="0 0 107.51429 102.75398"
|
||||
fill="none"
|
||||
version="1.1"
|
||||
id="svg12"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs12" />
|
||||
<g
|
||||
id="g12"
|
||||
transform="translate(34.950067,-215.99315)">
|
||||
<path
|
||||
d="m 57.85843,271.77769 c -0.774,-0.1257 -1.5665,0.0595 -2.2048,0.5152 -0.6382,0.4557 -1.0704,1.145 -1.2028,1.9179 -0.1447,0.8786 -0.3109,1.7775 -0.496,2.6697 -1.7799,8.5172 -5.1174,16.6325 -9.8446,23.9376 -5.0162,7.5169 -10.8489,12.0047 -15.6015,12.0047 -2.2725,0.0492 -4.5367,-0.2938 -6.6926,-1.0138 -5.6912,-1.775 -11.7884,-1.7717 -17.4777,0.009 -2.1479,0.7139 -4.4023,1.0536 -6.6652,1.0044 -4.7486,0 -10.58,-4.4851 -15.5963,-11.9979 -4.727,-7.3046 -8.0652,-15.4188 -9.84715,-23.935 -1.97756,-9.485 -1.60717,-17.8346 1.06924,-24.1485 1.09829,-2.7795 2.74951,-5.307 4.85381,-7.4292 2.1042,-2.1223 4.6176,-3.7952 7.3876,-4.9171 2.77,-1.122 5.7387,-1.6698 8.7268,-1.6101 2.988,0.0597 5.9328,0.7255 8.6558,1.9572 l 0.1663,0.0635 c 3.1372,1.3741 6.5201,2.0997 9.9449,2.1331 h 0.127 c 3.4272,-0.0346 6.8117,-0.763 9.9498,-2.1412 l 0.1502,-0.0581 c 2.981,-1.3116 6.2053,-1.979 9.462,-1.9586 1.8593,0.0219 3.7051,0.317 5.4785,0.8759 1.02,0.3144 2.0172,0.6982 2.9846,1.1489 0.7121,0.333 1.5269,0.3705 2.2665,0.1042 0.7397,-0.2662 1.3439,-0.8144 1.6805,-1.5248 0.1645,-0.3511 0.2583,-0.7312 0.2755,-1.1185 0.0172,-0.3873 -0.0421,-0.7742 -0.1749,-1.1385 -0.1328,-0.3643 -0.3362,-0.6987 -0.5986,-0.9841 -0.2625,-0.2854 -0.5788,-0.5161 -0.9307,-0.6789 -1.2159,-0.5667 -2.4693,-1.0495 -3.7512,-1.445 -2.3402,-0.7366 -4.7769,-1.1202 -7.2302,-1.1381 -3.9898,-0.0245 -7.9413,0.7777 -11.6058,2.356 l -0.1514,0.0581 c -1.5551,0.6563 -3.1723,1.1544 -4.8271,1.4869 -0.2018,-1.6639 -0.5606,-3.305 -1.0719,-4.9013 11.4383,-2.0749 11.0342,-15.88816 11.0342,-15.88816 -9.3133,1.40309 -13.3294,4.93919 -14.9623,8.33877 -1.5519,-2.01717 -3.4478,-3.74459 -5.6002,-5.10275 -0.3906,-0.24958 -0.8265,-0.41979 -1.2828,-0.50093 -0.4563,-0.0811 -0.9238,-0.0716 -1.3765,0.0281 -0.4526,0.0997 -0.8812,0.28749 -1.2613,0.55278 -0.38,0.26529 -0.7041,0.60283 -0.9537,0.99335 -0.2496,0.39052 -0.4198,0.82638 -0.5009,1.28269 -0.0812,0.45631 -0.0717,0.92412 0.028,1.37675 0.0997,0.45262 0.2875,0.88118 0.5528,1.2612 0.2653,0.38003 0.6028,0.70409 0.9933,0.95367 1.9269,1.29176 3.5632,2.97116 4.8046,4.93076 1.2415,1.9597 2.0607,4.1567 2.4055,6.4507 -1.2634,-0.3369 -2.5038,-0.7536 -3.7143,-1.2476 l -0.1759,-0.0676 c -3.6617,-1.5742 -7.6092,-2.3745 -11.5949,-2.3506 -9.0309,0 -20.73562,6.0327 -25.63155,17.5723 -3.97541,9.3756 -2.962867,20.2042 -1.41244,27.6387 1.94038,9.2532 5.57254,18.0686 10.71379,26.003 6.3017,9.4378 13.5982,14.6369 20.5461,14.6369 2.8438,0.049 5.6759,-0.375 8.3806,-1.255 4.5889,-1.454 9.515,-1.454 14.1039,0 2.6964,0.878 5.5198,1.3 8.3549,1.251 6.8478,0 14.3376,-5.3384 20.5461,-14.645 5.1404,-7.9344 8.7713,-16.75 10.7098,-26.0031 0.2041,-0.9746 0.3851,-1.9559 0.5406,-2.917 0.062,-0.3835 0.0481,-0.7755 -0.0416,-1.1535 -0.0897,-0.3779 -0.2534,-0.7345 -0.4812,-1.0492 -0.2278,-0.3147 -0.5154,-0.5813 -0.8464,-0.7846 -0.3311,-0.2033 -0.6991,-0.3393 -1.0828,-0.4001"
|
||||
fill="#ff6733"
|
||||
id="path11" />
|
||||
<path
|
||||
d="m 71.33493,256.39499 v 0.0121 l -8.2649,-5.8475 -0.4271,-0.2298 0.0512,-0.5177 0.2393,-10.0798 h 0.0095 c 0.0046,-0.5208 -0.1263,-1.0339 -0.3802,-1.4887 -0.2538,-0.4548 -0.6219,-0.8357 -1.0675,-1.1053 -0.4471,-0.2723 -0.9569,-0.4242 -1.4801,-0.441 -0.5233,-0.0169 -1.0422,0.102 -1.5059,0.3451 l -8.7538,4.3593 c -1.2619,0.6789 -2.3372,1.6578 -3.1318,2.8502 -0.7946,1.1925 -1.2839,2.5621 -1.4247,3.9881 l -0.7408,7.7913 -6.3059,3.3658 c -2.4638,-3.7027 -5.7171,-6.8136 -9.5264,-9.1092 -3.8093,-2.2956 -8.0799,-3.7189 -12.5047,-4.1675 -4.4249,-0.4486 -8.894,0.0886 -13.0866,1.573 -4.1925,1.4843 -8.0041,3.879 -11.1609,7.0119 -2.7859,2.7623 -4.9974,6.0489 -6.5065,9.6702 -1.509,3.6213 -2.286,7.5057 -2.286,11.4288 0,3.9232 0.777,7.8075 2.286,11.4288 1.5091,3.6214 3.7206,6.908 6.5065,9.6702 4.197,4.1711 9.5317,7.0104 15.3356,8.1623 5.8039,1.1518 11.8188,0.5648 17.2905,-1.6873 5.4718,-2.2522 10.157,-6.0694 13.4684,-10.9731 3.3114,-4.9037 5.1017,-10.6758 5.1465,-16.5928 0.0013,-3.8327 -0.7435,-7.6291 -2.1926,-11.1774 l 6.2181,-3.3117 -0.0109,0.0311 6.7206,4.0741 c 1.2315,0.7427 2.6257,1.1736 4.0615,1.2554 1.4357,0.0817 2.8695,-0.1882 4.1772,-0.7863 l 8.7534,-4.3593 c 0.472,-0.2216 0.877,-0.5622 1.177,-0.9882 0.3,-0.426 0.483,-0.9228 0.532,-1.4413 0.049,-0.5185 -0.038,-1.0409 -0.252,-1.5156 -0.214,-0.4747 -0.548,-0.8853 -0.97,-1.1915 m -34.1485,19.4107 c -0.0347,4.7475 -1.47,9.3791 -4.1262,13.3141 -2.6561,3.9351 -6.4148,6.9984 -10.8048,8.806 -4.39,1.8076 -9.2158,2.2789 -13.8727,1.355 -4.6568,-0.924 -8.9373,-3.2021 -12.3047,-6.5488 -2.2347,-2.2161 -4.0086,-4.8527 -5.2191,-7.7579 -1.2105,-2.9051 -1.8335,-6.0211 -1.8335,-9.1684 0,-3.1472 0.623,-6.2632 1.8335,-9.1684 1.2105,-2.9051 2.9844,-5.5417 5.2191,-7.7578 2.5007,-2.4815 5.514,-4.3861 8.8284,-5.5801 3.3145,-1.194 6.85,-1.6486 10.3587,-1.3319 3.5087,0.3167 6.9057,1.397 9.9528,3.1652 3.0471,1.7682 5.6703,4.1815 7.6862,7.0707 l -8.1614,4.3552 c -1.3138,-1.6306 -2.9557,-2.9671 -4.8188,-3.9229 -1.8632,-0.9559 -3.9062,-1.5098 -5.997,-1.6259 -2.0908,-0.1161 -4.1826,0.2082 -6.1401,0.952 -1.9576,0.7437 -3.7372,1.8903 -5.2234,3.3654 -1.3826,1.3719 -2.4797,3.0038 -3.2285,4.8018 -0.7489,1.798 -1.1343,3.7264 -1.1343,5.674 0,1.9477 0.3854,3.8761 1.1343,5.6741 0.7488,1.7979 1.8459,3.4299 3.2285,4.8018 2.317,2.3457 5.3482,3.8548 8.6165,4.2898 3.2684,0.4351 6.5886,-0.2286 9.4386,-1.8865 2.85,-1.6579 5.0682,-4.2161 6.3055,-7.2723 1.2374,-3.0562 1.4238,-6.437 0.53,-9.6107 l 8.2064,-4.3687 c 1.0104,2.6766 1.5273,5.5142 1.526,8.3752 z m -26.0801,1.2734 c 0.3553,0.6991 0.9725,1.2295 1.7171,1.4759 0.7445,0.2463 1.5564,0.1885 2.2586,-0.1607 l 6.9193,-3.6848 c 0.2696,2.1001 -0.213,4.2278 -1.3623,6.006 -1.1493,1.7782 -2.891,3.0921 -4.9165,3.7087 -2.0255,0.6167 -4.2042,0.4963 -6.1494,-0.3399 -1.9452,-0.8361 -3.5316,-2.334 -4.4779,-4.228 -0.9463,-1.8941 -1.1912,-4.0621 -0.6917,-6.1196 0.4995,-2.0576 1.7111,-3.8718 3.4205,-5.1212 1.7094,-1.2494 3.806,-1.8532 5.9181,-1.7044 2.1121,0.1487 4.1034,1.0405 5.6207,2.5172 l -6.9345,3.6997 c -0.3472,0.1714 -0.6571,0.4099 -0.9118,0.7018 -0.2546,0.2918 -0.449,0.6311 -0.5719,0.9984 -0.1229,0.3673 -0.172,0.7553 -0.1442,1.1416 0.0278,0.3863 0.1317,0.7633 0.3059,1.1093 z m 39.7718,-27.0764 c 0.219,-1.157 0.3879,-2.1708 1.4557,-2.7467 l 4.5109,-2.2438 -0.6085,5.5191 -5.7029,2.8386 z m 8.0467,10.3339 c -0.5151,0.173 -1.0642,0.2192 -1.6009,0.1347 -0.5367,-0.0845 -1.0453,-0.2971 -1.4824,-0.6199 l -2.9222,-1.7424 5.7042,-2.8386 4.8109,2.8224 z"
|
||||
fill="#ff6733"
|
||||
id="path12" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.6 KiB |
7
auth/assets/custom-icons/icons/fzj.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg width="21.087mm" height="21.735mm" version="1.1" viewBox="0 0 21.087 21.735" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="translate(34.396 -25.136)">
|
||||
<path d="m-26.575 34.404 3.5438-9.2136c-0.38165-0.0363-0.76329-0.0545-1.1631-0.0545-1.9082 0-3.7983 0.49067-5.452 1.4538-1.6538 0.96316-3.035 2.3261-3.9982 3.998-0.09087 0.14538-0.16356 0.30893-0.25443 0.47249v0.0545l-0.14538 0.39981c-1.0904 2.7804 0.56337 4.834 2.1626 5.4337 0.45433 0.16355 0.92685 0.25441 1.3994 0.25441 0.72694 0 1.4175-0.18172 2.0536-0.54517 0.6179-0.36347 1.1449-0.8723 1.5084-1.4902 0.14539-0.23624 0.25443-0.49067 0.34529-0.76326m6.4334 2.3625c-2.1081 5.5246-7.2149 7.5962-11.885 6.7966 0.70877 0.72692 1.5084 1.3448 2.3807 1.8536 1.6538 0.96316 3.5257 1.4538 5.452 1.4538 1.9082 0 3.7619-0.49067 5.4339-1.4538 1.6538-0.96316 3.035-2.3261 3.9982-3.9798 0.94502-1.6537 1.4539-3.5437 1.4539-5.4337 0-1.9082-0.50886-3.8163-1.4539-5.4518-0.5452-0.94499-1.1994-1.7628-1.9809-2.4897l-3.3984 8.7048" fill="#023d6b" fill-rule="evenodd" stroke-width=".26458"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
12
auth/assets/custom-icons/icons/ibkr.svg
Normal file
@@ -0,0 +1,12 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="775" height="1511" version="1.2">
|
||||
<defs>
|
||||
<linearGradient id="a" x1="667.4" x2="-.7" y1="1142.8" y2="1142.8"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#d81222" />
|
||||
<stop offset="1" stop-color="#960b1a" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path d="M.3 1510.2V775.3l668 734.9z" style="fill:url(#a)" />
|
||||
<path fill="#d81222"
|
||||
d="M574.2 1154.6c-110.5 0-199.9-89.5-199.9-200.2 0-110.8 89.4-200.3 199.9-200.3 110.6 0 200 89.5 200 200.3 0 110.7-89.4 200.2-200 200.2M668.3.4.3 1510.2V775.3z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 624 B |
1
auth/assets/custom-icons/icons/launchdarkly.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 216 214.94"><path d="M109.8,214.94a4.87,4.87,0,0,1-4.26-2.66,4.5,4.5,0,0,1,.44-4.82l50.49-69.53L68,174.11a4.61,4.61,0,0,1-1.9.41,4.77,4.77,0,0,1-4.52-3.4,4.57,4.57,0,0,1,2-5.21L141.33,120,4.41,112.13a4.69,4.69,0,0,1,0-9.36l137-7.87L63.61,49a4.56,4.56,0,0,1-1.94-5.2,4.74,4.74,0,0,1,4.51-3.4,4.6,4.6,0,0,1,1.9.4L156.5,77,106,7.48a4.56,4.56,0,0,1-.44-4.83A4.84,4.84,0,0,1,109.84,0a4.59,4.59,0,0,1,3.28,1.41L213.77,102.05a7.65,7.65,0,0,1,0,10.8L113.08,213.53A4.59,4.59,0,0,1,109.8,214.94Z"/></svg>
|
||||
|
After Width: | Height: | Size: 580 B |
47
auth/assets/custom-icons/icons/memed.svg
Normal file
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="129.55565mm"
|
||||
height="129.41467mm"
|
||||
viewBox="0 0 129.55565 129.41467"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
xml:space="preserve"
|
||||
inkscape:export-filename="memed2.svg"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#ec9000"
|
||||
inkscape:document-units="mm"><inkscape:page
|
||||
x="0"
|
||||
y="0"
|
||||
width="129.55565"
|
||||
height="129.41467"
|
||||
id="page2"
|
||||
margin="0"
|
||||
bleed="0" /></sodipodi:namedview><defs
|
||||
id="defs1" /><g
|
||||
inkscape:label="Camada 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="matrix(1.6834732,0,0,1.6834732,47.649925,-205.86142)"><path
|
||||
style="fill:#f5f2f5;fill-opacity:1;stroke:none;stroke-width:1.64472;stroke-opacity:0.216306"
|
||||
d="m -229.63928,666.3282 c -1.80919,-0.13135 -3.05972,0.10695 -3.33899,-0.0739 -0.8201,-0.53107 -3.56255,-6.29326 -5.5356,-10.78298 -5.66304,-12.88636 -9.6848,-29.27567 -10.13326,-42.53094 -0.19655,-5.80951 0.10184,-7.61979 0.87562,-12.19698 1.5552,-9.19979 3.41577,-14.15687 8.37613,-20.05013 4.44031,-5.2754 13.12164,-10.82873 19.15739,-12.38511 4.40045,-1.1347 11.49057,-1.83141 19.07025,-1.58315 10.46549,0.34277 15.53289,2.0447 23.98486,6.0306 8.4934,4.00545 8.5476,4.69447 17.19355,12.68346 l 9.17947,8.48198 1.73483,-3.36021 c 5.30229,-10.27007 13.54153,-11.35636 20.42059,-15.3818 9.98116,-5.84072 20.33566,-8.65915 31.655487,-8.65915 20.40721,0 35.175223,9.03215 40.949411,24.9899 2.680505,7.40793 3.691311,17.03863 2.871769,25.62379 -1.523031,15.95462 -6.502251,33.73112 -13.14355,45.38711 l -2.092079,3.67176 -9.091661,0.0949 c -10.759893,0.11232 -14.787739,0.55882 -14.782316,-0.39427 0.0037,-0.6492 2.126398,-5.62719 6.614865,-15.48568 6.460624,-14.19017 9.107566,-24.18606 9.458064,-38.19534 0.310181,-12.39792 -0.54619,-15.46077 -5.720525,-20.65311 -4.842652,-4.8595 -9.652569,-6.74545 -17.203292,-6.31247 -6.931853,0.39749 -14.431373,3.39042 -20.210693,8.03964 -8.08359,6.50292 -18.16141,19.27599 -24.59806,30.53119 -6.58062,11.50695 -5.26814,12.2378 -6.49554,11.46026 -0.4565,-0.28918 -3.06129,-4.8228 -4.93182,-8.21504 -8.50061,-15.416 -17.38274,-26.70868 -26.57306,-33.49026 -3.97121,-2.93037 -10.51147,-6.3019 -14.41859,-7.35191 -3.7439,-1.00615 -11.45838,-0.93722 -14.80652,0.0702 -6.9037,2.07788 -11.28665,6.76825 -13.35945,14.26878 -0.92563,3.34947 -1.3257,12.28307 -0.72975,18.04782 1.25223,12.1133 4.66457,22.59592 12.97979,39.84761 2.77157,5.7502 4.31011,7.49886 3.74297,7.73574 -0.79147,0.33057 -9.85373,0.57929 -14.57149,0.23675 z"
|
||||
id="path8"
|
||||
sodipodi:nodetypes="cssssssssscsssssscsssssssssssscsssscc"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,50.096465,-2.4191315)" /><path
|
||||
style="display:inline;fill:#6262f5"
|
||||
d="m 4.4956948,198.76332 c -3.30706,-0.44247 -8.3326,-1.84639 -9.73079,-2.71836 -0.32338,-0.20168 -0.90706,-0.44056 -1.29707,-0.53085 -0.39,-0.0903 -0.87471,-0.32978 -1.07713,-0.5322 -0.20241,-0.20241 -0.9589,-0.66744 -1.68108,-1.0334 -4.5630398,-2.31227 -11.4938598,-9.24939 -13.7898298,-13.80238 -0.3694,-0.73252 -0.7455,-1.39139 -0.83579,-1.46415 -0.0903,-0.0728 -0.29661,-0.42994 -0.4585,-0.79375 -0.16189,-0.3638 -0.55469,-1.22236 -0.87289,-1.90791 -1.88451,-4.06016 -3.16441,-10.69837 -3.05006,-15.81917 0.11739,-5.25717 1.3037,-10.99832 3.05006,-14.76084 0.3182,-0.68555 0.711,-1.54411 0.87289,-1.90791 0.16189,-0.3638 0.36821,-0.72099 0.4585,-0.79375 0.0903,-0.0728 0.46639,-0.73162 0.83579,-1.46414 2.26147,-4.48457 8.57756,-10.84773 13.5529798,-13.65397 1.01864,-0.57454 2.03068,-1.15388 2.24896,-1.28742 2.24204,-1.37166 8.36495,-3.26099 12.03854,-3.71469 2.47599,-0.3058 8.3413402,-0.40086 9.5250002,-0.15438 0.29104,0.0606 1.3626,0.20579 2.38125,0.32263 2.01526,0.23115 1.93948,0.21791 2.51354,0.43921 1.02205,0.39401 3.03969,0.99193 3.34719,0.99193 0.18838,0 0.97085,0.2881 1.73881,0.64022 0.76796,0.35212 1.93207,0.88513 2.58692,1.18446 0.65484,0.29934 1.54791,0.75538 1.98458,1.01343 0.43668,0.25805 1.38918,0.81695 2.11667,1.242 1.79243,1.04728 3.18453,2.21035 6.20039,5.1803 2.79182,2.74933 4.23282,4.45383 5.48018,6.48229 3.17204,5.1584 5.07219,10.30587 5.66481,15.34584 0.55918,4.7556 0.47529,7.60255 -0.40153,13.62604 -0.18126,1.24527 -1.56492,5.54247 -2.28224,7.08792 -0.3182,0.68555 -0.71099,1.54411 -0.87288,1.90791 -0.16189,0.36381 -0.36822,0.72099 -0.45851,0.79375 -0.0903,0.0728 -0.46639,0.73163 -0.83578,1.46415 -2.30965,4.5801 -9.11275,11.36702 -13.94307,13.9099 -0.8041,0.42331 -1.64059,0.88054 -1.85887,1.01607 -1.11841,0.6944 -4.14314,1.88062 -6.61459,2.59408 -5.20986,1.50399 -10.74885,1.87148 -16.5364502,1.09714 z m -9.6573,-24.95559 c 0,-0.0615 -0.57847,-1.28185 -1.28549,-2.71198 -2.18367,-4.41702 -3.20781,-8.24456 -3.20895,-11.99293 -0.001,-4.42964 2.01227,-6.72114 5.88783,-6.70038 4.47803005,0.024 9.21844,4.21886 13.02766,11.52839 0.43587,0.8364 0.8697302,1.52101 0.9641202,1.52136 0.0944,3.4e-4 0.55697,-0.74351 1.02794,-1.65302 2.22999,-4.30635 6.18881,-8.96011 8.72108,-10.25198 3.33434,-1.70105 6.32476,-1.57437 8.3288,0.35282 1.52052,1.46222 1.82726,2.64731 1.65484,6.39343 -0.15794,3.4314 -1.07983,6.63419 -3.10868,10.8001 -0.86224,1.77047 -1.16282,2.63732 -0.94364,2.72142 0.1769,0.0679 1.62162,0.0894 3.21049,0.0478 l 2.88886,-0.0756 0.64276,-1.1663 c 2.06367,-3.7446 3.65793,-10.57405 3.37181,-14.44411 -0.4585,-6.20174 -3.63562,-9.71814 -9.48799,-10.50118 -5.6749,-0.75929 -11.4014,1.60585 -15.29697,6.31791 -0.50399,0.60962 -0.97587,1.1084 -1.04863,1.1084 -0.0728,0 -0.5490102,-0.5047 -1.0583402,-1.12155 -2.23259,-2.70394 -5.45587,-4.88484 -8.73124995,-5.90763 -1.99626005,-0.62336 -6.74195005,-0.63537 -8.73812005,-0.0221 -1.9981998,0.61389 -4.1480898,2.17983 -5.3452198,3.89337 -1.1067,1.58409 -1.39833,2.42025 -1.82847,5.24242 -0.55493,3.64096 0.82065,10.37308 3.01361,14.7487 0.43759,0.87312 0.92909,1.67497 1.09223,1.78189 0.30781,0.20173 6.2497198,0.288 6.2497198,0.0907 z"
|
||||
id="path1"
|
||||
sodipodi:nodetypes="ssssssssssssscssssssssssssssssssssssscscssscsssssccsssssssssssscc" /></g></svg>
|
||||
|
After Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 8.0 KiB |
96
auth/assets/custom-icons/icons/r10.svg
Normal file
@@ -0,0 +1,96 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 280.6 100" style="enable-background:new 0 0 280.6 100;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{enable-background:new ;}
|
||||
.st1{fill:#FFFFFF;}
|
||||
.st2{fill:#3F4257;}
|
||||
.st3{fill-rule:evenodd;clip-rule:evenodd;fill:#3F4257;}
|
||||
.st4{fill-rule:evenodd;clip-rule:evenodd;fill:#EA4335;}
|
||||
.st5{fill:#EA4335;}
|
||||
.st6{fill:#FBBC05;}
|
||||
.st7{fill:#4285F4;}
|
||||
.st8{fill:#34A853;}
|
||||
</style>
|
||||
<g>
|
||||
<g class="st0">
|
||||
<path class="st1" d="M114.5,57.9h-6.3L97.9,46.2h-7.2v11.7h-5.4V24.1c5.3,0,10.5,0,15.8,0c7.8,0,12,5.4,12,11
|
||||
c0,4.8-2.5,9.5-9.2,10.5L114,57L114.5,57.9z M90.7,29.1v12.2H101c4.5,0,6.5-2.8,6.5-6c0-3-2-6.2-6.4-6.2H90.7z"/>
|
||||
<polygon class="st1" points="124.5,57.9 129.9,57.9 129.9,24.2 118.7,27.7 118.7,32.4 124.5,30.8 "/>
|
||||
<path class="st1" d="M139.7,38.1c0-19.6,28.4-19.5,28.4,0V44c0,19.5-28.4,19.6-28.4,0V38.1z M145.2,44c0,12.8,17.5,12.8,17.5,0
|
||||
v-5.9c0-12.6-17.5-12.8-17.5,0V44z"/>
|
||||
</g>
|
||||
<g class="st0">
|
||||
<path class="st1" d="M188.8,24.2l22.8,27.9V24.2h2.6v33.8h-1L190.3,30v27.9h-2.6V24.2H188.8z"/>
|
||||
<path class="st1" d="M226.3,39.7h19.8v2.4h-19.8v13.3h21.4v2.5h-24V24.2h23.4v2.5h-20.8V39.7z"/>
|
||||
<path class="st1" d="M263.3,26.5h-12.2v-2.3h27.1v2.3h-12.2v31.4h-2.6V26.5z"/>
|
||||
</g>
|
||||
<g id="Group_174_3_" transform="translate(-5071.999 -1624)">
|
||||
<path class="st1" d="M5106.8,1722c-5.8,0-11.4-1.2-16.4-3.6c-4.9-2.3-9.1-5.7-12-9.8c-5-7.1-6.1-16-3-25l0-0.1
|
||||
c7.8-22.5,13-25.7,18.7-27.4l0.5-0.1l0,0.2l0.8-0.1c0.5,0,0.9-0.1,1.4-0.1c0.6,0,1.2,0,1.8,0.1l0.8,0.1l0.4,0.1
|
||||
c1.9,0.3,3.8,0.8,5.7,1.5l0,0l0,0c0.4,0.1,0.9,0.2,1.3,0.2c0,0,0,0,0,0c5.2,0,12.8-10.1,18.8-28.9c-0.3,1.7-1.1,6.5-1.4,8.1
|
||||
c-1.2,6.5-2.3,12.7-3.2,17.7l-0.1,0.5l0.5,0.2c2.8,1.2,5,3.8,6.5,7.6l0.1,0.3l0.3,0.1c5.2,1.9,9.3,4.6,12.1,8
|
||||
c2.5,3,4.2,6.5,4.8,10.5c0.9,5.3,0,11.6-2.5,17.6c-2.2,5.2-5.3,9.8-8.5,12.3C5126,1718.6,5116.6,1722,5106.8,1722L5106.8,1722z
|
||||
M5094.2,1635.7l0.5,2.5l-0.2,16.8L5094.2,1635.7z M5099.2,1654.4c-0.2-8.7,5.1-17.6,12.8-21.7c-0.7,0.9-1.4,1.8-2,2.7
|
||||
C5103.8,1639,5100.3,1645.3,5099.2,1654.4z"/>
|
||||
<g>
|
||||
<path class="st1" d="M5128.3,1663.1c-1.7-4.1-4-6.7-6.9-8c1.5-8.3,3.6-20,5.7-31.1c-0.4,1.7-1.1,3.4-1.7,5
|
||||
c-1.7,9.3-4.2,20.4-5.5,27.4c3.2,1.5,5.6,4.2,6.9,7.6c27.3,9.9,16.5,38.3,6.9,46.1c-28,22.7-67.7,4-57.3-26.9
|
||||
c6.8-20.3,12.9-24.2,18.7-26v0c2.6-0.5,6.9,0.4,9.2,0.9c1.4,0.4,2.2,0.5,2.5,0.5c8,0.5,15.6-18.5,18.5-29.8
|
||||
c-2.1,5.3-11.8,30.7-19.9,28.3c-1.9-0.7-3.8-1.2-5.8-1.6c0.8-8.8,4-15.8,10.7-19.6c1.2-1.8,2.7-3.6,4.2-5.1
|
||||
c-9.9,3.5-16.8,14.4-16.1,24.6c-1.1-0.1-2.2-0.1-3.3,0l0.2-17.2l-2.1-9.6l0.5,26.8c-6.3,1.9-11.6,5.9-19.1,27.8l0,0
|
||||
c-7.8,22.6,10.4,39.4,32.1,39.4c9.2,0,19-3.1,27.7-10C5144.6,1704.6,5157.1,1673.7,5128.3,1663.1z"/>
|
||||
<polygon class="st2" points="5114.7,1630.8 5114.7,1630.8 5114.7,1630.8 "/>
|
||||
</g>
|
||||
<g id="Group_1_3_" transform="translate(5072 1624)">
|
||||
<path id="Path_839_2_" class="st3" d="M33.1,41.9c1.8-4.6,5.7-7.7,10.2-7.7c6.2,0,11.3,6.1,11.3,13.6s-5.1,13.6-11.3,13.6
|
||||
c-4.5,0-8.4-3.2-10.2-7.8c0.1-0.2,0.2-0.3,0.3-0.5c1.7,4.2,5.2,7.2,9.4,7.2c5.7,0,10.4-5.6,10.4-12.4s-4.6-12.4-10.4-12.4
|
||||
c-4.1,0-7.7,2.9-9.4,7.1C33.3,42.2,33.2,42.1,33.1,41.9z M25.1,36.4c2.9,0,5.5,1.9,7.1,4.8c-1.2-2.3-3.6-3.7-6.2-3.8
|
||||
c-4.4,0-7.9,4.6-7.9,10.3S22.5,58,26,58s4.7-1.9,6.1-4.2c-1.6,2.8-3.2,5.1-7,5.1c-3.8,0-8.7-5-8.7-11.2
|
||||
C16.4,41.5,20.3,36.4,25.1,36.4L25.1,36.4z"/>
|
||||
<path id="Path_840_2_" class="st3" d="M27.8,45.5c0.9,0,1.6-0.7,1.6-1.5c0-0.9-0.7-1.6-1.5-1.6c-0.9,0-1.6,0.7-1.6,1.5
|
||||
c0,0,0,0,0,0C26.3,44.8,27,45.4,27.8,45.5z"/>
|
||||
<path id="Path_842_2_" class="st3" d="M46.9,46.4c0.9,0,1.6-0.6,1.6-1.5c0-0.9-0.6-1.6-1.5-1.6s-1.6,0.6-1.6,1.5c0,0,0,0,0,0.1
|
||||
C45.4,45.7,46.1,46.4,46.9,46.4z"/>
|
||||
<path id="Path_843_2_" class="st3" d="M26.1,62.8l0.6,0.1l-2.3,23.4l-0.6-0.1L26.1,62.8z"/>
|
||||
<path id="Path_844_2_" class="st3" d="M38.6,65.3l0.6,0l1.5,23.5l-0.6,0L38.6,65.3z"/>
|
||||
<path id="Path_845_2_" class="st3" d="M51.6,64.2l0.5-0.1l3.1,19.7L54.6,84L51.6,64.2z"/>
|
||||
<g>
|
||||
<polygon class="st2" points="8.1,57.5 8.1,57.5 8.1,57.5 8.1,57.5 "/>
|
||||
<path class="st2" d="M8.1,57.5c-4.3,39.6,64.1,47.3,56.7-0.1c0,0,0,0,0,0c0,0,0,0,0,0s0,0,0,0c-0.3,0.2-0.6,0.4-0.9,0.6
|
||||
c-0.3,0.2-0.6,0.5-1,0.7c-0.9,0.6-2.2,1.2-3.8,1.9C41.4,66.9,17.2,62.2,8.1,57.5 M9.3,58.9c7.6,7,37.3,10.1,53,2.1
|
||||
c0,0,0.3-0.1,0.5-0.3C67.3,101.9,5.8,94.4,9.3,58.9z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<circle class="st1" cx="177.1" cy="53.6" r="4"/>
|
||||
<path id="Forma_1_3_" class="st4" d="M153,74.7c-1,0-2.1,0.3-2.9,1c-0.7,0.6-1.3,1.3-1.7,2c-0.4-0.8-1-1.5-1.7-2
|
||||
c-0.8-0.7-1.8-1-2.9-1c-2.9,0-5.2,2.4-5.2,5.6c0,3.5,2.8,5.8,7,9.4c0.7,0.6,1.5,1.3,2.4,2c0.2,0.2,0.6,0.2,0.8,0
|
||||
c0.8-0.7,1.6-1.4,2.4-2c4.2-3.6,7-6,7-9.4C158.1,77.1,155.9,74.7,153,74.7z"/>
|
||||
<g>
|
||||
<path class="st1" d="M86.6,71.9l5.2,15.7l5.3-15.7h1.5l5.3,15.7l5.2-15.7h2.7l-6.6,19h-2.4l-4.9-14.2L93,90.9h-2.4l-6.6-19H86.6z"
|
||||
/>
|
||||
<path class="st1" d="M125.1,88.7c-1.4,1.6-3.7,2.4-5.8,2.4c-4.1,0-7-2.7-7-7c0-4,2.9-6.9,6.9-6.9c4.1,0,7.2,2.5,6.7,7.9h-11.4
|
||||
c0.2,2.5,2.3,4,4.9,4c1.5,0,3.4-0.6,4.3-1.7L125.1,88.7L125.1,88.7z M123.8,83.2c-0.1-2.6-1.9-4-4.5-4c-2.3,0-4.4,1.4-4.7,4
|
||||
L123.8,83.2L123.8,83.2z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st5" d="M214.6,84.2c0,4.8-3.7,8.3-8.3,8.3s-8.3-3.5-8.3-8.3c0-4.8,3.7-8.3,8.3-8.3S214.6,79.4,214.6,84.2z M211,84.2
|
||||
c0-3-2.2-5-4.7-5s-4.7,2-4.7,5c0,3,2.2,5,4.7,5S211,87.2,211,84.2z"/>
|
||||
<path class="st6" d="M232.6,84.2c0,4.8-3.7,8.3-8.3,8.3s-8.3-3.5-8.3-8.3c0-4.8,3.7-8.3,8.3-8.3S232.6,79.4,232.6,84.2z M229,84.2
|
||||
c0-3-2.2-5-4.7-5s-4.7,2-4.7,5c0,3,2.2,5,4.7,5S229,87.2,229,84.2z"/>
|
||||
<path class="st7" d="M249.9,76.4v14.9c0,6.1-3.6,8.7-7.9,8.7c-4,0-6.5-2.7-7.4-4.9l3.2-1.3c0.6,1.4,2,3,4.2,3
|
||||
c2.7,0,4.4-1.7,4.4-4.9v-1.2h-0.1c-0.8,1-2.4,1.9-4.4,1.9c-4.2,0-8-3.6-8-8.3c0-4.7,3.8-8.3,8-8.3c2,0,3.6,0.9,4.4,1.9h0.1v-1.4
|
||||
L249.9,76.4L249.9,76.4z M246.7,84.3c0-2.9-2-5.1-4.4-5.1c-2.5,0-4.6,2.1-4.6,5.1c0,2.9,2.1,5,4.6,5
|
||||
C244.7,89.3,246.7,87.2,246.7,84.3z"/>
|
||||
<path class="st8" d="M255.6,67.7V92H252V67.7H255.6z"/>
|
||||
<path class="st5" d="M269.5,87l2.8,1.9c-0.9,1.4-3.1,3.7-6.9,3.7c-4.7,0-8.3-3.7-8.3-8.3c0-4.9,3.6-8.3,7.8-8.3
|
||||
c4.3,0,6.4,3.4,7.1,5.3l0.4,0.9l-11.1,4.6c0.9,1.7,2.2,2.5,4,2.5C267.3,89.3,268.6,88.4,269.5,87L269.5,87z M260.8,84l7.4-3.1
|
||||
c-0.4-1-1.6-1.8-3.1-1.8C263.3,79.1,260.7,80.8,260.8,84z"/>
|
||||
<path class="st7" d="M184.5,82.1v-3.5h11.9c0.1,0.6,0.2,1.3,0.2,2.1c0,2.6-0.7,5.9-3.1,8.3c-2.3,2.4-5.2,3.6-9,3.6
|
||||
c-7.1,0-13.1-5.8-13.1-12.9c0-7.1,6-12.9,13.1-12.9c3.9,0,6.7,1.5,8.9,3.6l-2.5,2.5c-1.5-1.4-3.6-2.5-6.4-2.5
|
||||
c-5.2,0-9.3,4.2-9.3,9.4c0,5.2,4.1,9.4,9.3,9.4c3.4,0,5.3-1.4,6.5-2.6c1-1,1.7-2.4,1.9-4.4L184.5,82.1z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.8 KiB |
3
auth/assets/custom-icons/icons/sei.svg
Normal file
|
After Width: | Height: | Size: 18 KiB |
19
auth/assets/custom-icons/icons/tebex.svg
Normal file
@@ -0,0 +1,19 @@
|
||||
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
|
||||
<title>vikunja</title>
|
||||
<defs>
|
||||
<clipPath clipPathUnits="userSpaceOnUse" id="cp1">
|
||||
<path d="m211.62 166.19v47.1h-167.62v-47.1z"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<style>
|
||||
.s0 { fill: #101010 }
|
||||
.s1 { fill: #ffffff }
|
||||
</style>
|
||||
<path class="s0" d="m226.9 46.8q-0.8-0.9-1.6-1.9-0.8-1-1.6-1.9-0.9-1-1.7-1.9-0.9-0.9-1.7-1.9c-24.1-25.2-56.9-39.2-92.3-39.2-8.3 0-16.7 0.8-24.9 2.4-8.3 1.7-16.3 4.1-24.1 7.3-7.7 3.2-15.1 7.2-22.1 11.9-7 4.6-13.4 10-19.4 15.9-5.9 6-11.3 12.4-15.9 19.4-4.7 7-8.7 14.4-11.9 22.1-3.2 7.8-5.6 15.8-7.3 24.1-1.6 8.2-2.4 16.6-2.4 24.9 0 8.4 0.8 16.8 2.5 25 1.6 8.3 4 16.3 7.2 24.1 3.2 7.7 7.2 15.1 11.9 22.1 4.6 7 10 13.4 15.9 19.4 6 5.9 12.4 11.3 19.4 15.9 7 4.7 14.4 8.7 22.1 11.9 7.8 3.2 15.8 5.6 24.1 7.2 8.2 1.7 16.6 2.5 24.9 2.4 8.4 0.1 16.8-0.7 25-2.4 8.3-1.6 16.3-4 24-7.2 7.8-3.2 15.2-7.2 22.2-11.9 6.9-4.6 13.4-10 19.3-15.9 6-6 11.3-12.4 16-19.4 4.7-7 8.7-14.4 11.9-22.1 3.2-7.8 5.6-15.8 7.2-24.1 1.7-8.2 2.5-16.6 2.4-25 0-29.2-10.5-58.2-29.1-81.2"/>
|
||||
<g id="Clip-Path" clip-path="url(#cp1)">
|
||||
<g>
|
||||
<path fill-rule="evenodd" class="s1" d="m117.5 183.8c2.5-3.5 6.5-5.5 11.3-5.5 9.1 0 15.6 7 15.6 16.7 0 9.8-6.6 16.8-15.8 16.8-4.8 0-8.7-1.8-11.2-5.3l-0.2 4.5h-6.9v-44.8h7.2zm20.2 11.4c0-5.7-4.1-10.4-9.3-10.4-5.2 0-9.4 4.7-9.4 10.4 0 5.8 4.2 10.5 9.4 10.5 5.2 0 9.3-4.7 9.3-10.5zm-70.4 9.4l0.3-0.2 2.8 5.7-0.1 0.1c-2.7 2.1-5.6 3.1-8.8 3.1-7 0-10.9-4-10.9-11.4v-16.7h-6.6l1.6-6.5h5v-8.3h7.3v8.3h11.6v6.5h-11.6v16.7c0 2.9 1.5 4.6 4.3 4.6 1.9 0 3.3-0.5 5.1-1.9zm36.1-9.8q0 0.5-0.1 0.9 0 0.4 0 0.8v0.3h-23.7c0.7 5.6 4.1 8.6 9.5 8.6 3.5 0 6.3-1.2 8.9-3.8l0.2-0.2 3.8 4.7-0.1 0.1c-3.4 3.8-7.6 5.5-13.2 5.5-9.9 0-16.3-6.6-16.3-16.8 0-9.7 6.7-16.8 16-16.8 9.1 0 15 6.6 15 16.7zm-7.3-2.7c-0.6-4.8-3.5-7.6-7.8-7.6-4.3 0-7.6 3-8.5 7.6zm82.8 2.7q0 0.5 0 0.9-0.1 0.4-0.1 0.8v0.3h-23.7c0.7 5.6 4.1 8.6 9.5 8.6 3.5 0 6.3-1.2 8.9-3.8l0.2-0.2 3.9 4.7-0.2 0.1c-3.4 3.8-7.6 5.5-13.2 5.5-9.9 0-16.2-6.6-16.2-16.8 0-9.7 6.6-16.8 15.9-16.8 9.1 0 15 6.6 15 16.7zm-23.6-2.7h16.3c-0.6-4.9-3.4-7.6-7.8-7.6-4.3 0-7.6 3-8.5 7.6zm55-13.4l-11.2 15.4 12.5 16.9h-8.6l-8.1-11.5-7.8 11.5h-8.2l12.1-16.5-11.5-15.8h8.5l7.1 10.5 7-10.5z"/>
|
||||
</g>
|
||||
</g>
|
||||
<path class="s1" d="m130.9 71.8c4.5-7.3 12.5-9.5 12.5-9.5 0 0-15.3-4-15.3-20.3 0 16.3-15.3 20.3-15.3 20.3 0 0 8 2.2 12.4 9.5h-20.9v28.2l4.8-8.7h9.5v48.6l19 19.4v-59.5c-4.9-2.3-11.8-8.1-14.3-12.5 4.2 1.3 10 3 14.4 4h14.2v-19.5z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.4 KiB |
103
auth/assets/custom-icons/icons/toshl_finance.svg
Normal file
|
After Width: | Height: | Size: 16 KiB |
35
auth/assets/custom-icons/icons/xai.svg
Normal file
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 27.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
id="katman_1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
viewBox="0 0 841.89 595.28"
|
||||
style="enable-background:new 0 0 841.89 595.28;"
|
||||
xml:space="preserve"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs id="defs4" />
|
||||
<g
|
||||
id="g4"
|
||||
style="fill:currentColor">
|
||||
<polygon
|
||||
points="557.09,211.99 565.4,538.36 631.96,538.36 640.28,93.18"
|
||||
id="polygon1"
|
||||
style="fill:currentColor" />
|
||||
<polygon
|
||||
points="640.28,56.91 538.72,56.91 379.35,284.53 430.13,357.05"
|
||||
id="polygon2"
|
||||
style="fill:currentColor" />
|
||||
<polygon
|
||||
points="201.61,538.36 303.17,538.36 353.96,465.84 303.17,393.31"
|
||||
id="polygon3"
|
||||
style="fill:currentColor" />
|
||||
<polygon
|
||||
points="201.61,211.99 430.13,538.36 531.69,538.36 303.17,211.99"
|
||||
id="polygon4"
|
||||
style="fill:currentColor" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
74
auth/assets/custom-icons/icons/zitadel.svg
Normal file
@@ -0,0 +1,74 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 467 467" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g id="zitadel-logo-solo-darkdesign" transform="matrix(0.564847,0,0,0.659318,-1282.85,0)">
|
||||
<rect x="2271.15" y="0" width="826.773" height="708.241" style="fill:none;"/>
|
||||
<g transform="matrix(4.96737,-1.14029,1.331,4.25561,-5923.46,-2258.26)">
|
||||
<path d="M1493.5,1056.38L1493.5,1037L1496.5,1037L1496.5,1061.62L1426.02,1020.38L1496.5,979.392L1496.5,1004L1493.5,1004L1493.5,984.608L1431.98,1020.39L1493.5,1056.38Z" style="fill:white;"/>
|
||||
</g>
|
||||
<g transform="matrix(31.0036,0,0,15.0393,-397275,-666.457)">
|
||||
<g transform="matrix(-0.0429306,-0.282967,0.160219,-0.0758207,12884.5,137.392)">
|
||||
<path d="M212.517,110L200.392,110L190,92L179.608,110L167.483,110L190,71L212.517,110Z" style="fill:url(#_Linear1);"/>
|
||||
</g>
|
||||
<g transform="matrix(0.160219,0.0758207,-0.0429306,0.282967,12878.9,10.8747)">
|
||||
<path d="M212.517,110L200.392,110L190,92L179.608,110L167.483,110L190,71L212.517,110Z" style="fill:url(#_Linear2);"/>
|
||||
</g>
|
||||
<g transform="matrix(-0.117289,0.207146,-0.117289,-0.207146,12943.8,65.7)">
|
||||
<path d="M212.517,110L200.392,110L190,92L179.608,110L167.483,110L190,71L212.517,110Z" style="fill:url(#_Linear3);"/>
|
||||
</g>
|
||||
<g transform="matrix(-0.160219,-0.0758207,0.0429306,-0.282967,12917.4,132.195)">
|
||||
<path d="M139.622,117L149,142L130.244,142L139.622,117Z" style="fill:url(#_Linear4);"/>
|
||||
</g>
|
||||
<g transform="matrix(-0.117289,0.207146,0.117289,0.207146,12897.8,5.87512)">
|
||||
<path d="M139.622,117L149,142L130.244,142L139.622,117Z" style="fill:url(#_Linear5);"/>
|
||||
</g>
|
||||
<g transform="matrix(-0.0429306,-0.282967,-0.160219,0.0758207,12936.8,97.6441)">
|
||||
<path d="M139.622,117L149,142L130.244,142L139.622,117Z" style="fill:url(#_Linear6);"/>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(4.96737,-1.14029,1.331,4.25561,-5928.43,-2257.12)">
|
||||
<circle cx="1496" cy="1004" r="7" style="fill:white;"/>
|
||||
</g>
|
||||
<g transform="matrix(4.96737,-1.14029,1.331,4.25561,-5884.5,-2116.69)">
|
||||
<circle cx="1496" cy="1004" r="7" style="fill:white;"/>
|
||||
</g>
|
||||
<g transform="matrix(4.96737,-1.14029,1.331,4.25561,-5855.22,-2023.06)">
|
||||
<circle cx="1496" cy="1004" r="7" style="fill:white;"/>
|
||||
</g>
|
||||
<g transform="matrix(4.96737,-1.14029,1.331,4.25561,-6234.47,-2112.14)">
|
||||
<circle cx="1496" cy="1004" r="7" style="fill:white;"/>
|
||||
</g>
|
||||
<g transform="matrix(4.96737,-1.14029,1.331,4.25561,-5957.71,-2350.75)">
|
||||
<circle cx="1496" cy="1004" r="7" style="fill:white;"/>
|
||||
</g>
|
||||
<g transform="matrix(4.96737,-1.14029,1.16463,3.72366,-5477.99,-831.33)">
|
||||
<path d="M1499.26,757.787C1499.26,757.787 1497.37,756.489 1497,755.2C1496.71,754.182 1496.57,750.662 1496.54,750C1496.41,747.303 1499.21,745.644 1499.21,745.644L1490.01,745.835C1490.01,745.835 1493.15,745.713 1493.46,750C1493.51,750.661 1493.23,753.476 1493,755.2C1492.91,756.447 1491.2,757.668 1491.2,757.668L1499.26,757.787Z" style="fill:white;"/>
|
||||
</g>
|
||||
<g transform="matrix(4.96737,-1.14029,1.16463,3.72366,-5404.79,-597.271)">
|
||||
<path d="M1495,760L1495,744" style="fill:none;"/>
|
||||
</g>
|
||||
<g transform="matrix(4.96737,-1.14029,1.16463,3.72366,-5404.79,-597.271)">
|
||||
<path d="M1498.27,757.077C1498.27,757.077 1496.71,756.46 1496.65,754.8C1496.65,753.658 1496.64,753.281 1496.65,752.016C1496.62,751.334 1496.59,750.608 1496.65,749.949C1496.78,746.836 1498.5,746.156 1498.5,746.156L1491.46,745.931C1491.46,745.931 1493.37,746.719 1493.65,749.83C1493.71,750.489 1493.69,751.528 1493.65,752.209C1493.64,753.331 1493.64,753.413 1493.65,754.518C1493.68,756.334 1492.58,756.827 1492.58,756.827L1498.27,757.077Z" style="fill:white;"/>
|
||||
</g>
|
||||
<g transform="matrix(4.96737,-1.14029,1.16463,3.72366,-5770.62,-677.495)">
|
||||
<path d="M1496.17,759.473L1555.54,720.014" style="fill:none;"/>
|
||||
</g>
|
||||
<g transform="matrix(4.96737,-1.14029,1.16463,3.72366,-5770.62,-677.495)">
|
||||
<path d="M1500.86,762.056C1500.86,762.056 1499.86,760.4 1503.09,757.456C1504.91,755.797 1507.33,754.151 1509.98,752.255C1514.82,748.79 1520.68,744.94 1526.52,741.049C1531.45,737.766 1536.38,734.479 1540.82,731.68C1544.52,729.349 1547.85,727.296 1550.54,725.8C1551.07,725.506 1551.6,725.329 1552.05,725.029C1554.73,723.257 1556.85,724.968 1556.85,724.968L1552.23,716.282C1552.23,716.282 1551.99,719.454 1550,720.997C1549.57,721.333 1549.15,721.741 1548.67,722.12C1546.2,724.053 1542.99,726.344 1539.39,728.867C1535.06,731.898 1530.13,735.166 1525.19,738.438C1519.35,742.314 1513.52,746.234 1508.49,749.329C1505.74,751.023 1503.28,752.577 1501.13,753.598C1497.99,755.086 1495.28,753.617 1495.28,753.617L1500.86,762.056Z" style="fill:white;"/>
|
||||
</g>
|
||||
<g transform="matrix(4.96737,-1.14029,-1.16463,-3.72366,-3997,4993.28)">
|
||||
<path d="M1496.17,759.473L1555.54,720.014" style="fill:none;"/>
|
||||
</g>
|
||||
<g transform="matrix(4.96737,-1.14029,-1.16463,-3.72366,-3997,4993.28)">
|
||||
<path d="M1496.1,754.362C1496.1,754.362 1497.2,755.607 1501.13,753.598C1503.25,752.509 1505.74,751.023 1508.49,749.329C1513.52,746.234 1519.35,742.314 1525.19,738.438C1530.13,735.166 1534.94,731.832 1539.27,728.802C1542.87,726.279 1549.36,722.059 1549.81,721.75C1552.75,719.73 1552.18,718.196 1552.18,718.196L1555.28,724.152C1555.28,724.152 1553.77,722.905 1551.37,724.681C1550.93,725.006 1544.52,729.349 1540.82,731.68C1536.38,734.479 1531.45,737.766 1526.52,741.049C1520.68,744.94 1514.82,748.79 1509.98,752.255C1507.33,754.151 1504.89,755.771 1503.09,757.456C1499.47,760.841 1501.26,763.283 1501.26,763.283L1496.1,754.362Z" style="fill:white;"/>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-41.5984,155.247,-155.247,-41.5984,201.516,76.8392)"><stop offset="0" style="stop-color:rgb(255,143,0);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(254,0,255);stop-opacity:1"/></linearGradient>
|
||||
<linearGradient id="_Linear2" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(155.247,-41.5984,41.5984,155.247,110.08,195.509)"><stop offset="0" style="stop-color:rgb(255,143,0);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(254,0,255);stop-opacity:1"/></linearGradient>
|
||||
<linearGradient id="_Linear3" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-113.649,-113.649,113.649,-113.649,258.31,215.618)"><stop offset="0" style="stop-color:rgb(255,143,0);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(254,0,255);stop-opacity:1"/></linearGradient>
|
||||
<linearGradient id="_Linear4" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-155.247,41.5984,-41.5984,-155.247,220.914,144.546)"><stop offset="0" style="stop-color:rgb(255,143,0);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(254,0,255);stop-opacity:1"/></linearGradient>
|
||||
<linearGradient id="_Linear5" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-113.649,113.649,113.649,113.649,206.837,124.661)"><stop offset="0" style="stop-color:rgb(255,143,0);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(254,0,255);stop-opacity:1"/></linearGradient>
|
||||
<linearGradient id="_Linear6" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-41.5984,-155.247,-155.247,41.5984,152.054,262.8)"><stop offset="0" style="stop-color:rgb(255,143,0);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(254,0,255);stop-opacity:1"/></linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.1 KiB |
@@ -14,7 +14,6 @@ import 'package:ente_auth/models/key_gen_result.dart';
|
||||
import 'package:ente_auth/models/private_key_attributes.dart';
|
||||
import 'package:ente_auth/store/authenticator_db.dart';
|
||||
import 'package:ente_auth/utils/directory_utils.dart';
|
||||
import 'package:ente_auth/utils/lock_screen_settings.dart';
|
||||
import 'package:ente_crypto_dart/ente_crypto_dart.dart';
|
||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
@@ -33,7 +32,6 @@ class Configuration {
|
||||
static const emailKey = "email";
|
||||
static const keyAttributesKey = "key_attributes";
|
||||
|
||||
static const keyShouldShowLockScreen = "should_show_lock_screen";
|
||||
static const lastTempFolderClearTimeKey = "last_temp_folder_clear_time";
|
||||
static const keyKey = "key";
|
||||
static const secretKeyKey = "secret_key";
|
||||
@@ -133,7 +131,6 @@ class Configuration {
|
||||
key: key,
|
||||
);
|
||||
}
|
||||
await LockScreenSettings.instance.removePinAndPassword();
|
||||
await AuthenticatorDB.instance.clearTable();
|
||||
_key = null;
|
||||
_cachedToken = null;
|
||||
@@ -468,24 +465,6 @@ class Configuration {
|
||||
await _preferences.setBool(hasOptedForOfflineModeKey, true);
|
||||
}
|
||||
|
||||
Future<bool> shouldShowLockScreen() async {
|
||||
final bool isPin = await LockScreenSettings.instance.isPinSet();
|
||||
final bool isPass = await LockScreenSettings.instance.isPasswordSet();
|
||||
return isPin || isPass || shouldShowSystemLockScreen();
|
||||
}
|
||||
|
||||
bool shouldShowSystemLockScreen() {
|
||||
if (_preferences.containsKey(keyShouldShowLockScreen)) {
|
||||
return _preferences.getBool(keyShouldShowLockScreen)!;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> setSystemLockScreen(bool value) {
|
||||
return _preferences.setBool(keyShouldShowLockScreen, value);
|
||||
}
|
||||
|
||||
void setVolatilePassword(String volatilePassword) {
|
||||
_volatilePassword = volatilePassword;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
},
|
||||
"onBoardingBody": "Бяспечна зрабіць рэзервовую копію кодаў 2ФА",
|
||||
"onBoardingGetStarted": "Пачаць",
|
||||
"setupFirstAccount": "Наладзіць ваш першы ўліковы запіс",
|
||||
"setupFirstAccount": "Наладзіць свой першы ўліковы запіс",
|
||||
"importScanQrCode": "Сканіраваць код QR-код",
|
||||
"qrCode": "QR-код",
|
||||
"importEnterSetupKey": "Увесці ключ наладжвання",
|
||||
@@ -45,19 +45,38 @@
|
||||
"timeBasedKeyType": "Заснаваныя на часе (TOTP)",
|
||||
"counterBasedKeyType": "Заснаваныя на лічыльніку (HOTP)",
|
||||
"saveAction": "Захаваць",
|
||||
"nextTotpTitle": "наступны",
|
||||
"nextTotpTitle": "далей",
|
||||
"deleteCodeTitle": "Выдаліць код?",
|
||||
"deleteCodeMessage": "Вы сапраўды хочаце выдаліць гэты код? Гэта дзеянне з'яўляецца незваротным.",
|
||||
"trashCode": "Выдаліць код?",
|
||||
"trashCodeMessage": "Вы сапраўды хочаце выдаліць код для {account}?",
|
||||
"trash": "Сметніца",
|
||||
"viewLogsAction": "Паглядзець журнал",
|
||||
"preparingLogsTitle": "Падрыхтоўка журнала...",
|
||||
"viewLogsAction": "Паглядзець журналы",
|
||||
"preparingLogsTitle": "Падрыхтоўка журналаў...",
|
||||
"emailLogsTitle": "Адправіць журнал па электроннай пошце",
|
||||
"exportLogsAction": "Экспартаваць журнал",
|
||||
"reportABug": "Паведаміць пра памылку",
|
||||
"reportBug": "Паведаміць пра памылку",
|
||||
"emailLogsMessage": "Адпраўце журналы на {email}",
|
||||
"@emailLogsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"copyEmailAction": "Скапіяваць электронную пошту",
|
||||
"exportLogsAction": "Экспартаваць журналы",
|
||||
"reportABug": "Паведаміць аб памылцы",
|
||||
"crashAndErrorReporting": "Справаздачы аб збоях і памылках",
|
||||
"reportBug": "Паведаміць аб памылцы",
|
||||
"emailUsMessage": "Адпраўце нам ліст на {email}",
|
||||
"@emailUsMessage": {
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"contactSupport": "Звярнуцца ў службу падтрымкі",
|
||||
"rateUsOnStore": "Ацаніць нас у {storeName}",
|
||||
"blog": "Блог",
|
||||
"verifyPassword": "Праверыць пароль",
|
||||
"pleaseWait": "Пачакайце...",
|
||||
@@ -66,32 +85,184 @@
|
||||
"useRecoveryKey": "Выкарыстоўваць ключ аднаўлення",
|
||||
"incorrectPasswordTitle": "Няправільны пароль",
|
||||
"welcomeBack": "З вяртаннем!",
|
||||
"changeEmail": "Змяніць адрас электроннай пошты",
|
||||
"changePassword": "Змяніць пароль",
|
||||
"data": "Даныя",
|
||||
"importCodes": "Імпартаваць коды",
|
||||
"importTypePlainText": "Звычайны тэкст",
|
||||
"importTypeEnteEncrypted": "Шыфраванне экспартавання з Ente",
|
||||
"passwordForDecryptingExport": "Пароль для дэшыфроўкі экспартавання",
|
||||
"passwordEmptyError": "Пароль не можа быць пустым",
|
||||
"importFromApp": "Імпартаваць коды з {appName}",
|
||||
"exportCodes": "Экспартаваць коды",
|
||||
"importLabel": "Імпарт",
|
||||
"selectFile": "Выбраць файл",
|
||||
"ok": "OK",
|
||||
"cancel": "Скасаваць",
|
||||
"yes": "Так",
|
||||
"no": "Не",
|
||||
"email": "Электронная пошта",
|
||||
"support": "Падтрымка",
|
||||
"general": "Агульныя",
|
||||
"settings": "Налады",
|
||||
"copied": "Скапіявана",
|
||||
"pleaseTryAgain": "Калі ласка, паспрабуйце яшчэ раз",
|
||||
"existingUser": "Існуючы карыстальнік",
|
||||
"newUser": "Навічок у Ente",
|
||||
"delete": "Выдаліць",
|
||||
"enterYourPasswordHint": "Увядзіце ваш пароль",
|
||||
"forgotPassword": "Забылі пароль",
|
||||
"oops": "Вой",
|
||||
"faq": "Частыя пытанні",
|
||||
"leaveFamily": "Пакінуць сямейны план",
|
||||
"scan": "Сканіраваць",
|
||||
"scanACode": "Сканіраваць код",
|
||||
"verify": "Праверыць",
|
||||
"verifyEmail": "Праверыць электронную пошту",
|
||||
"lostDeviceTitle": "Згубілі прыладу?",
|
||||
"verifyPasskey": "Праверыць ключ доступу",
|
||||
"loginWithTOTP": "Увайсці з TOTP",
|
||||
"recoverAccount": "Аднавіць уліковы запіс",
|
||||
"recover": "Аднавіць",
|
||||
"invalidQRCode": "Памылковы QR-код",
|
||||
"deleteAccount": "Выдаліць уліковы запіс",
|
||||
"noDeleteAccountAction": "Не, выдаліць уліковы запіс",
|
||||
"sendEmail": "Адправіць ліст",
|
||||
"createNewAccount": "Стварыць новы ўліковы запіс",
|
||||
"weakStrength": "Ненадзейны",
|
||||
"strongStrength": "Надзейны",
|
||||
"moderateStrength": "Умераная",
|
||||
"confirmPassword": "Пацвердзіць пароль",
|
||||
"close": "Закрыць",
|
||||
"oopsSomethingWentWrong": "Штосьці пайшло не так.",
|
||||
"selectLanguage": "Выберыце мову",
|
||||
"language": "Мова",
|
||||
"social": "Сацыяльныя сеткі",
|
||||
"security": "Бяспека",
|
||||
"lockscreen": "Экран блакіроўкі",
|
||||
"searchHint": "Пошук...",
|
||||
"search": "Пошук"
|
||||
"search": "Пошук",
|
||||
"noResult": "Няма вынікаў",
|
||||
"addCode": "Дадаць код",
|
||||
"scanAQrCode": "Сканіраваць QR-код",
|
||||
"edit": "Рэдагаваць",
|
||||
"share": "Абагуліць",
|
||||
"shareCodes": "Абагуліць коды",
|
||||
"restore": "Аднавіць",
|
||||
"error": "Памылка",
|
||||
"doThisLater": "Зрабіць гэта пазней",
|
||||
"saveKey": "Захаваць ключ",
|
||||
"save": "Захаваць",
|
||||
"send": "Адправіць",
|
||||
"back": "Назад",
|
||||
"createAccount": "Стварыць уліковы запіс",
|
||||
"password": "Пароль",
|
||||
"privacyPolicyTitle": "Палітыка прыватнасці",
|
||||
"termsOfServicesTitle": "Умовы",
|
||||
"encryption": "Шыфраванне",
|
||||
"setPasswordTitle": "Задаць пароль",
|
||||
"changePasswordTitle": "Змяніць пароль",
|
||||
"resetPasswordTitle": "Скінуць пароль",
|
||||
"encryptionKeys": "Ключы шыфравання",
|
||||
"continueLabel": "Працягнуць",
|
||||
"insecureDevice": "Небяспечная прылада",
|
||||
"howItWorks": "Як гэта працуе",
|
||||
"logInLabel": "Увайсці",
|
||||
"logout": "Выйсці",
|
||||
"yesLogout": "Так, выйсці",
|
||||
"exit": "Выхад",
|
||||
"theme": "Тема",
|
||||
"lightTheme": "Светлая",
|
||||
"darkTheme": "Цёмная",
|
||||
"systemTheme": "Сістэманая",
|
||||
"invalidKey": "Памылковы ключ",
|
||||
"tryAgain": "Паспрабуйце яшчэ раз",
|
||||
"confirm": "Пацвердзіць",
|
||||
"emailYourLogs": "Адправіць журналы",
|
||||
"exportLogs": "Экспартаваць журналы",
|
||||
"about": "Аб праграме",
|
||||
"privacy": "Прыватнасць",
|
||||
"terms": "Умовы",
|
||||
"checkStatus": "Праверыць статус",
|
||||
"downloadUpdate": "Спампаваць",
|
||||
"update": "Абнавіць",
|
||||
"checking": "Праверка...",
|
||||
"warning": "Папярэджанне",
|
||||
"iUnderStand": "Ясна",
|
||||
"@iUnderStand": {
|
||||
"description": "Text for the button to confirm the user understands the warning"
|
||||
},
|
||||
"importSuccessTitle": "Ура!",
|
||||
"sorry": "Прабачце",
|
||||
"pendingSyncs": "Папярэджанне",
|
||||
"resendEmail": "Адправіць ліст яшчэ раз",
|
||||
"manualSort": "Карыстальніцкая",
|
||||
"editOrder": "Рэдагаваць заказ",
|
||||
"mostFrequentlyUsed": "Часта выкарыстоўваюцца",
|
||||
"mostRecentlyUsed": "Нядаўна выкарыстаныя",
|
||||
"activeSessions": "Актыўныя сеансы",
|
||||
"terminate": "Перарваць",
|
||||
"thisDevice": "Гэта прылада",
|
||||
"incorrectCode": "Няправільны код",
|
||||
"enterPassword": "Увядзіце пароль",
|
||||
"encrypted": "Зашыфравана",
|
||||
"plainText": "Звычайны тэкст",
|
||||
"export": "Экспартаваць",
|
||||
"singIn": "Увайсці",
|
||||
"compactMode": "Кампактны рэжым",
|
||||
"shouldHideCode": "Схаваць коды",
|
||||
"androidBiometricHint": "Праверыць ідэнтыфікацыю",
|
||||
"@androidBiometricHint": {
|
||||
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidBiometricSuccess": "Паспяхова",
|
||||
"@androidBiometricSuccess": {
|
||||
"description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters."
|
||||
},
|
||||
"androidCancelButton": "Скасаваць",
|
||||
"@androidCancelButton": {
|
||||
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters."
|
||||
},
|
||||
"goToSettings": "Перайсці ў налады",
|
||||
"@goToSettings": {
|
||||
"description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters."
|
||||
},
|
||||
"iOSOkButton": "OK",
|
||||
"@iOSOkButton": {
|
||||
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters."
|
||||
},
|
||||
"doNotSignOut": "Не выходзіць",
|
||||
"passkey": "Ключ доступу",
|
||||
"loginSessionExpired": "Сеанс завяршыўся",
|
||||
"pinText": "Замацаваць",
|
||||
"unpinText": "Адмацаваць",
|
||||
"pinned": "Замацавана",
|
||||
"tags": "Тэгі",
|
||||
"createNewTag": "Стварыць новы тэг",
|
||||
"tag": "Тэг",
|
||||
"create": "Стварыць",
|
||||
"editTag": "Рэдагаванне тэг",
|
||||
"deleteTagTitle": "Выдаліць тэг?",
|
||||
"viewRawCodes": "Паглядзець неапрацаваныя коды",
|
||||
"rawCodes": "Неапрацаваныя коды",
|
||||
"rawCodeData": "Неапрацаваныя даныя кода",
|
||||
"appLock": "Блакіроўка праграмы",
|
||||
"autoLock": "Аўтаблакіроўка",
|
||||
"immediately": "Адразу",
|
||||
"reEnterPin": "Увядзіце PIN-код яшчэ раз",
|
||||
"next": "Далей",
|
||||
"tapToUnlock": "Націсніце для разблакіроўкі",
|
||||
"deviceLock": "Блакіроўка прылады",
|
||||
"hideContent": "Схаваць змест",
|
||||
"pinLock": "Блакіроўка PIN'ам",
|
||||
"enterPin": "Увядзіце PIN-код",
|
||||
"setNewPin": "Задаць новы PIN",
|
||||
"deselectAll": "Зняць выбар з усіх",
|
||||
"selectAll": "Выбраць усе",
|
||||
"plainHTML": "Звычайны HTML",
|
||||
"advanced": "Пашыраныя",
|
||||
"algorithm": "Алгарытм",
|
||||
"type": "Тып",
|
||||
"period": "Перыяд",
|
||||
"digits": "Лічбы"
|
||||
}
|
||||
1
auth/lib/l10n/arb/app_ku.arb
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -173,6 +173,7 @@
|
||||
"invalidQRCode": "Ogiltig QR-kod",
|
||||
"noRecoveryKeyTitle": "Ingen återställningsnyckel?",
|
||||
"enterEmailHint": "Ange din e-postadress",
|
||||
"enterNewEmailHint": "Ange din nya e-postadress",
|
||||
"invalidEmailTitle": "Ogiltig e-postadress",
|
||||
"invalidEmailMessage": "Ange en giltig e-postadress.",
|
||||
"deleteAccount": "Radera konto",
|
||||
@@ -368,16 +369,19 @@
|
||||
"signInToBackup": "Logga in för att säkerhetskopiera dina koder",
|
||||
"singIn": "Logga in",
|
||||
"sigInBackupReminder": "Vänligen exportera dina koder för att säkerställa att du har en säkerhetskopia som du kan återställa från.",
|
||||
"offlineModeWarning": "Du har valt att fortsätta utan säkerhetskopior. Vänligen ta manuella säkerhetskopior för att se till att dina koder är säkra.",
|
||||
"showLargeIcons": "Visa stora ikoner",
|
||||
"compactMode": "Kompakt läge",
|
||||
"shouldHideCode": "Dölj koder",
|
||||
"doubleTapToViewHiddenCode": "Du kan dubbeltrycka på en post för att visa koden",
|
||||
"focusOnSearchBar": "Fokusera på sök vid appstart",
|
||||
"confirmUpdatingkey": "Är du säker på att du vill uppdatera den hemliga nyckeln?",
|
||||
"minimizeAppOnCopy": "Minimera appen vid kopiering",
|
||||
"editCodeAuthMessage": "Autentisera för att redigera kod",
|
||||
"deleteCodeAuthMessage": "Autentisera för att radera kod",
|
||||
"showQRAuthMessage": "Autentisera för att visa QR-kod",
|
||||
"confirmAccountDeleteTitle": "Bekräfta radering av kontot",
|
||||
"confirmAccountDeleteMessage": "Detta konto är kopplat till andra Ente apps, om du använder någon.\n\nDina uppladdade data, över alla Ente appar, kommer att schemaläggas för radering och ditt konto kommer att raderas permanent.",
|
||||
"androidBiometricHint": "Verifiera identitet",
|
||||
"@androidBiometricHint": {
|
||||
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
|
||||
@@ -414,6 +418,18 @@
|
||||
"@goToSettings": {
|
||||
"description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters."
|
||||
},
|
||||
"androidGoToSettingsDescription": "Biometrisk autentisering är inte konfigurerad på din enhet. Gå till \"Inställningar > Säkerhet\" för att lägga till biometrisk autentisering.",
|
||||
"@androidGoToSettingsDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure biometric on their device. It shows in a dialog on Android side."
|
||||
},
|
||||
"iOSLockOut": "Biometrisk autentisering är inaktiverat. Lås och lås upp din skärm för att aktivera den.",
|
||||
"@iOSLockOut": {
|
||||
"description": "Message advising the user to re-enable biometrics on their device. It shows in a dialog on iOS side."
|
||||
},
|
||||
"iOSGoToSettingsDescription": "Biometrisk autentisering är inte konfigurerad på din enhet. Aktivera antingen Touch ID eller Face ID på din telefon.",
|
||||
"@iOSGoToSettingsDescription": {
|
||||
"description": "Message advising the user to go to the settings and configure Biometrics for their device. It shows in a dialog on iOS side."
|
||||
},
|
||||
"iOSOkButton": "OK",
|
||||
"@iOSOkButton": {
|
||||
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters."
|
||||
@@ -421,6 +437,7 @@
|
||||
"noInternetConnection": "Ingen internetanslutning",
|
||||
"pleaseCheckYourInternetConnectionAndTryAgain": "Kontrollera din internetanslutning och försök igen.",
|
||||
"signOutFromOtherDevices": "Logga ut från andra enheter",
|
||||
"signOutOtherBody": "Om du tror att någon kanske känner till ditt lösenord kan du tvinga alla andra enheter med ditt konto att logga ut.",
|
||||
"signOutOtherDevices": "Logga ut andra enheter",
|
||||
"doNotSignOut": "Logga inte ut",
|
||||
"hearUsWhereTitle": "Hur hörde du talas om Ente? (valfritt)",
|
||||
@@ -450,6 +467,7 @@
|
||||
"create": "Skapa",
|
||||
"editTag": "Redigera tagg",
|
||||
"deleteTagTitle": "Radera tagg?",
|
||||
"deleteTagMessage": "Vill du ta bort den här koden? Det går inte att ångra den här åtgärden.",
|
||||
"somethingWentWrongParsingCode": "Vi kunde inte tolka {x} koder.",
|
||||
"updateNotAvailable": "Uppdateringen är inte tillgänglig",
|
||||
"viewRawCodes": "Visa råa koder",
|
||||
|
||||
@@ -173,6 +173,7 @@
|
||||
"invalidQRCode": "QR 碼無效",
|
||||
"noRecoveryKeyTitle": "沒有復原密鑰嗎?",
|
||||
"enterEmailHint": "請輸入您的電子郵件地址",
|
||||
"enterNewEmailHint": "輸入你的新電子郵件地址",
|
||||
"invalidEmailTitle": "無效的電子郵件地址",
|
||||
"invalidEmailMessage": "請輸入一個有效的電子郵件地址。",
|
||||
"deleteAccount": "刪除帳戶",
|
||||
|
||||
@@ -14,7 +14,6 @@ import 'package:ente_auth/services/billing_service.dart';
|
||||
import 'package:ente_auth/services/notification_service.dart';
|
||||
import 'package:ente_auth/services/preference_service.dart';
|
||||
import 'package:ente_auth/services/update_service.dart';
|
||||
import 'package:ente_auth/services/user_remote_flag_service.dart';
|
||||
import 'package:ente_auth/services/user_service.dart';
|
||||
import 'package:ente_auth/services/window_listener_service.dart';
|
||||
import 'package:ente_auth/store/code_display_store.dart';
|
||||
@@ -87,19 +86,6 @@ void main() async {
|
||||
}
|
||||
}
|
||||
|
||||
// Future<void> whiteListLetsEncryptRootCA() async {
|
||||
// try {
|
||||
// // https://stackoverflow.com/a/71090239
|
||||
// // https://github.com/ente-io/ente/issues/2178
|
||||
// ByteData data =
|
||||
// await PlatformAssetBundle().load('assets/ca/lets-encrypt-r3.pem');
|
||||
// SecurityContext.defaultContext
|
||||
// .setTrustedCertificatesBytes(data.buffer.asUint8List());
|
||||
// } catch (e) {
|
||||
// _logger.severe("Failed to whitelist Let's Encrypt Root CA", e);
|
||||
// }
|
||||
// }
|
||||
|
||||
Future<void> _runInForeground() async {
|
||||
final savedThemeMode = _themeMode(await AdaptiveTheme.getThemeMode());
|
||||
return await _runWithLogs(() async {
|
||||
@@ -116,7 +102,7 @@ Future<void> _runInForeground() async {
|
||||
AppLock(
|
||||
builder: (args) => App(locale: locale),
|
||||
lockScreen: const LockScreen(),
|
||||
enabled: await Configuration.instance.shouldShowLockScreen(),
|
||||
enabled: await LockScreenSettings.instance.shouldShowLockScreen(),
|
||||
locale: locale,
|
||||
lightTheme: lightThemeData,
|
||||
darkTheme: darkThemeData,
|
||||
@@ -169,7 +155,6 @@ Future<void> _init(bool bool, {String? via}) async {
|
||||
await Configuration.instance.init();
|
||||
await Network.instance.init();
|
||||
await UserService.instance.init();
|
||||
await UserRemoteFlagService.instance.init();
|
||||
await AuthenticatorService.instance.init();
|
||||
await BillingService.instance.init();
|
||||
await NotificationService.instance.init();
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:ente_auth/core/configuration.dart';
|
||||
import 'package:ente_auth/ui/settings/lock_screen/lock_screen_password.dart';
|
||||
import 'package:ente_auth/ui/settings/lock_screen/lock_screen_pin.dart';
|
||||
import 'package:ente_auth/ui/tools/app_lock.dart';
|
||||
@@ -42,7 +41,7 @@ class LocalAuthenticationService {
|
||||
isAuthenticatingForInAppChange: true,
|
||||
);
|
||||
AppLock.of(context)!.setEnabled(
|
||||
await Configuration.instance.shouldShowLockScreen(),
|
||||
await LockScreenSettings.instance.shouldShowLockScreen(),
|
||||
);
|
||||
if (!result) {
|
||||
showToast(context, infoMessage);
|
||||
@@ -114,12 +113,13 @@ class LocalAuthenticationService {
|
||||
);
|
||||
if (result) {
|
||||
AppLock.of(context)!.setEnabled(shouldEnableLockScreen);
|
||||
await Configuration.instance
|
||||
await LockScreenSettings.instance
|
||||
.setSystemLockScreen(shouldEnableLockScreen);
|
||||
return true;
|
||||
} else {
|
||||
AppLock.of(context)!
|
||||
.setEnabled(await Configuration.instance.shouldShowLockScreen());
|
||||
AppLock.of(context)!.setEnabled(
|
||||
await LockScreenSettings.instance.shouldShowLockScreen(),
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// ignore: unawaited_futures
|
||||
|
||||
@@ -1,141 +0,0 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:ente_auth/core/configuration.dart';
|
||||
import 'package:ente_auth/core/event_bus.dart';
|
||||
import 'package:ente_auth/core/network.dart';
|
||||
import 'package:ente_auth/events/notification_event.dart';
|
||||
import 'package:ente_auth/services/user_service.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
class UserRemoteFlagService {
|
||||
final _dio = Network.instance.getDio();
|
||||
final _logger = Logger((UserRemoteFlagService).toString());
|
||||
final _config = Configuration.instance;
|
||||
late SharedPreferences _prefs;
|
||||
|
||||
UserRemoteFlagService._privateConstructor();
|
||||
|
||||
static final UserRemoteFlagService instance =
|
||||
UserRemoteFlagService._privateConstructor();
|
||||
|
||||
static const String recoveryVerificationFlag = "recoveryKeyVerified";
|
||||
static const String needRecoveryKeyVerification =
|
||||
"needRecoveryKeyVerification";
|
||||
|
||||
Future<void> init() async {
|
||||
_prefs = await SharedPreferences.getInstance();
|
||||
}
|
||||
|
||||
bool shouldShowRecoveryVerification() {
|
||||
if (!_prefs.containsKey(needRecoveryKeyVerification)) {
|
||||
// fetch the status from remote
|
||||
unawaited(_refreshRecoveryVerificationFlag());
|
||||
return false;
|
||||
} else {
|
||||
final bool shouldShow = _prefs.getBool(needRecoveryKeyVerification)!;
|
||||
if (shouldShow) {
|
||||
// refresh the status to check if user marked it as done on another device
|
||||
unawaited(_refreshRecoveryVerificationFlag());
|
||||
}
|
||||
return shouldShow;
|
||||
}
|
||||
}
|
||||
|
||||
// markRecoveryVerificationAsDone is used to track if user has verified their
|
||||
// recovery key in the past or not. This helps in avoid showing the same
|
||||
// prompt to the user on re-install or signing into a different device
|
||||
Future<void> markRecoveryVerificationAsDone() async {
|
||||
await _updateKeyValue(recoveryVerificationFlag, true.toString());
|
||||
await _prefs.setBool(needRecoveryKeyVerification, false);
|
||||
}
|
||||
|
||||
Future<void> _refreshRecoveryVerificationFlag() async {
|
||||
_logger.finest('refresh recovery key verification flag');
|
||||
final remoteStatusValue =
|
||||
await _getValue(recoveryVerificationFlag, "false");
|
||||
final bool isNeedVerificationFlagSet =
|
||||
_prefs.containsKey(needRecoveryKeyVerification);
|
||||
if (remoteStatusValue.toLowerCase() == "true") {
|
||||
await _prefs.setBool(needRecoveryKeyVerification, false);
|
||||
// If the user verified on different device, then we should refresh
|
||||
// the UI to dismiss the Notification.
|
||||
if (isNeedVerificationFlagSet) {
|
||||
Bus.instance.fire(NotificationEvent());
|
||||
}
|
||||
} else if (!isNeedVerificationFlagSet) {
|
||||
// Verification is not done yet as remoteStatus is false and local flag to
|
||||
// show notification isn't set. Set the flag to true if any active
|
||||
// session is older than 1 day.
|
||||
final activeSessions = await UserService.instance.getActiveSessions();
|
||||
final int microSecondsInADay = const Duration(days: 1).inMicroseconds;
|
||||
final bool anyActiveSessionOlderThanADay =
|
||||
activeSessions.sessions.firstWhereOrNull(
|
||||
(e) =>
|
||||
(e.creationTime + microSecondsInADay) <
|
||||
DateTime.now().microsecondsSinceEpoch,
|
||||
) !=
|
||||
null;
|
||||
if (anyActiveSessionOlderThanADay) {
|
||||
await _prefs.setBool(needRecoveryKeyVerification, true);
|
||||
Bus.instance.fire(NotificationEvent());
|
||||
} else {
|
||||
// continue defaulting to no verification prompt
|
||||
_logger.finest('No active session older than 1 day');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Future<String> _getValue(String key, String? defaultValue) async {
|
||||
try {
|
||||
final Map<String, dynamic> queryParams = {"key": key};
|
||||
if (defaultValue != null) {
|
||||
queryParams["defaultValue"] = defaultValue;
|
||||
}
|
||||
final response = await _dio.get(
|
||||
"${_config.getHttpEndpoint()}/remote-store",
|
||||
queryParameters: queryParams,
|
||||
options: Options(
|
||||
headers: {
|
||||
"X-Auth-Token": _config.getToken(),
|
||||
},
|
||||
),
|
||||
);
|
||||
if (response.statusCode != HttpStatus.ok) {
|
||||
throw Exception("Unexpected status code ${response.statusCode}");
|
||||
}
|
||||
return response.data["value"];
|
||||
} catch (e) {
|
||||
_logger.info("Error while fetching bool status for $key", e);
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
// _setBooleanFlag sets the corresponding flag on remote
|
||||
// to mark recovery as completed
|
||||
Future<void> _updateKeyValue(String key, String value) async {
|
||||
try {
|
||||
final response = await _dio.post(
|
||||
"${_config.getHttpEndpoint()}/remote-store/update",
|
||||
data: {
|
||||
"key": key,
|
||||
"value": value,
|
||||
},
|
||||
options: Options(
|
||||
headers: {
|
||||
"X-Auth-Token": _config.getToken(),
|
||||
},
|
||||
),
|
||||
);
|
||||
if (response.statusCode != HttpStatus.ok) {
|
||||
throw Exception("Unexpected state");
|
||||
}
|
||||
} catch (e) {
|
||||
_logger.warning("Failed to set flag for $key", e);
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,219 +0,0 @@
|
||||
import 'package:bip39/bip39.dart' as bip39;
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:ente_auth/core/configuration.dart';
|
||||
import 'package:ente_auth/ente_theme_data.dart';
|
||||
import 'package:ente_auth/l10n/l10n.dart';
|
||||
import 'package:ente_auth/services/local_authentication_service.dart';
|
||||
import 'package:ente_auth/services/user_remote_flag_service.dart';
|
||||
import 'package:ente_auth/ui/account/recovery_key_page.dart';
|
||||
import 'package:ente_auth/ui/common/gradient_button.dart';
|
||||
import 'package:ente_auth/ui/components/buttons/button_widget.dart';
|
||||
import 'package:ente_auth/utils/dialog_util.dart';
|
||||
import 'package:ente_auth/utils/navigation_util.dart';
|
||||
import 'package:ente_auth/utils/platform_util.dart';
|
||||
import 'package:ente_crypto_dart/ente_crypto_dart.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
|
||||
class VerifyRecoveryPage extends StatefulWidget {
|
||||
const VerifyRecoveryPage({super.key});
|
||||
|
||||
@override
|
||||
State<VerifyRecoveryPage> createState() => _VerifyRecoveryPageState();
|
||||
}
|
||||
|
||||
class _VerifyRecoveryPageState extends State<VerifyRecoveryPage> {
|
||||
final _recoveryKey = TextEditingController();
|
||||
final Logger _logger = Logger((_VerifyRecoveryPageState).toString());
|
||||
|
||||
void _verifyRecoveryKey() async {
|
||||
final dialog =
|
||||
createProgressDialog(context, context.l10n.verifyingRecoveryKey);
|
||||
await dialog.show();
|
||||
try {
|
||||
final String inputKey = _recoveryKey.text.trim();
|
||||
final String recoveryKey =
|
||||
CryptoUtil.bin2hex(Configuration.instance.getRecoveryKey());
|
||||
final String recoveryKeyWords = bip39.entropyToMnemonic(recoveryKey);
|
||||
if (inputKey == recoveryKey || inputKey == recoveryKeyWords) {
|
||||
try {
|
||||
await UserRemoteFlagService.instance.markRecoveryVerificationAsDone();
|
||||
} catch (e) {
|
||||
await dialog.hide();
|
||||
if (e is DioException && e.type == DioExceptionType.unknown) {
|
||||
await showErrorDialog(
|
||||
context,
|
||||
"No internet connection",
|
||||
"Please check your internet connection and try again.",
|
||||
);
|
||||
} else {
|
||||
await showGenericErrorDialog(
|
||||
context: context,
|
||||
error: e,
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
await dialog.hide();
|
||||
// todo: change this as per figma once the component is ready
|
||||
await showErrorDialog(
|
||||
context,
|
||||
context.l10n.recoveryKeyVerified,
|
||||
context.l10n.recoveryKeySuccessBody,
|
||||
);
|
||||
Navigator.of(context).pop();
|
||||
} else {
|
||||
throw Exception("recovery key didn't match");
|
||||
}
|
||||
} catch (e, s) {
|
||||
_logger.severe("failed to verify recovery key", e, s);
|
||||
await dialog.hide();
|
||||
final String errMessage = context.l10n.invalidRecoveryKey;
|
||||
final result = await showChoiceDialog(
|
||||
context,
|
||||
title: context.l10n.invalidKey,
|
||||
body: errMessage,
|
||||
firstButtonLabel: context.l10n.tryAgain,
|
||||
secondButtonLabel: context.l10n.viewRecoveryKey,
|
||||
secondButtonAction: ButtonAction.second,
|
||||
);
|
||||
if (result!.action == ButtonAction.second) {
|
||||
await _onViewRecoveryKeyClick();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _onViewRecoveryKeyClick() async {
|
||||
final hasAuthenticated =
|
||||
await LocalAuthenticationService.instance.requestLocalAuthentication(
|
||||
context,
|
||||
"Please authenticate to view your recovery key",
|
||||
);
|
||||
await PlatformUtil.refocusWindows();
|
||||
|
||||
if (hasAuthenticated) {
|
||||
String recoveryKey;
|
||||
try {
|
||||
recoveryKey =
|
||||
CryptoUtil.bin2hex(Configuration.instance.getRecoveryKey());
|
||||
await routeToPage(
|
||||
context,
|
||||
RecoveryKeyPage(
|
||||
recoveryKey,
|
||||
context.l10n.ok,
|
||||
showAppBar: true,
|
||||
onDone: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
);
|
||||
} catch (e) {
|
||||
// ignore: unawaited_futures
|
||||
showGenericErrorDialog(
|
||||
context: context,
|
||||
error: e,
|
||||
);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final enteTheme = Theme.of(context).colorScheme.enteTheme;
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
elevation: 0,
|
||||
leading: IconButton(
|
||||
icon: const Icon(Icons.arrow_back),
|
||||
color: Theme.of(context).iconTheme.color,
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
),
|
||||
body: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||
child: LayoutBuilder(
|
||||
builder: (context, constraints) {
|
||||
return SingleChildScrollView(
|
||||
child: ConstrainedBox(
|
||||
constraints: BoxConstraints(
|
||||
minWidth: constraints.maxWidth,
|
||||
minHeight: constraints.maxHeight,
|
||||
),
|
||||
child: IntrinsicHeight(
|
||||
child: Column(
|
||||
children: [
|
||||
const SizedBox(height: 12),
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
child: Text(
|
||||
context.l10n.confirmRecoveryKey,
|
||||
style: enteTheme.textTheme.h3Bold,
|
||||
textAlign: TextAlign.left,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 18),
|
||||
Text(
|
||||
context.l10n.recoveryKeyVerifyReason,
|
||||
style: enteTheme.textTheme.small
|
||||
.copyWith(color: enteTheme.colorScheme.textMuted),
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
TextFormField(
|
||||
decoration: InputDecoration(
|
||||
filled: true,
|
||||
hintText: context.l10n.enterYourRecoveryKey,
|
||||
contentPadding: const EdgeInsets.all(20),
|
||||
border: UnderlineInputBorder(
|
||||
borderSide: BorderSide.none,
|
||||
borderRadius: BorderRadius.circular(6),
|
||||
),
|
||||
),
|
||||
style: const TextStyle(
|
||||
fontSize: 14,
|
||||
fontFeatures: [FontFeature.tabularFigures()],
|
||||
),
|
||||
controller: _recoveryKey,
|
||||
autofocus: false,
|
||||
autocorrect: false,
|
||||
keyboardType: TextInputType.multiline,
|
||||
minLines: 4,
|
||||
maxLines: null,
|
||||
onChanged: (_) {
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
Expanded(
|
||||
child: Container(
|
||||
alignment: Alignment.bottomCenter,
|
||||
width: double.infinity,
|
||||
padding: const EdgeInsets.fromLTRB(0, 12, 0, 40),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
GradientButton(
|
||||
onTap: _verifyRecoveryKey,
|
||||
text: context.l10n.confirm,
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -319,7 +319,7 @@ class _HomePageState extends State<HomePage> {
|
||||
|
||||
Future<void> navigateToLockScreen() async {
|
||||
final bool shouldShowLockScreen =
|
||||
await Configuration.instance.shouldShowLockScreen();
|
||||
await LockScreenSettings.instance.shouldShowLockScreen();
|
||||
if (shouldShowLockScreen) {
|
||||
await AppLock.of(context)!.showLockScreen();
|
||||
} else {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import "dart:async";
|
||||
import "dart:io";
|
||||
|
||||
import "package:ente_auth/core/configuration.dart";
|
||||
import "package:ente_auth/l10n/l10n.dart";
|
||||
import "package:ente_auth/services/local_authentication_service.dart";
|
||||
import "package:ente_auth/theme/ente_theme.dart";
|
||||
@@ -31,8 +30,7 @@ class LockScreenOptions extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _LockScreenOptionsState extends State<LockScreenOptions> {
|
||||
final Configuration _configuration = Configuration.instance;
|
||||
final LockScreenSettings _lockscreenSetting = LockScreenSettings.instance;
|
||||
final LockScreenSettings _lockScreenSettings = LockScreenSettings.instance;
|
||||
late bool appLock = false;
|
||||
bool isPinEnabled = false;
|
||||
bool isPasswordEnabled = false;
|
||||
@@ -43,18 +41,18 @@ class _LockScreenOptionsState extends State<LockScreenOptions> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
hideAppContent = _lockscreenSetting.getShouldHideAppContent();
|
||||
autoLockTimeInMilliseconds = _lockscreenSetting.getAutoLockTime();
|
||||
hideAppContent = _lockScreenSettings.getShouldHideAppContent();
|
||||
autoLockTimeInMilliseconds = _lockScreenSettings.getAutoLockTime();
|
||||
_initializeSettings();
|
||||
appLock = _lockscreenSetting.getIsAppLockSet();
|
||||
appLock = _lockScreenSettings.getIsAppLockSet();
|
||||
}
|
||||
|
||||
Future<void> _initializeSettings() async {
|
||||
final bool passwordEnabled = await _lockscreenSetting.isPasswordSet();
|
||||
final bool pinEnabled = await _lockscreenSetting.isPinSet();
|
||||
final bool passwordEnabled = await _lockScreenSettings.isPasswordSet();
|
||||
final bool pinEnabled = await _lockScreenSettings.isPinSet();
|
||||
final bool shouldHideAppContent =
|
||||
_lockscreenSetting.getShouldHideAppContent();
|
||||
final bool systemLockEnabled = _configuration.shouldShowSystemLockScreen();
|
||||
_lockScreenSettings.getShouldHideAppContent();
|
||||
final bool systemLockEnabled = _lockScreenSettings.shouldShowSystemLockScreen();
|
||||
setState(() {
|
||||
isPasswordEnabled = passwordEnabled;
|
||||
isPinEnabled = pinEnabled;
|
||||
@@ -66,8 +64,8 @@ class _LockScreenOptionsState extends State<LockScreenOptions> {
|
||||
Future<void> _deviceLock() async {
|
||||
if (await LocalAuthenticationService.instance
|
||||
.isLocalAuthSupportedOnDevice()) {
|
||||
await _lockscreenSetting.removePinAndPassword();
|
||||
await _configuration.setSystemLockScreen(!isSystemLockEnabled);
|
||||
await _lockScreenSettings.removePinAndPassword();
|
||||
await _lockScreenSettings.setSystemLockScreen(!isSystemLockEnabled);
|
||||
} else {
|
||||
await showDialogWidget(
|
||||
context: context,
|
||||
@@ -96,10 +94,10 @@ class _LockScreenOptionsState extends State<LockScreenOptions> {
|
||||
);
|
||||
|
||||
if (result) {
|
||||
await _configuration.setSystemLockScreen(false);
|
||||
await _lockscreenSetting.setAppLockEnabled(true);
|
||||
await _lockScreenSettings.setSystemLockScreen(false);
|
||||
await _lockScreenSettings.setAppLockEnabled(true);
|
||||
setState(() {
|
||||
appLock = _lockscreenSetting.getIsAppLockSet();
|
||||
appLock = _lockScreenSettings.getIsAppLockSet();
|
||||
});
|
||||
}
|
||||
await _initializeSettings();
|
||||
@@ -114,9 +112,9 @@ class _LockScreenOptionsState extends State<LockScreenOptions> {
|
||||
),
|
||||
);
|
||||
if (result) {
|
||||
await _configuration.setSystemLockScreen(false);
|
||||
await _lockScreenSettings.setSystemLockScreen(false);
|
||||
setState(() {
|
||||
appLock = _lockscreenSetting.getIsAppLockSet();
|
||||
appLock = _lockScreenSettings.getIsAppLockSet();
|
||||
});
|
||||
}
|
||||
await _initializeSettings();
|
||||
@@ -126,17 +124,17 @@ class _LockScreenOptionsState extends State<LockScreenOptions> {
|
||||
AppLock.of(context)!.setEnabled(!appLock);
|
||||
if (await LocalAuthenticationService.instance
|
||||
.isLocalAuthSupportedOnDevice()) {
|
||||
await _configuration.setSystemLockScreen(!appLock);
|
||||
await _lockscreenSetting.setAppLockEnabled(!appLock);
|
||||
await _lockScreenSettings.setSystemLockScreen(!appLock);
|
||||
await _lockScreenSettings.setAppLockEnabled(!appLock);
|
||||
} else {
|
||||
await _configuration.setSystemLockScreen(false);
|
||||
await _lockscreenSetting.setAppLockEnabled(false);
|
||||
await _lockScreenSettings.setSystemLockScreen(false);
|
||||
await _lockScreenSettings.setAppLockEnabled(false);
|
||||
}
|
||||
await _lockscreenSetting.removePinAndPassword();
|
||||
await _lockScreenSettings.removePinAndPassword();
|
||||
if (PlatformUtil.isMobile()) {
|
||||
await _lockscreenSetting.setHideAppContent(!appLock);
|
||||
await _lockScreenSettings.setHideAppContent(!appLock);
|
||||
setState(() {
|
||||
hideAppContent = _lockscreenSetting.getShouldHideAppContent();
|
||||
hideAppContent = _lockScreenSettings.getShouldHideAppContent();
|
||||
});
|
||||
}
|
||||
await _initializeSettings();
|
||||
@@ -152,7 +150,7 @@ class _LockScreenOptionsState extends State<LockScreenOptions> {
|
||||
).then(
|
||||
(value) {
|
||||
setState(() {
|
||||
autoLockTimeInMilliseconds = _lockscreenSetting.getAutoLockTime();
|
||||
autoLockTimeInMilliseconds = _lockScreenSettings.getAutoLockTime();
|
||||
});
|
||||
},
|
||||
);
|
||||
@@ -162,7 +160,7 @@ class _LockScreenOptionsState extends State<LockScreenOptions> {
|
||||
setState(() {
|
||||
hideAppContent = !hideAppContent;
|
||||
});
|
||||
await _lockscreenSetting.setHideAppContent(hideAppContent);
|
||||
await _lockScreenSettings.setHideAppContent(hideAppContent);
|
||||
}
|
||||
|
||||
String _formatTime(Duration duration) {
|
||||
|
||||
@@ -166,7 +166,7 @@ class _SecuritySectionWidgetState extends State<SecuritySectionWidget> {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (await Configuration.instance.shouldShowLockScreen()) {
|
||||
if (await LockScreenSettings.instance.shouldShowLockScreen()) {
|
||||
final bool result = await requestAuthentication(
|
||||
context,
|
||||
context.l10n.authToChangeLockscreenSetting,
|
||||
|
||||
@@ -53,6 +53,7 @@ Future<bool> requestAuthentication(
|
||||
signInTitle: l10n.androidSignInTitle,
|
||||
),
|
||||
IOSAuthMessages(
|
||||
localizedFallbackTitle: l10n.enterPassword,
|
||||
goToSettingsButton: l10n.goToSettings,
|
||||
goToSettingsDescription: l10n.goToSettings,
|
||||
lockOut: l10n.iOSLockOut,
|
||||
|
||||
@@ -3,6 +3,8 @@ import "dart:io";
|
||||
import "dart:typed_data";
|
||||
|
||||
import "package:ente_auth/core/configuration.dart";
|
||||
import "package:ente_auth/core/event_bus.dart";
|
||||
import "package:ente_auth/events/signed_out_event.dart";
|
||||
import "package:ente_auth/utils/platform_util.dart";
|
||||
import "package:ente_crypto_dart/ente_crypto_dart.dart";
|
||||
import "package:flutter/material.dart";
|
||||
@@ -26,6 +28,7 @@ class LockScreenSettings {
|
||||
static const keyHasMigratedLockScreenChanges =
|
||||
"ls_has_migrated_lock_screen_changes";
|
||||
static const keyShowOfflineModeWarning = "ls_show_offline_mode_warning";
|
||||
static const keyShouldShowLockScreen = "should_show_lock_screen";
|
||||
static const String kIsLightMode = "is_light_mode";
|
||||
|
||||
final List<Duration> autoLockDurations = const [
|
||||
@@ -52,6 +55,10 @@ class LockScreenSettings {
|
||||
await runLockScreenChangesMigration();
|
||||
|
||||
await _clearLsDataInKeychainIfFreshInstall();
|
||||
|
||||
Bus.instance.on<SignedOutEvent>().listen((event) {
|
||||
removePinAndPassword();
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> setOfflineModeWarningStatus(bool value) async {
|
||||
@@ -69,8 +76,7 @@ class LockScreenSettings {
|
||||
|
||||
final bool passwordEnabled = await isPasswordSet();
|
||||
final bool pinEnabled = await isPinSet();
|
||||
final bool systemLockEnabled =
|
||||
Configuration.instance.shouldShowSystemLockScreen();
|
||||
final bool systemLockEnabled = shouldShowSystemLockScreen();
|
||||
|
||||
if (passwordEnabled || pinEnabled || systemLockEnabled) {
|
||||
await setAppLockEnabled(true);
|
||||
@@ -214,6 +220,24 @@ class LockScreenSettings {
|
||||
return await _secureStorage.containsKey(key: password);
|
||||
}
|
||||
|
||||
Future<bool> shouldShowLockScreen() async {
|
||||
final bool isPin = await isPinSet();
|
||||
final bool isPass = await isPasswordSet();
|
||||
return isPin || isPass || shouldShowSystemLockScreen();
|
||||
}
|
||||
|
||||
bool shouldShowSystemLockScreen() {
|
||||
if (_preferences.containsKey(keyShouldShowLockScreen)) {
|
||||
return _preferences.getBool(keyShouldShowLockScreen)!;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> setSystemLockScreen(bool value) {
|
||||
return _preferences.setBool(keyShouldShowLockScreen, value);
|
||||
}
|
||||
|
||||
// If the app was uninstalled (without logging out if it was used with
|
||||
// backups), keychain items of the app persist in the keychain. To avoid using
|
||||
// old keychain items, we delete them on reinstall.
|
||||
|
||||
@@ -543,67 +543,74 @@ packages:
|
||||
flutter_inappwebview:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_inappwebview
|
||||
sha256: "80092d13d3e29b6227e25b67973c67c7210bd5e35c4b747ca908e31eb71a46d5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.1.5"
|
||||
path: flutter_inappwebview
|
||||
ref: "3e6c4c4a25340cd363af9d38891d88498b90be26"
|
||||
resolved-ref: "3e6c4c4a25340cd363af9d38891d88498b90be26"
|
||||
url: "https://github.com/pichillilorenzo/flutter_inappwebview.git"
|
||||
source: git
|
||||
version: "6.2.0-beta.3"
|
||||
flutter_inappwebview_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_inappwebview_android
|
||||
sha256: "62557c15a5c2db5d195cb3892aab74fcaec266d7b86d59a6f0027abd672cddba"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.3"
|
||||
path: flutter_inappwebview_android
|
||||
ref: "3e6c4c4a25340cd363af9d38891d88498b90be26"
|
||||
resolved-ref: "3e6c4c4a25340cd363af9d38891d88498b90be26"
|
||||
url: "https://github.com/pichillilorenzo/flutter_inappwebview.git"
|
||||
source: git
|
||||
version: "1.2.0-beta.3"
|
||||
flutter_inappwebview_internal_annotations:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_inappwebview_internal_annotations
|
||||
sha256: "5f80fd30e208ddded7dbbcd0d569e7995f9f63d45ea3f548d8dd4c0b473fb4c8"
|
||||
sha256: "787171d43f8af67864740b6f04166c13190aa74a1468a1f1f1e9ee5b90c359cd"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
version: "1.2.0"
|
||||
flutter_inappwebview_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_inappwebview_ios
|
||||
sha256: "5818cf9b26cf0cbb0f62ff50772217d41ea8d3d9cc00279c45f8aabaa1b4025d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.2"
|
||||
path: flutter_inappwebview_ios
|
||||
ref: "3e6c4c4a25340cd363af9d38891d88498b90be26"
|
||||
resolved-ref: "3e6c4c4a25340cd363af9d38891d88498b90be26"
|
||||
url: "https://github.com/pichillilorenzo/flutter_inappwebview.git"
|
||||
source: git
|
||||
version: "1.2.0-beta.3"
|
||||
flutter_inappwebview_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_inappwebview_macos
|
||||
sha256: c1fbb86af1a3738e3541364d7d1866315ffb0468a1a77e34198c9be571287da1
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.2"
|
||||
path: flutter_inappwebview_macos
|
||||
ref: "3e6c4c4a25340cd363af9d38891d88498b90be26"
|
||||
resolved-ref: "3e6c4c4a25340cd363af9d38891d88498b90be26"
|
||||
url: "https://github.com/pichillilorenzo/flutter_inappwebview.git"
|
||||
source: git
|
||||
version: "1.2.0-beta.3"
|
||||
flutter_inappwebview_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_inappwebview_platform_interface
|
||||
sha256: cf5323e194096b6ede7a1ca808c3e0a078e4b33cc3f6338977d75b4024ba2500
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.0+1"
|
||||
path: flutter_inappwebview_platform_interface
|
||||
ref: "3e6c4c4a25340cd363af9d38891d88498b90be26"
|
||||
resolved-ref: "3e6c4c4a25340cd363af9d38891d88498b90be26"
|
||||
url: "https://github.com/pichillilorenzo/flutter_inappwebview.git"
|
||||
source: git
|
||||
version: "1.4.0-beta.3"
|
||||
flutter_inappwebview_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_inappwebview_web
|
||||
sha256: "55f89c83b0a0d3b7893306b3bb545ba4770a4df018204917148ebb42dc14a598"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.2"
|
||||
path: flutter_inappwebview_web
|
||||
ref: "3e6c4c4a25340cd363af9d38891d88498b90be26"
|
||||
resolved-ref: "3e6c4c4a25340cd363af9d38891d88498b90be26"
|
||||
url: "https://github.com/pichillilorenzo/flutter_inappwebview.git"
|
||||
source: git
|
||||
version: "1.2.0-beta.3"
|
||||
flutter_inappwebview_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_inappwebview_windows
|
||||
sha256: "8b4d3a46078a2cdc636c4a3d10d10f2a16882f6be607962dbfff8874d1642055"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.6.0"
|
||||
path: flutter_inappwebview_windows
|
||||
ref: "3e6c4c4a25340cd363af9d38891d88498b90be26"
|
||||
resolved-ref: "3e6c4c4a25340cd363af9d38891d88498b90be26"
|
||||
url: "https://github.com/pichillilorenzo/flutter_inappwebview.git"
|
||||
source: git
|
||||
version: "0.7.0-beta.3"
|
||||
flutter_launcher_icons:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
name: ente_auth
|
||||
description: ente two-factor authenticator
|
||||
version: 4.4.0+440
|
||||
version: 4.4.1+441
|
||||
publish_to: none
|
||||
|
||||
environment:
|
||||
@@ -45,7 +45,13 @@ dependencies:
|
||||
flutter_context_menu: ^0.2.0
|
||||
flutter_displaymode: ^0.6.0
|
||||
flutter_email_sender: ^6.0.2
|
||||
flutter_inappwebview: ^6.1.5
|
||||
# revert to pub.dev when merged
|
||||
# https://github.com/pichillilorenzo/flutter_inappwebview/pull/2548
|
||||
flutter_inappwebview:
|
||||
git:
|
||||
url: https://github.com/pichillilorenzo/flutter_inappwebview.git
|
||||
path: flutter_inappwebview
|
||||
ref: 3e6c4c4a25340cd363af9d38891d88498b90be26
|
||||
flutter_launcher_icons: ^0.14.1
|
||||
flutter_local_authentication:
|
||||
git:
|
||||
|
||||
@@ -5,8 +5,6 @@
|
||||
|
||||
endpoint:
|
||||
api: "http://localhost:8080"
|
||||
# Endpoint for the account service for passkey
|
||||
accounts: "http://localhost:3001"
|
||||
|
||||
log:
|
||||
http: false # log status code & time taken by requests
|
||||
|
||||
@@ -35,6 +35,7 @@ type AuthorizationResponse struct {
|
||||
ID int64 `json:"id"`
|
||||
KeyAttributes *KeyAttributes `json:"keyAttributes,omitempty"`
|
||||
EncryptedToken string `json:"encryptedToken,omitempty"`
|
||||
AccountsUrl string `json:"accountsUrl"`
|
||||
Token string `json:"token,omitempty"`
|
||||
TwoFactorSessionID string `json:"twoFactorSessionID"`
|
||||
PassKeySessionID string `json:"passkeySessionID"`
|
||||
|
||||
@@ -110,7 +110,6 @@ func initConfig(cliConfigDir string) {
|
||||
viper.AddConfigPath(".") // optionally look for config in the working directory
|
||||
|
||||
viper.SetDefault("endpoint.api", constants.EnteApiUrl)
|
||||
viper.SetDefault("endpoint.accounts", constants.EnteAccountUrl)
|
||||
viper.SetDefault("log.http", false)
|
||||
if err := viper.ReadInConfig(); err != nil {
|
||||
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
|
||||
|
||||
@@ -8,8 +8,8 @@ import (
|
||||
eCrypto "github.com/ente-io/cli/internal/crypto"
|
||||
"github.com/ente-io/cli/pkg/model"
|
||||
"github.com/ente-io/cli/utils/browser"
|
||||
"github.com/ente-io/cli/utils/constants"
|
||||
"github.com/ente-io/cli/utils/encoding"
|
||||
"github.com/spf13/viper"
|
||||
"log"
|
||||
|
||||
"github.com/kong/go-srp"
|
||||
@@ -145,7 +145,10 @@ func (c *ClICtrl) verifyPassKey(ctx context.Context, authResp *api.Authorization
|
||||
if !authResp.IsPasskeyRequired() {
|
||||
return authResp, nil
|
||||
}
|
||||
baseAccountUrl := viper.GetString("endpoint.accounts")
|
||||
baseAccountUrl := constants.EnteAccountUrl
|
||||
if authResp.AccountsUrl != "" {
|
||||
baseAccountUrl = authResp.AccountsUrl
|
||||
}
|
||||
passkeyAuthUrl := fmt.Sprintf("%s/passkeys/verify?passkeySessionID=%s&redirect=ente-cli://passkey&clientPackage=%s", baseAccountUrl, authResp.PassKeySessionID, app.ClientPkg())
|
||||
fmt.Printf("Open this url in browser to verify passkey: %s\n", passkeyAuthUrl)
|
||||
err := browser.OpenURL(passkeyAuthUrl)
|
||||
|
||||
@@ -113,6 +113,11 @@ jobs:
|
||||
APPLE_APP_SPECIFIC_PASSWORD:
|
||||
${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
|
||||
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||
# Windows Azure Trusted Signing related values
|
||||
# https://www.electron.build/code-signing-win#using-azure-trusted-signing-beta
|
||||
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
|
||||
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
|
||||
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
|
||||
# Default is "draft", but since our nightly builds update
|
||||
# existing pre-releases, set this to "prerelease".
|
||||
EP_PRE_RELEASE: true
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
# CHANGELOG
|
||||
|
||||
## v1.7.14 (Unreleased)
|
||||
## v1.7.15 (Unreleased)
|
||||
|
||||
- .
|
||||
|
||||
## v1.7.14
|
||||
|
||||
- Increase file size limit to 10 GB.
|
||||
|
||||
## v1.7.13
|
||||
|
||||
- Generate streams for videos (beta)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
- [Electron](#electron)
|
||||
- [Dev dependencies](#dev)
|
||||
- [Functionality](#functionality)
|
||||
- [Pinned](#pinned)
|
||||
|
||||
## Electron
|
||||
|
||||
@@ -140,3 +141,24 @@ handles to avoid reopening them for every operation.
|
||||
|
||||
[chokidar](https://github.com/paulmillr/chokidar) is used as a file system
|
||||
watcher for the watch folders functionality.
|
||||
|
||||
## Pinned
|
||||
|
||||
- `electron-builder` is pinned to 26.0.16 because of
|
||||
https://github.com/electron-userland/electron-builder/issues/9161#issuecomment-2977829326
|
||||
|
||||
- `electron-builder` is pinned to 26.0.14 because of a new error when building:
|
||||
|
||||
> Detected file
|
||||
> "Contents/Resources/app.asar.unpacked/node_modules/onnxruntime-node/bin/napi-v3/darwin/arm64/libonnxruntime.1.20.1.dylib"
|
||||
> that's the same in both x64 and arm64 builds and not covered by the
|
||||
> x64ArchFiles rule: "undefined" failedTask=build stackTrace=Error: Detected
|
||||
> file
|
||||
> "Contents/Resources/app.asar.unpacked/node_modules/onnxruntime-node/bin/napi-v3/darwin/arm64/libonnxruntime.1.20.1.dylib"
|
||||
> that's the same in both x64 and arm64 builds and not covered by the
|
||||
> x64ArchFiles rule: "undefined"
|
||||
|
||||
To reproduce this locally, add `x64ArchFiles: "ffmpeg"` to
|
||||
`electron-builder.yml`, then run `node_modules/.bin/electron-builder --mac`
|
||||
|
||||
- `electron-store` is pinned to 8.2.0 because subsequent versions are ESM only.
|
||||
|
||||
@@ -14,6 +14,11 @@ win:
|
||||
target:
|
||||
- target: nsis
|
||||
arch: [x64, arm64]
|
||||
azureSignOptions:
|
||||
publisherName: ENTE TECHNOLOGIES, INC.
|
||||
endpoint: https://eus.codesigning.azure.net/
|
||||
certificateProfileName: EnteTrustCertProfile
|
||||
codeSigningAccountName: EnteTechnologiesInc
|
||||
nsis:
|
||||
deleteAppDataOnUninstall: true
|
||||
linux:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ente",
|
||||
"version": "1.7.14-beta",
|
||||
"version": "1.7.15-beta",
|
||||
"private": true,
|
||||
"description": "Desktop client for Ente Photos",
|
||||
"repository": "github:ente-io/photos-desktop",
|
||||
@@ -31,33 +31,32 @@
|
||||
"clip-bpe-js": "^0.0.6",
|
||||
"comlink": "^4.4.2",
|
||||
"compare-versions": "^6.1.1",
|
||||
"electron-log": "^5.4.0",
|
||||
"electron-log": "^5.4.1",
|
||||
"electron-store": "^8.2.0",
|
||||
"electron-updater": "^6.6.3",
|
||||
"electron-updater": "^6.6.5",
|
||||
"ffmpeg-static": "^5.2.0",
|
||||
"lru-cache": "^11.1.0",
|
||||
"next-electron-server": "^1.0.0",
|
||||
"node-stream-zip": "^1.15.0",
|
||||
"onnxruntime-node": "^1.20.1",
|
||||
"zod": "^3.25.51"
|
||||
"zod": "^3.25.67"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.28.0",
|
||||
"@eslint/js": "^9.29.0",
|
||||
"@tsconfig/node22": "^22.0.2",
|
||||
"@types/auto-launch": "^5.0.5",
|
||||
"@types/ffmpeg-static": "^3.0.3",
|
||||
"ajv": "^8.17.1",
|
||||
"concurrently": "^9.1.2",
|
||||
"cross-env": "^7.0.3",
|
||||
"electron": "^36.4.0",
|
||||
"electron-builder": "^26.0.14",
|
||||
"electron": "^37.1.0",
|
||||
"electron-builder": "26.0.14",
|
||||
"eslint": "^9",
|
||||
"prettier": "3.5.3",
|
||||
"prettier-plugin-organize-imports": "^4.1.0",
|
||||
"prettier-plugin-packagejson": "^2.5.15",
|
||||
"shx": "^0.4.0",
|
||||
"typescript": "^5.8.3",
|
||||
"typescript-eslint": "^8.33.1"
|
||||
"typescript-eslint": "^8.34.1"
|
||||
},
|
||||
"packageManager": "yarn@1.22.22",
|
||||
"productName": "ente"
|
||||
|
||||
@@ -78,14 +78,6 @@ export const allowWindowClose = (): void => {
|
||||
* We call this at the end of this file.
|
||||
*/
|
||||
const main = () => {
|
||||
// Workaround for Electron 36 not launching on some Linux distros. Remove
|
||||
// once fixed or otherwise mitigated upstream.
|
||||
//
|
||||
// https://github.com/electron/electron/issues/46538#issuecomment-2808806722
|
||||
if (process.platform == "linux") {
|
||||
app.commandLine.appendSwitch("gtk-version", "3");
|
||||
}
|
||||
|
||||
const gotTheLock = app.requestSingleInstanceLock();
|
||||
if (!gotTheLock) {
|
||||
app.quit();
|
||||
|
||||
@@ -50,8 +50,8 @@ import { convertToJPEG, generateImageThumbnail } from "./services/image";
|
||||
import { logout } from "./services/logout";
|
||||
import {
|
||||
lastShownChangelogVersion,
|
||||
masterKeyB64,
|
||||
saveMasterKeyB64,
|
||||
masterKeyFromSafeStorage,
|
||||
saveMasterKeyInSafeStorage,
|
||||
setLastShownChangelogVersion,
|
||||
} from "./services/store";
|
||||
import {
|
||||
@@ -108,10 +108,12 @@ export const attachIPCHandlers = () => {
|
||||
|
||||
ipcMain.handle("selectDirectory", () => selectDirectory());
|
||||
|
||||
ipcMain.handle("masterKeyB64", () => masterKeyB64());
|
||||
ipcMain.handle("masterKeyFromSafeStorage", () =>
|
||||
masterKeyFromSafeStorage(),
|
||||
);
|
||||
|
||||
ipcMain.handle("saveMasterKeyB64", (_, masterKeyB64: string) =>
|
||||
saveMasterKeyB64(masterKeyB64),
|
||||
ipcMain.handle("saveMasterKeyInSafeStorage", (_, masterKey: string) =>
|
||||
saveMasterKeyInSafeStorage(masterKey),
|
||||
);
|
||||
|
||||
ipcMain.handle("lastShownChangelogVersion", () =>
|
||||
|
||||
@@ -184,14 +184,13 @@ const downloadModel = async (saveLocation: string, name: string) => {
|
||||
/**
|
||||
* Create an ONNX {@link InferenceSession} with some defaults.
|
||||
*/
|
||||
const createInferenceSession = async (modelPath: string) => {
|
||||
return await ort.InferenceSession.create(modelPath, {
|
||||
const createInferenceSession = (modelPath: string) =>
|
||||
ort.InferenceSession.create(modelPath, {
|
||||
// Restrict the number of threads to 1.
|
||||
intraOpNumThreads: 1,
|
||||
// Be more conservative with RAM usage.
|
||||
enableCpuMemArena: false,
|
||||
});
|
||||
};
|
||||
|
||||
const cachedCLIPImageSession = makeCachedInferenceSession(
|
||||
"mobileclip_s2_image_opset18_rgba_opt.onnx",
|
||||
@@ -233,9 +232,11 @@ const getTokenizer = () => (_tokenizer ??= new Tokenizer());
|
||||
export const computeCLIPTextEmbeddingIfAvailable = async (text: string) => {
|
||||
const sessionOrSkip = await Promise.race([
|
||||
cachedCLIPTextSession(),
|
||||
// Wait for a tick to get the session promise to resolved the first time
|
||||
// this code runs on each app start (and the model has been downloaded).
|
||||
wait(0).then(() => 1),
|
||||
// Wait a bit to get the session promise to resolved the first time this
|
||||
// code runs on each app start (in these cases the model will already be
|
||||
// downloaded, so session creation should take only a 1 or 2 ticks: file
|
||||
// system stat, and ort.InferenceSession.create).
|
||||
wait(50).then(() => 1),
|
||||
]);
|
||||
|
||||
// Don't wait for the download to complete.
|
||||
|
||||
@@ -24,17 +24,17 @@ export const clearStores = () => {
|
||||
* On macOS, `safeStorage` stores our data under a Keychain entry named
|
||||
* "<app-name> Safe Storage". In our case, "ente Safe Storage".
|
||||
*/
|
||||
export const saveMasterKeyB64 = (masterKeyB64: string) => {
|
||||
const encryptedKey = safeStorage.encryptString(masterKeyB64);
|
||||
const b64EncryptedKey = Buffer.from(encryptedKey).toString("base64");
|
||||
safeStorageStore.set("encryptionKey", b64EncryptedKey);
|
||||
export const saveMasterKeyInSafeStorage = (masterKey: string) => {
|
||||
const encryptedKeyBuffer = safeStorage.encryptString(masterKey);
|
||||
const encryptedKey = Buffer.from(encryptedKeyBuffer).toString("base64");
|
||||
safeStorageStore.set("encryptionKey", encryptedKey);
|
||||
};
|
||||
|
||||
export const masterKeyB64 = (): string | undefined => {
|
||||
const b64EncryptedKey = safeStorageStore.get("encryptionKey");
|
||||
if (!b64EncryptedKey) return undefined;
|
||||
const keyBuffer = Buffer.from(b64EncryptedKey, "base64");
|
||||
return safeStorage.decryptString(keyBuffer);
|
||||
export const masterKeyFromSafeStorage = (): string | undefined => {
|
||||
const encryptedKey = safeStorageStore.get("encryptionKey");
|
||||
if (!encryptedKey) return undefined;
|
||||
const encryptedKeyBuffer = Buffer.from(encryptedKey, "base64");
|
||||
return safeStorage.decryptString(encryptedKeyBuffer);
|
||||
};
|
||||
|
||||
export const lastShownChangelogVersion = (): number | undefined =>
|
||||
|
||||
@@ -113,10 +113,11 @@ const logout = () => {
|
||||
return ipcRenderer.invoke("logout");
|
||||
};
|
||||
|
||||
const masterKeyB64 = () => ipcRenderer.invoke("masterKeyB64");
|
||||
const masterKeyFromSafeStorage = () =>
|
||||
ipcRenderer.invoke("masterKeyFromSafeStorage");
|
||||
|
||||
const saveMasterKeyB64 = (masterKeyB64: string) =>
|
||||
ipcRenderer.invoke("saveMasterKeyB64", masterKeyB64);
|
||||
const saveMasterKeyInSafeStorage = (masterKey: string) =>
|
||||
ipcRenderer.invoke("saveMasterKeyInSafeStorage", masterKey);
|
||||
|
||||
const lastShownChangelogVersion = () =>
|
||||
ipcRenderer.invoke("lastShownChangelogVersion");
|
||||
@@ -358,8 +359,8 @@ contextBridge.exposeInMainWorld("electron", {
|
||||
selectDirectory,
|
||||
pathForFile,
|
||||
logout,
|
||||
masterKeyB64,
|
||||
saveMasterKeyB64,
|
||||
masterKeyFromSafeStorage,
|
||||
saveMasterKeyInSafeStorage,
|
||||
lastShownChangelogVersion,
|
||||
setLastShownChangelogVersion,
|
||||
isAutoLaunchEnabled,
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
ajv "^6.12.0"
|
||||
ajv-keywords "^3.4.1"
|
||||
|
||||
"@electron/asar@3.4.1":
|
||||
"@electron/asar@3.4.1", "@electron/asar@^3.2.7":
|
||||
version "3.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.4.1.tgz#4e9196a4b54fba18c56cd8d5cac67c5bdc588065"
|
||||
integrity sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==
|
||||
@@ -34,15 +34,6 @@
|
||||
glob "^7.1.6"
|
||||
minimatch "^3.0.4"
|
||||
|
||||
"@electron/asar@^3.2.7":
|
||||
version "3.2.18"
|
||||
resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.18.tgz#fa607f829209bab8b9e0ce6658d3fe81b2cba517"
|
||||
integrity sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==
|
||||
dependencies:
|
||||
commander "^5.0.0"
|
||||
glob "^7.1.6"
|
||||
minimatch "^3.0.4"
|
||||
|
||||
"@electron/fuses@^1.8.0":
|
||||
version "1.8.0"
|
||||
resolved "https://registry.yarnpkg.com/@electron/fuses/-/fuses-1.8.0.tgz#ad34d3cc4703b1258b83f6989917052cfc1490a0"
|
||||
@@ -184,10 +175,10 @@
|
||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.9.1.tgz#4a97e85e982099d6c7ee8410aacb55adaa576f06"
|
||||
integrity sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==
|
||||
|
||||
"@eslint/js@^9.28.0":
|
||||
version "9.28.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.28.0.tgz#7822ccc2f8cae7c3cd4f902377d520e9ae03f844"
|
||||
integrity sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==
|
||||
"@eslint/js@^9.29.0":
|
||||
version "9.29.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.29.0.tgz#dc6fd117c19825f8430867a662531da36320fe56"
|
||||
integrity sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==
|
||||
|
||||
"@eslint/object-schema@^2.1.4":
|
||||
version "2.1.4"
|
||||
@@ -209,6 +200,18 @@
|
||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570"
|
||||
integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==
|
||||
|
||||
"@isaacs/balanced-match@^4.0.1":
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29"
|
||||
integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==
|
||||
|
||||
"@isaacs/brace-expansion@^5.0.0":
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz#4b3dabab7d8e75a429414a96bd67bf4c1d13e0f3"
|
||||
integrity sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==
|
||||
dependencies:
|
||||
"@isaacs/balanced-match" "^4.0.1"
|
||||
|
||||
"@isaacs/fs-minipass@^4.0.0":
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz#2d59ae3ab4b38fb4270bfa23d30f8e2e86c7fe32"
|
||||
@@ -324,11 +327,6 @@
|
||||
dependencies:
|
||||
"@types/ms" "*"
|
||||
|
||||
"@types/ffmpeg-static@^3.0.3":
|
||||
version "3.0.3"
|
||||
resolved "https://registry.yarnpkg.com/@types/ffmpeg-static/-/ffmpeg-static-3.0.3.tgz#605358ac6304507a75c2fd5fd861534837b19e2f"
|
||||
integrity sha512-wmjANN0CiYs5clQESK+xE6plet0y9ndqaNBdQx4IIw7ZbPBMQw+14Lq4ky2WqMqGlpFJ9ZUxU0O43TvVZziyyA==
|
||||
|
||||
"@types/fs-extra@9.0.13", "@types/fs-extra@^9.0.11":
|
||||
version "9.0.13"
|
||||
resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45"
|
||||
@@ -392,78 +390,78 @@
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@typescript-eslint/eslint-plugin@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.1.tgz#532641b416ed2afd5be893cddb2a58e9cd1f7a3e"
|
||||
integrity sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==
|
||||
"@typescript-eslint/eslint-plugin@8.34.1":
|
||||
version "8.34.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.1.tgz#56cf35b89383eaf2bdcf602f5bbdac6dbb11e51b"
|
||||
integrity sha512-STXcN6ebF6li4PxwNeFnqF8/2BNDvBupf2OPx2yWNzr6mKNGF7q49VM00Pz5FaomJyqvbXpY6PhO+T9w139YEQ==
|
||||
dependencies:
|
||||
"@eslint-community/regexpp" "^4.10.0"
|
||||
"@typescript-eslint/scope-manager" "8.33.1"
|
||||
"@typescript-eslint/type-utils" "8.33.1"
|
||||
"@typescript-eslint/utils" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
"@typescript-eslint/scope-manager" "8.34.1"
|
||||
"@typescript-eslint/type-utils" "8.34.1"
|
||||
"@typescript-eslint/utils" "8.34.1"
|
||||
"@typescript-eslint/visitor-keys" "8.34.1"
|
||||
graphemer "^1.4.0"
|
||||
ignore "^7.0.0"
|
||||
natural-compare "^1.4.0"
|
||||
ts-api-utils "^2.1.0"
|
||||
|
||||
"@typescript-eslint/parser@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.33.1.tgz#ef9a5ee6aa37a6b4f46cc36d08a14f828238afe2"
|
||||
integrity sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==
|
||||
"@typescript-eslint/parser@8.34.1":
|
||||
version "8.34.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.34.1.tgz#f102357ab3a02d5b8aa789655905662cc5093067"
|
||||
integrity sha512-4O3idHxhyzjClSMJ0a29AcoK0+YwnEqzI6oz3vlRf3xw0zbzt15MzXwItOlnr5nIth6zlY2RENLsOPvhyrKAQA==
|
||||
dependencies:
|
||||
"@typescript-eslint/scope-manager" "8.33.1"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/typescript-estree" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
"@typescript-eslint/scope-manager" "8.34.1"
|
||||
"@typescript-eslint/types" "8.34.1"
|
||||
"@typescript-eslint/typescript-estree" "8.34.1"
|
||||
"@typescript-eslint/visitor-keys" "8.34.1"
|
||||
debug "^4.3.4"
|
||||
|
||||
"@typescript-eslint/project-service@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.33.1.tgz#c85e7d9a44d6a11fe64e73ac1ed47de55dc2bf9f"
|
||||
integrity sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==
|
||||
"@typescript-eslint/project-service@8.34.1":
|
||||
version "8.34.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.34.1.tgz#20501f8b87202c45f5e70a5b24dcdcb8fe12d460"
|
||||
integrity sha512-nuHlOmFZfuRwLJKDGQOVc0xnQrAmuq1Mj/ISou5044y1ajGNp2BNliIqp7F2LPQ5sForz8lempMFCovfeS1XoA==
|
||||
dependencies:
|
||||
"@typescript-eslint/tsconfig-utils" "^8.33.1"
|
||||
"@typescript-eslint/types" "^8.33.1"
|
||||
"@typescript-eslint/tsconfig-utils" "^8.34.1"
|
||||
"@typescript-eslint/types" "^8.34.1"
|
||||
debug "^4.3.4"
|
||||
|
||||
"@typescript-eslint/scope-manager@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.33.1.tgz#d1e0efb296da5097d054bc9972e69878a2afea73"
|
||||
integrity sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==
|
||||
"@typescript-eslint/scope-manager@8.34.1":
|
||||
version "8.34.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.34.1.tgz#727ea43441f4d23d5c73d34195427d85042e5117"
|
||||
integrity sha512-beu6o6QY4hJAgL1E8RaXNC071G4Kso2MGmJskCFQhRhg8VOH/FDbC8soP8NHN7e/Hdphwp8G8cE6OBzC8o41ZA==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
"@typescript-eslint/types" "8.34.1"
|
||||
"@typescript-eslint/visitor-keys" "8.34.1"
|
||||
|
||||
"@typescript-eslint/tsconfig-utils@8.33.1", "@typescript-eslint/tsconfig-utils@^8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.1.tgz#7836afcc097a4657a5ed56670851a450d8b70ab8"
|
||||
integrity sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==
|
||||
"@typescript-eslint/tsconfig-utils@8.34.1", "@typescript-eslint/tsconfig-utils@^8.34.1":
|
||||
version "8.34.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.1.tgz#d6abb1b1e9f1f1c83ac92051c8fbf2dbc4dc9f5e"
|
||||
integrity sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg==
|
||||
|
||||
"@typescript-eslint/type-utils@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.33.1.tgz#d73ee1a29d8a0abe60d4abbff4f1d040f0de15fa"
|
||||
integrity sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==
|
||||
"@typescript-eslint/type-utils@8.34.1":
|
||||
version "8.34.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.34.1.tgz#df860d8edefbfe142473ea4defb7408edb0c379e"
|
||||
integrity sha512-Tv7tCCr6e5m8hP4+xFugcrwTOucB8lshffJ6zf1mF1TbU67R+ntCc6DzLNKM+s/uzDyv8gLq7tufaAhIBYeV8g==
|
||||
dependencies:
|
||||
"@typescript-eslint/typescript-estree" "8.33.1"
|
||||
"@typescript-eslint/utils" "8.33.1"
|
||||
"@typescript-eslint/typescript-estree" "8.34.1"
|
||||
"@typescript-eslint/utils" "8.34.1"
|
||||
debug "^4.3.4"
|
||||
ts-api-utils "^2.1.0"
|
||||
|
||||
"@typescript-eslint/types@8.33.1", "@typescript-eslint/types@^8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.33.1.tgz#b693111bc2180f8098b68e9958cf63761657a55f"
|
||||
integrity sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==
|
||||
"@typescript-eslint/types@8.34.1", "@typescript-eslint/types@^8.34.1":
|
||||
version "8.34.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.34.1.tgz#565a46a251580dae674dac5aafa8eb14b8322a35"
|
||||
integrity sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA==
|
||||
|
||||
"@typescript-eslint/typescript-estree@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.1.tgz#d271beed470bc915b8764e22365d4925c2ea265d"
|
||||
integrity sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==
|
||||
"@typescript-eslint/typescript-estree@8.34.1":
|
||||
version "8.34.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.34.1.tgz#befdb042a6bc44fdad27429b2d3b679c80daad71"
|
||||
integrity sha512-rjCNqqYPuMUF5ODD+hWBNmOitjBWghkGKJg6hiCHzUvXRy6rK22Jd3rwbP2Xi+R7oYVvIKhokHVhH41BxPV5mA==
|
||||
dependencies:
|
||||
"@typescript-eslint/project-service" "8.33.1"
|
||||
"@typescript-eslint/tsconfig-utils" "8.33.1"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
"@typescript-eslint/project-service" "8.34.1"
|
||||
"@typescript-eslint/tsconfig-utils" "8.34.1"
|
||||
"@typescript-eslint/types" "8.34.1"
|
||||
"@typescript-eslint/visitor-keys" "8.34.1"
|
||||
debug "^4.3.4"
|
||||
fast-glob "^3.3.2"
|
||||
is-glob "^4.0.3"
|
||||
@@ -471,23 +469,23 @@
|
||||
semver "^7.6.0"
|
||||
ts-api-utils "^2.1.0"
|
||||
|
||||
"@typescript-eslint/utils@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.33.1.tgz#ea22f40d3553da090f928cf17907e963643d4b96"
|
||||
integrity sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==
|
||||
"@typescript-eslint/utils@8.34.1":
|
||||
version "8.34.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.34.1.tgz#f98c9b0c5cae407e34f5131cac0f3a74347a398e"
|
||||
integrity sha512-mqOwUdZ3KjtGk7xJJnLbHxTuWVn3GO2WZZuM+Slhkun4+qthLdXx32C8xIXbO1kfCECb3jIs3eoxK3eryk7aoQ==
|
||||
dependencies:
|
||||
"@eslint-community/eslint-utils" "^4.7.0"
|
||||
"@typescript-eslint/scope-manager" "8.33.1"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/typescript-estree" "8.33.1"
|
||||
"@typescript-eslint/scope-manager" "8.34.1"
|
||||
"@typescript-eslint/types" "8.34.1"
|
||||
"@typescript-eslint/typescript-estree" "8.34.1"
|
||||
|
||||
"@typescript-eslint/visitor-keys@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.1.tgz#6c6e002c24d13211df3df851767f24dfdb4f42bc"
|
||||
integrity sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==
|
||||
"@typescript-eslint/visitor-keys@8.34.1":
|
||||
version "8.34.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.34.1.tgz#28a1987ea3542ccafb92aa792726a304b39531cf"
|
||||
integrity sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
eslint-visitor-keys "^4.2.0"
|
||||
"@typescript-eslint/types" "8.34.1"
|
||||
eslint-visitor-keys "^4.2.1"
|
||||
|
||||
"@xmldom/xmldom@^0.8.8":
|
||||
version "0.8.10"
|
||||
@@ -1193,7 +1191,7 @@ ejs@^3.1.8:
|
||||
dependencies:
|
||||
jake "^10.8.5"
|
||||
|
||||
electron-builder@^26.0.14:
|
||||
electron-builder@26.0.14:
|
||||
version "26.0.14"
|
||||
resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-26.0.14.tgz#8927c6da42a69425d15e08f351e944ea0e7866da"
|
||||
integrity sha512-YBxpWLMGj0oS7fbS3LVingeZqFunU0F8s+uB9QTd5+wN4qgrf/rSGRkqoImbWg2+F2yHq11wmaA/Xr9xzvgQ0w==
|
||||
@@ -1209,10 +1207,10 @@ electron-builder@^26.0.14:
|
||||
simple-update-notifier "2.0.0"
|
||||
yargs "^17.6.2"
|
||||
|
||||
electron-log@^5.4.0:
|
||||
version "5.4.0"
|
||||
resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.4.0.tgz#3180bf5194b2e2efacb62ec1392f8150faf4de6b"
|
||||
integrity sha512-AXI5OVppskrWxEAmCxuv8ovX+s2Br39CpCAgkGMNHQtjYT3IiVbSQTncEjFVGPgoH35ZygRm/mvUMBDWwhRxgg==
|
||||
electron-log@^5.4.1:
|
||||
version "5.4.1"
|
||||
resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.4.1.tgz#700ddc6ef4b06c13a983468580ba7a7e579129d4"
|
||||
integrity sha512-QvisA18Z++8E3Th0zmhUelys9dEv7aIeXJlbFw3UrxCc8H9qSRW0j8/ooTef/EtHui8tVmbKSL+EIQzP9GoRLg==
|
||||
|
||||
electron-publish@26.0.13:
|
||||
version "26.0.13"
|
||||
@@ -1236,10 +1234,10 @@ electron-store@^8.2.0:
|
||||
conf "^10.2.0"
|
||||
type-fest "^2.17.0"
|
||||
|
||||
electron-updater@^6.6.3:
|
||||
version "6.6.3"
|
||||
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.6.3.tgz#a1f53671ffbb08a475d495d48f0c0d971e665d5d"
|
||||
integrity sha512-i448/SwMtqxy5wqAcXScnWjiFxZp+hmWA2jZCmojcdfodEGhi/DWTdRP01mE3lCILb8hmdE28SBaHf1oQW3+kw==
|
||||
electron-updater@^6.6.5:
|
||||
version "6.6.5"
|
||||
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.6.5.tgz#6614daa2f737c294471eee7ce7b61deda0d5543a"
|
||||
integrity sha512-jnk38WfByl2Pb0cje02xls/pJkvkq3AQZI7usDCLriU23adkerLTkRrugbCPuUxUOa79nY1g/rokHPWHZFBKyA==
|
||||
dependencies:
|
||||
builder-util-runtime "9.3.2"
|
||||
fs-extra "^10.1.0"
|
||||
@@ -1250,10 +1248,10 @@ electron-updater@^6.6.3:
|
||||
semver "^7.6.3"
|
||||
tiny-typed-emitter "^2.1.0"
|
||||
|
||||
electron@^36.4.0:
|
||||
version "36.4.0"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-36.4.0.tgz#9463bf5fa7565ae7be3a274f7f6a46359bcfe74d"
|
||||
integrity sha512-LLOOZEuW5oqvnjC7HBQhIqjIIJAZCIFjQxltQGLfEC7XFsBoZgQ3u3iFj+Kzw68Xj97u1n57Jdt7P98qLvUibQ==
|
||||
electron@^37.1.0:
|
||||
version "37.1.0"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-37.1.0.tgz#6d6d1891f8add5d2d44007e2ee5d4542140fc4b4"
|
||||
integrity sha512-Fcr3yfAw4oU392waVZSlrFUQx4P+h/k31+PRgkBY9tFx9E/zxzdPQQj0achZlG1HRDusw3ooQB+OXb9PvufdzA==
|
||||
dependencies:
|
||||
"@electron/get" "^2.0.0"
|
||||
"@types/node" "^22.7.7"
|
||||
@@ -1328,11 +1326,16 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3:
|
||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
|
||||
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
|
||||
|
||||
eslint-visitor-keys@^4.0.0, eslint-visitor-keys@^4.2.0:
|
||||
eslint-visitor-keys@^4.0.0:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45"
|
||||
integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==
|
||||
|
||||
eslint-visitor-keys@^4.2.1:
|
||||
version "4.2.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1"
|
||||
integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
|
||||
|
||||
eslint@^9:
|
||||
version "9.9.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.9.1.tgz#147ac9305d56696fb84cf5bdecafd6517ddc77ec"
|
||||
@@ -2276,11 +2279,11 @@ mimic-response@^3.1.0:
|
||||
integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
|
||||
|
||||
minimatch@^10.0.0:
|
||||
version "10.0.1"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b"
|
||||
integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==
|
||||
version "10.0.3"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.3.tgz#cf7a0314a16c4d9ab73a7730a0e8e3c3502d47aa"
|
||||
integrity sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==
|
||||
dependencies:
|
||||
brace-expansion "^2.0.1"
|
||||
"@isaacs/brace-expansion" "^5.0.0"
|
||||
|
||||
minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
|
||||
version "3.1.2"
|
||||
@@ -3251,14 +3254,14 @@ typedarray@^0.0.6:
|
||||
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
|
||||
integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
|
||||
|
||||
typescript-eslint@^8.33.1:
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.33.1.tgz#d2d59c9b24afe1f903a855b02145802e4ae930ff"
|
||||
integrity sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==
|
||||
typescript-eslint@^8.34.1:
|
||||
version "8.34.1"
|
||||
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.34.1.tgz#4bab64b298531b9f6f3ff59b41a7161321ef8cd6"
|
||||
integrity sha512-XjS+b6Vg9oT1BaIUfkW3M3LvqZE++rbzAMEHuccCfO/YkP43ha6w3jTEMilQxMF92nVOYCcdjv1ZUhAa1D/0ow==
|
||||
dependencies:
|
||||
"@typescript-eslint/eslint-plugin" "8.33.1"
|
||||
"@typescript-eslint/parser" "8.33.1"
|
||||
"@typescript-eslint/utils" "8.33.1"
|
||||
"@typescript-eslint/eslint-plugin" "8.34.1"
|
||||
"@typescript-eslint/parser" "8.34.1"
|
||||
"@typescript-eslint/utils" "8.34.1"
|
||||
|
||||
typescript@^5.4.3, typescript@^5.8.3:
|
||||
version "5.8.3"
|
||||
@@ -3421,7 +3424,7 @@ yocto-queue@^0.1.0:
|
||||
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
|
||||
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
|
||||
|
||||
zod@^3.25.51:
|
||||
version "3.25.51"
|
||||
resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.51.tgz#aa2cf648e54f6f060f139cf77b694819f63c9f3a"
|
||||
integrity sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==
|
||||
zod@^3.25.67:
|
||||
version "3.25.67"
|
||||
resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.67.tgz#62987e4078e2ab0f63b491ef0c4f33df24236da8"
|
||||
integrity sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==
|
||||
|
||||
@@ -8,13 +8,6 @@ export default defineConfig({
|
||||
head: [["link", { rel: "icon", type: "image/png", href: "/favicon.png" }]],
|
||||
cleanUrls: true,
|
||||
ignoreDeadLinks: "localhostLinks",
|
||||
vite: {
|
||||
build: {
|
||||
rollupOptions: {
|
||||
external: ["client-museum-s3.png"], // Added to handle static asset import
|
||||
},
|
||||
},
|
||||
},
|
||||
themeConfig: {
|
||||
// We use the default theme (with some CSS color overrides). This
|
||||
// themeConfig block can be used to further customize the default theme.
|
||||
|
||||
@@ -2,27 +2,6 @@
|
||||
// appropriate place here.
|
||||
|
||||
export const sidebar = [
|
||||
{
|
||||
text: "Overview",
|
||||
items: [
|
||||
{
|
||||
text: "Introduction",
|
||||
link: "/overview/",
|
||||
},
|
||||
{
|
||||
text: "Community",
|
||||
link: "/overview/community",
|
||||
},
|
||||
{
|
||||
text: "Contributing",
|
||||
link: "/overview/contribute",
|
||||
},
|
||||
{
|
||||
text: "Help",
|
||||
link: "/overview/help",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Photos",
|
||||
items: [
|
||||
@@ -73,6 +52,10 @@ export const sidebar = [
|
||||
link: "/photos/features/machine-learning",
|
||||
},
|
||||
{ text: "Map", link: "/photos/features/map" },
|
||||
{
|
||||
text: "Notifications",
|
||||
link: "/photos/features/notifications",
|
||||
},
|
||||
{
|
||||
text: "Passkeys",
|
||||
link: "/photos/features/passkeys",
|
||||
@@ -335,7 +318,7 @@ export const sidebar = [
|
||||
items: [
|
||||
{
|
||||
text: "Ente via Tailscale",
|
||||
link: "/self-hosting/guides/Tailscale",
|
||||
link: "/self-hosting/guides/tailscale",
|
||||
},
|
||||
{
|
||||
text: "Ente with External S3",
|
||||
|
||||
@@ -10,4 +10,4 @@ Ende-zu-Ende-verschlüsselte Authenticator-App für jedermann. Wir sind froh, da
|
||||
du hier bist!
|
||||
|
||||
**Please note that this German translation is currently just a placeholder.**
|
||||
Know German? [Help us fill this in!](/overview/contribute).
|
||||
Know German? [Help us fill this in!](/#contribute).
|
||||
|
||||
@@ -1,15 +1,82 @@
|
||||
---
|
||||
title: Home
|
||||
description: >
|
||||
Introduction to Ente: Products, Community and Support
|
||||
---
|
||||
|
||||
# Welcome!
|
||||
|
||||
This site contains documentation and help for Ente Photos and Ente Auth. It
|
||||
describes various features, and also offers various troubleshooting suggestions.
|
||||
{width=50% style="margin: 0 auto"}
|
||||
|
||||
Use the **sidebar** menu to navigate to information about the product (Photos or
|
||||
Auth) you'd like to know more about. Or use the **search** at the top to try and
|
||||
jump directly to page that might contain the information you need.
|
||||
## Introduction
|
||||
|
||||
To know more about Ente, see [overview](/overview/) or visit our website
|
||||
[ente.io](https://ente.io).
|
||||
Ente (pronounced en-_tay_) is a end-to-end encrypted platform for privately,
|
||||
reliably, and securely storing your data on the cloud, over which 2 applications
|
||||
have been developed and made available for mobile, web and desktop, namely:
|
||||
|
||||
- **Ente Photos** - An alternative to Google Photos and Apple Photos
|
||||
- **Ente Auth** - A free 2FA alternative to Authy
|
||||
|
||||
## History
|
||||
|
||||
Ente was the founded by Vishnu Mohandas (he's also Ente's CEO) in response to
|
||||
privacy concerns with major tech companies. The underlying motivation was the
|
||||
understanding that big tech had no incentive to fix their act, but with
|
||||
end-to-end encrypted cross platform apps, there was a way for people to take
|
||||
back control over their own data without sacrificing on features.
|
||||
|
||||
### Origin of the name
|
||||
|
||||
In Malayalam, Vishnu's native language, "ente" means "mine", thus "Ente Photos"
|
||||
literally means "my photos".
|
||||
|
||||
But one day, he discovered that "ente" means "duck" in German. This unexpected
|
||||
connection sealed the deal after looking for alternative names and led to the
|
||||
adoption of ["Ducky"](https://ente.io/blog/ducky/), representing the playfulness
|
||||
and friendly nature of the community and team.
|
||||
|
||||
## Getting Started
|
||||
|
||||
We recommend reading the documentation for [Ente Photos](/photos/) or
|
||||
[Ente Auth](/auth/) to get started with installation on the desired platform,
|
||||
explore available features and usage.
|
||||
|
||||
If you are looking to self-host Ente, we recommend you to read the
|
||||
[official documentation](/self-hosting/) for updated information on getting
|
||||
started, installation, administration and maintenance.
|
||||
|
||||
## Contributing
|
||||
|
||||
There are many ways to support Ente and you don't have to be a programmer for
|
||||
that. You can spread the word, give feedback, report bugs, help us with
|
||||
translations, contribute documentation and community guides and more.
|
||||
|
||||
To suggest new features and/or offer your perspective on how we should design
|
||||
(planned and upcoming features), use our
|
||||
[GitHub discussions](https://github.com/ente-io/ente/discussions)
|
||||
|
||||
You can find our contribution guidelines
|
||||
[here](https://github.com/ente-io/ente/blob/main/CONTRIBUTING.md).
|
||||
|
||||
You can always engage with our community and team to hang out, answer queries
|
||||
and stay updated:
|
||||
|
||||
- Chat: [Discord](https://ente.io/discord)
|
||||
- Discussions: [GitHub](https://github.com/ente-io/ente/discussions)
|
||||
- Socials:
|
||||
- Twitter: [enteio](https://twitter.com/enteio)
|
||||
- Mastodon: [@ente@fosstodon.org](https://fosstodon.org/@ente)
|
||||
- Bluesky: [ente.io](https://bsky.app/profile/ente.io)
|
||||
- Instagram: [ente.app](https://www.instagram.com/ente.app)
|
||||
- Website:
|
||||
- [Blog](https://ente.io/blog)
|
||||
- [RSS](https://ente.io/blog/rss.xml)
|
||||
|
||||
## Getting Help
|
||||
|
||||
If you encounter any issues with any of the products that's not answered by our
|
||||
documentation, please reach out to our team by sending an email to
|
||||
[support@ente.io](mailto:support@ente.io)
|
||||
|
||||
For community support, please post your queries on
|
||||
[Discord](https://discord.gg/z2YVKkycX3)
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
---
|
||||
title: Community
|
||||
description: >
|
||||
Information regarding Ente's community channels
|
||||
---
|
||||
|
||||
# Community
|
||||
|
||||
## Blog
|
||||
|
||||
To stay up to date with new product launches, and behind the scenes details of
|
||||
how we're building Ente, you can read our [blog](https://ente.io/blog) (or
|
||||
subscribe to it via [RSS](https://ente.io/blog/rss.xml))
|
||||
|
||||
## Community
|
||||
|
||||
Or if you'd just like to hang out, join our
|
||||
[Discord](https://discord.gg/z2YVKkycX3), follow us on
|
||||
[Twitter](https://twitter.com/enteio) or give us a shout out on
|
||||
[Mastodon](https://mstdn.social/@ente)
|
||||
@@ -1,23 +0,0 @@
|
||||
---
|
||||
title: Contribute
|
||||
description: Details about how to contribute to Ente
|
||||
---
|
||||
|
||||
# Contributing
|
||||
|
||||
## Suggest a feature
|
||||
|
||||
To suggest new features and/or offer your perspective on how we should design
|
||||
(planned and upcoming features), use our
|
||||
[GitHub discussions](https://github.com/ente-io/ente/discussions)
|
||||
|
||||
## Documentation
|
||||
|
||||
To contribute to these docs, you can use the "Edit this page" button at the
|
||||
bottom of each page. This will allow you to directly edit the markdown file that
|
||||
is used to generate this documentation and open a quick pull request directly
|
||||
from GitHub's UI.
|
||||
|
||||
If you're more comfortable in contributing with your text editor, see the
|
||||
`docs/` folder of our GitHub repository,
|
||||
[github.com/ente-io/ente](https://github.com/ente-io/ente).
|
||||
@@ -1,13 +0,0 @@
|
||||
---
|
||||
title: Help
|
||||
description: Get help from Ente via customer support and community
|
||||
---
|
||||
|
||||
# Help
|
||||
|
||||
If you encounter any issues with any of the products that's not answered by our
|
||||
[documentation](/), please reach out to our Customer Support by sending an email
|
||||
to [support@ente.io](mailto:support@ente.io)
|
||||
|
||||
For community support, please post your queries on
|
||||
[Discord](https://discord.gg/z2YVKkycX3)
|
||||
@@ -1,50 +0,0 @@
|
||||
---
|
||||
title: Introduction
|
||||
description: >
|
||||
An overview of Ente: the company, and the people behind it, and the products
|
||||
that we make.
|
||||
---
|
||||
|
||||
# About
|
||||
|
||||
Ente (pronounced en-_tay_. Like ca<i>fe</i>) is a end-to-end encrypted platform
|
||||
for privately, reliably, and securely storing your data on the cloud. On top of
|
||||
this platform, Ente offers two products:
|
||||
|
||||
- **Ente Photos** - An alternative to Google Photos and Apple Photos
|
||||
|
||||
- **Ente Auth** - A free 2FA alternative to Authy
|
||||
|
||||
Both these apps are available for all desktop (Linux, Mac, Windows) and mobile
|
||||
(Android and iOS) platforms. They also work directly in your web browser without
|
||||
you needing to install anything.
|
||||
|
||||
More products are in the pipeline.
|
||||
|
||||
## History
|
||||
|
||||
Ente was the founded by Vishnu Mohandas (he's also Ente's CEO) in response to
|
||||
privacy concerns with major tech companies. The underlying motivation was the
|
||||
understanding that big tech had no incentive to fix their act, but with
|
||||
end-to-end encrypted cross platform apps, there was a way for people to take
|
||||
back control over their own data without sacrificing on features.
|
||||
|
||||
### What does Ente mean?
|
||||
|
||||
In Malayalam, Vishnu's native language, "ente" means "mine". Thus "Ente Photos"
|
||||
has the literal meaning "my photos".
|
||||
|
||||
This was a good name, but still Vishnu looked around for better ones. But one
|
||||
day, he discovered that "ente" means "duck" in German. This unexpected
|
||||
connection sealed the deal. We should ask him why he likes ducks so much, but
|
||||
apparently he does, so this dual meaning ("mine" / "duck") led him to finalize
|
||||
the name, and also led to the adoption of "Ducky", Ente's mascot:
|
||||
|
||||
<div align="center">
|
||||
|
||||
{width=200px}
|
||||
|
||||
</div>
|
||||
|
||||
For the full origin story of Ducky you can check out
|
||||
[this blog post](https://ente.io/blog/ducky/).
|
||||
@@ -47,8 +47,20 @@ device.
|
||||
The indexes are synced across all your devices automatically using the same
|
||||
end-to-end encrypted security that we use for syncing your photos.
|
||||
|
||||
Note that the desktop app does not currently support modifying the face
|
||||
groupings, that is only supported by the mobile app.
|
||||
---
|
||||
|
||||
#### Local indexing on mobile
|
||||
|
||||
In general the machine learning is optimized to work well on most mobile device.
|
||||
However, devices with low RAM (4-6GB) and large photo libraries might struggle
|
||||
to complete the indexing without affecting performance of the app. In such case,
|
||||
you might want to disable local indexing and let the desktop run it instead.
|
||||
|
||||
You can disable local indexing from the settings, under
|
||||
`General > Advanced > Machine learning > Configuration`. This way, you can
|
||||
continue to use the ML features without your phone performance taking any hit.
|
||||
|
||||
---
|
||||
|
||||
For more information on how to use Machine Learning for face recognition please
|
||||
check out [the FAQ](../faq/face-recognition).
|
||||
|
||||
33
docs/docs/photos/features/notifications.md
Normal file
@@ -0,0 +1,33 @@
|
||||
---
|
||||
title: Notifications
|
||||
description: Details about notifications in Ente
|
||||
---
|
||||
|
||||
# Notifications
|
||||
|
||||
The Ente app can send notifications to notify you of an update, or just to
|
||||
remind you of some sweet or helpful memory at the right time.
|
||||
|
||||
## New shared photos
|
||||
|
||||
Receive notifications when someone adds a photo to a shared album that you're a
|
||||
part of.
|
||||
|
||||
## "On this day" memories
|
||||
|
||||
Receive reminders about memories from this day in previous years. These
|
||||
reminders will only be shown if there are enough photos taken across previous
|
||||
years of the specific day.
|
||||
|
||||
## Birthday notifications
|
||||
|
||||
Receive reminders when it's someone's birthday. Tapping on the notification will
|
||||
take you to photos of the birthday person. This requires you to first add a
|
||||
birthday to a person, and will only be shown if there are enough photos of that
|
||||
person.
|
||||
|
||||
## Notification permission
|
||||
|
||||
By default all notification categories are enabled if you give notification
|
||||
permission. You can disable all of the above notification categories from
|
||||
`Settings > Notifications`. Notifications currently only work on mobile.
|
||||
@@ -66,5 +66,4 @@ If you run into any issues during your data export, please reach out to
|
||||
|
||||
Note that we also provide a
|
||||
[CLI tool](https://github.com/ente-io/ente/tree/main/cli#export) to export your
|
||||
data. You can find more information about the export in the
|
||||
[export FAQ](/photos/faq/export).
|
||||
data.
|
||||
|
||||
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
@@ -197,7 +197,7 @@ ports). The web server of choice in this guide is
|
||||
[Caddy](https://caddyserver.com) because with caddy you don't have to manually
|
||||
configure/setup SSL ceritifcates as caddy will take care of that.
|
||||
|
||||
```sh
|
||||
```groovy
|
||||
photos.yourdomain.com {
|
||||
reverse_proxy http://localhost:3001
|
||||
# for logging
|
||||
@@ -219,6 +219,7 @@ Next, start the caddy server :).
|
||||
sudo systemctl enable caddy
|
||||
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
sudo systemctl start caddy
|
||||
```
|
||||
|
||||
|
||||
@@ -18,13 +18,6 @@ Before getting start keep the following NOTE in mind.
|
||||
> and uploading will not work. This is not necessary for those who are not
|
||||
> behing CGNAT. This guide also work on docker rootless and normal.
|
||||
|
||||
> [!CAUTION] Remember that current docker update 28.0.0 has some bug and cannot
|
||||
> connect to external network. Make sure to install docker-ce 27.5.0,
|
||||
> docker-ce-rootless-extras 27.5.0 and docker-ce-cli 27.5.0. Hopefully docker
|
||||
> 28.1.0 will resolve this issue in next week. Refrence links are
|
||||
> [Moby Github Repo Issues 49511](https://github.com/moby/moby/issues/49511) and
|
||||
> [Moby Github Repo Issues 49519](https://github.com/moby/moby/issues/49519)
|
||||
|
||||
> [!IMPORTANT] For Docker rootless, the user must have local permissions for all
|
||||
> directories required by the Ente-photos self-hosted server. This can be
|
||||
> achieved by running `sudo chown -R 1000:1000 /home/ubuntu/docker/ente`. In the
|
||||
@@ -38,7 +31,7 @@ Before getting start keep the following NOTE in mind.
|
||||
> net.ipv4.ping_group_range = 0 2147483647
|
||||
> ```
|
||||
>
|
||||
> than run `sudo sysctl --system`. Create
|
||||
> then run `sudo sysctl --system`. Create
|
||||
> `~/.config/systemd/user/docker.service.d/override.conf` with the following
|
||||
> content:
|
||||
>
|
||||
@@ -55,7 +48,7 @@ Before getting start keep the following NOTE in mind.
|
||||
## GETTING START WITH SETUP
|
||||
|
||||
First of all create a directory
|
||||
`sudo mkdir -p /home/ubuntu/docker/tsdproxy/config` than `cd docker/tsdproxy`
|
||||
`sudo mkdir -p /home/ubuntu/docker/tsdproxy/config` then `cd docker/tsdproxy`
|
||||
and create compose.yaml file by running `sudo nano compose.yaml`. Populate it
|
||||
with the following:
|
||||
|
||||
@@ -5,20 +5,32 @@ description: Getting started self hosting Ente Photos and/or Ente Auth
|
||||
|
||||
# Self Hosting
|
||||
|
||||
The entire source code for Ente is open source, including the servers. This is
|
||||
The entire source code for Ente is open source,
|
||||
[including the servers](https://ente.io/blog/open-sourcing-our-server/). This is
|
||||
the same code we use for our own cloud service.
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> You might find our [blog post](https://ente.io/blog/open-sourcing-our-server/)
|
||||
> announcing the open sourcing of our server useful.
|
||||
## Requirements
|
||||
|
||||
## System requirements
|
||||
### Hardware
|
||||
|
||||
The server has minimal resource requirements, running as a lightweight Go
|
||||
binary. It performs well on small cloud instances, old laptops, and even
|
||||
The server is capable of running on minimal resource requirements as a
|
||||
lightweight Go binary, since most of the intensive computational tasks are done
|
||||
on the client. It performs well on small cloud instances, old laptops, and even
|
||||
[low-end embedded devices](https://github.com/ente-io/ente/discussions/594).
|
||||
|
||||
### Software
|
||||
|
||||
#### Operating System
|
||||
|
||||
Any Linux or \*nix operating system, Ubuntu or Debian is recommended to have a
|
||||
good Docker experience. Non-Linux operating systems tend to provide poor
|
||||
experience with Docker and difficulty with troubleshooting and assistance.
|
||||
|
||||
#### Docker
|
||||
|
||||
Required for running Ente's server, web application and dependent services
|
||||
(database and object storage)
|
||||
|
||||
## Getting started
|
||||
|
||||
Run this command on your terminal to setup Ente.
|
||||
@@ -28,12 +40,17 @@ sh -c "$(curl -fsSL https://raw.githubusercontent.com/ente-io/ente/main/server/q
|
||||
```
|
||||
|
||||
The above `curl` command pulls the Docker image, creates a directory `my-ente`
|
||||
in the current working directory and starts all containers required to run Ente.
|
||||
in the current working directory, prompts to start the cluster and starts all the containers required to run Ente.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
> [!TIP] Important:
|
||||
> If you have used quickstart for self-hosting Ente and are facing issues while > trying to run the cluster due to MinIO buckets not being created, please check [troubleshooting MinIO](/self-hosting/troubleshooting/docker#minio-provisioning-error)
|
||||
>
|
||||
>
|
||||
|
||||
## Queries?
|
||||
|
||||
If you need support, please ask on our community
|
||||
|
||||
@@ -32,10 +32,17 @@ After the installation is complete, a `Caddyfile` is created on the path
|
||||
`/etc/caddy/`. This file is used to configure reverse proxies among other
|
||||
things.
|
||||
|
||||
```yaml
|
||||
```groovy
|
||||
# Caddyfile - myente.xyz is just an example.
|
||||
api.myente.xyz { reverse_proxy http://localhost:8080 } ente.myente.xyz {
|
||||
reverse_proxy http://localhost:3000 }
|
||||
|
||||
api.myente.xyz {
|
||||
reverse_proxy http://localhost:8080
|
||||
}
|
||||
|
||||
ente.myente.xyz {
|
||||
reverse_proxy http://localhost:3000
|
||||
}
|
||||
|
||||
#...and so on for other endpoints
|
||||
```
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ minio-provision:
|
||||
sh -c '
|
||||
#!/bin/sh
|
||||
|
||||
while ! mc config host add h0 http://minio:3200 changeme changeme1234
|
||||
while ! mc alias set h0 http://minio:3200 your_minio_user your_minio_pass
|
||||
do
|
||||
echo "waiting for minio..."
|
||||
sleep 0.5
|
||||
@@ -135,3 +135,43 @@ If you're unsure about removing volumes, another alternative is to rename your
|
||||
`my-ente` folder. Docker uses the folder name to determine the volume name
|
||||
prefix, so giving it a different name will cause Docker to create a volume
|
||||
afresh for it.
|
||||
|
||||
## MinIO provisioning error
|
||||
|
||||
If you have used our quickstart script for self-hosting Ente (new users will be unaffected) and are using the default MinIO container for object storage, you may run into issues while starting the cluster after pulling latest images with provisioning MinIO and creating buckets.
|
||||
|
||||
You may encounter similar logs while trying to start the cluster:
|
||||
|
||||
```
|
||||
my-ente-minio-1 -> | Waiting for minio...
|
||||
my-ente-minio-1 -> | Waiting for minio...
|
||||
my-ente-minio-1 -> | Waiting for minio...
|
||||
```
|
||||
|
||||
MinIO has deprecated the `mc config` command in favor of `mc alias set` resulting in failure in execution of the command for creating bucket using `post_start` hook.
|
||||
|
||||
This can be resolved by changing `mc config host h0 add http://minio:3200 $minio_user $minio_pass` to `mc alias set h0 http://minio:3200 $minio_user $minio_pass`
|
||||
|
||||
Thus the updated `post_start` will look as follows for `minio` service:
|
||||
|
||||
``` yaml
|
||||
minio:
|
||||
...
|
||||
post_start:
|
||||
- command: |
|
||||
sh -c '
|
||||
#!/bin/sh
|
||||
|
||||
while ! mc alias set h0 http://minio:3200 your_minio_user your_minio_pass 2>/dev/null
|
||||
do
|
||||
echo "Waiting for minio..."
|
||||
sleep 0.5
|
||||
done
|
||||
|
||||
cd /data
|
||||
|
||||
mc mb -p b2-eu-cen
|
||||
mc mb -p wasabi-eu-central-2-v3
|
||||
mc mb -p scw-eu-fr-v3
|
||||
'
|
||||
```
|
||||
@@ -142,4 +142,14 @@ dependencies {
|
||||
testImplementation 'junit:junit:4.12'
|
||||
androidTestImplementation 'androidx.test:runner:1.1.1'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
|
||||
|
||||
|
||||
constraints {
|
||||
implementation("androidx.work:work-runtime:2.8.1") {
|
||||
because("Align work-runtime versions")
|
||||
}
|
||||
implementation("androidx.work:work-runtime-ktx:2.8.1") {
|
||||
because("Align work-runtime-ktx versions")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
<network-security-config>
|
||||
<base-config>
|
||||
<base-config cleartextTrafficPermitted="true">
|
||||
<trust-anchors>
|
||||
<certificates src="system" />
|
||||
<certificates src="user" />
|
||||
|
||||
@@ -9,9 +9,6 @@ allprojects {
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
// mavenLocal() // for FDroid
|
||||
maven {
|
||||
url "${project(':background_fetch').projectDir}/libs"
|
||||
}
|
||||
maven {
|
||||
url "${project(':ffmpeg_kit_flutter').projectDir}/libs"
|
||||
}
|
||||
|
||||
4
mobile/assets/icons/list_view_icon_dark.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.75 6.75H21.75M6.75 12H21.75M6.75 17.25H21.75" stroke="white" stroke-opacity="0.6" stroke-width="2.25" stroke-linejoin="round"/>
|
||||
<path d="M3 6H4.5V7.5H3V6ZM3 11.25H4.5V12.75H3V11.25ZM3 16.5H4.5V18H3V16.5Z" stroke="white" stroke-opacity="0.6" stroke-width="1.5" stroke-linecap="square" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 425 B |
4
mobile/assets/icons/list_view_icon_light.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.75 6.75H21.75M6.75 12H21.75M6.75 17.25H21.75" stroke="black" stroke-opacity="0.6" stroke-width="2.25" stroke-linejoin="round"/>
|
||||
<path d="M3 6H4.5V7.5H3V6ZM3 11.25H4.5V12.75H3V11.25ZM3 16.5H4.5V18H3V16.5Z" stroke="black" stroke-opacity="0.6" stroke-width="1.5" stroke-linecap="square" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 425 B |
3
mobile/assets/icons/search_icon_dark.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15.7548 14.394L12.1277 10.7669C13.0009 9.60436 13.4723 8.18933 13.4707 6.73536C13.4707 3.02151 10.4492 0 6.73536 0C3.02151 0 0 3.02151 0 6.73536C0 10.4492 3.02151 13.4707 6.73536 13.4707C8.18933 13.4723 9.60436 13.0009 10.7669 12.1277L14.394 15.7548C14.5776 15.9189 14.8171 16.0065 15.0632 15.9996C15.3094 15.9927 15.5436 15.8919 15.7177 15.7177C15.8919 15.5436 15.9927 15.3094 15.9996 15.0632C16.0065 14.8171 15.9189 14.5776 15.7548 14.394ZM1.92439 6.73536C1.92439 5.78384 2.20655 4.85369 2.73518 4.06253C3.26382 3.27137 4.01519 2.65473 4.89428 2.2906C5.77337 1.92647 6.7407 1.8312 7.67393 2.01683C8.60717 2.20246 9.4644 2.66066 10.1372 3.33349C10.8101 4.00632 11.2683 4.86355 11.4539 5.79679C11.6395 6.73002 11.5442 7.69735 11.1801 8.57644C10.816 9.45553 10.1994 10.2069 9.40819 10.7355C8.61703 11.2642 7.68688 11.5463 6.73536 11.5463C5.45988 11.5448 4.23708 11.0374 3.33518 10.1355C2.43328 9.23364 1.92592 8.01084 1.92439 6.73536Z" fill="white" fill-opacity="0.6"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
3
mobile/assets/icons/search_icon_light.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15.7548 14.394L12.1277 10.7669C13.0009 9.60436 13.4723 8.18933 13.4707 6.73536C13.4707 3.02151 10.4492 0 6.73536 0C3.02151 0 0 3.02151 0 6.73536C0 10.4492 3.02151 13.4707 6.73536 13.4707C8.18933 13.4723 9.60436 13.0009 10.7669 12.1277L14.394 15.7548C14.5776 15.9189 14.8171 16.0065 15.0632 15.9996C15.3094 15.9927 15.5436 15.8919 15.7177 15.7177C15.8919 15.5436 15.9927 15.3094 15.9996 15.0632C16.0065 14.8171 15.9189 14.5776 15.7548 14.394ZM1.92439 6.73536C1.92439 5.78384 2.20655 4.85369 2.73518 4.06253C3.26382 3.27137 4.01519 2.65473 4.89428 2.2906C5.77337 1.92647 6.7407 1.8312 7.67393 2.01683C8.60717 2.20246 9.4644 2.66066 10.1372 3.33349C10.8101 4.00632 11.2683 4.86355 11.4539 5.79679C11.6395 6.73002 11.5442 7.69735 11.1801 8.57644C10.816 9.45553 10.1994 10.2069 9.40819 10.7355C8.61703 11.2642 7.68688 11.5463 6.73536 11.5463C5.45988 11.5448 4.23708 11.0374 3.33518 10.1355C2.43328 9.23364 1.92592 8.01084 1.92439 6.73536Z" fill="black" fill-opacity="0.6"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -10,7 +10,12 @@
|
||||
"type": "dart",
|
||||
"flutterMode": "debug",
|
||||
"program": "mobile/lib/main.dart",
|
||||
"args": ["--flavor", "independent"]
|
||||
"args": [
|
||||
"--flavor",
|
||||
"independent",
|
||||
"--dart-define",
|
||||
"cronetHttpNoPlay=true"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Photos Android Local",
|
||||
@@ -24,7 +29,9 @@
|
||||
"--dart-define",
|
||||
"endpoint=http://localhost:8080",
|
||||
"--dart-define",
|
||||
"web-family=http://localhost:3003"
|
||||
"web-family=http://localhost:3003",
|
||||
"--dart-define",
|
||||
"cronetHttpNoPlay=true"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
36
mobile/fastlane/metadata/android/ku/full_description.txt
Normal file
@@ -0,0 +1,36 @@
|
||||
ente is a simple app to backup and share your photos and videos.
|
||||
|
||||
If you've been looking for a privacy-friendly alternative to Google Photos, you've come to the right place. With ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them.
|
||||
|
||||
We have open-source apps across Android, iOS, web and desktop, and your photos will seamlessly sync between all of them in an end-to-end encrypted (e2ee) manner.
|
||||
|
||||
ente also makes it simple to share your albums with your loved ones, even if they aren't on ente. You can share publicly viewable links, where they can view your album and collaborate by adding photos to it, even without an account or app.
|
||||
|
||||
Your encrypted data is replicated to 3 different locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
|
||||
|
||||
We are here to make the safest photos app ever, come join our journey!
|
||||
|
||||
FEATURES
|
||||
- Original quality backups, because every pixel is important
|
||||
- Family plans, so you can share storage with your family
|
||||
- Collaborative albums, so you can pool together photos after a trip
|
||||
- Shared folders, in case you want your partner to enjoy your "Camera" clicks
|
||||
- Album links, that can be protected with a password
|
||||
- Ability to free up space, by removing files that have been safely backed up
|
||||
- Human support, because you're worth it
|
||||
- Descriptions, so you can caption your memories and find them easily
|
||||
- Image editor, to add finishing touches
|
||||
- Favorite, hide and relive your memories, for they are precious
|
||||
- One-click import from Google, Apple, your hard drive and more
|
||||
- Dark theme, because your photos look good in it
|
||||
- 2FA, 3FA, biometric auth
|
||||
- and a LOT more!
|
||||
|
||||
PERMISSIONS
|
||||
ente requests for certain permissions to serve the purpose of a photo storage provider, which can be reviewed here: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md
|
||||
|
||||
PRICING
|
||||
We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
|
||||
|
||||
SUPPORT
|
||||
We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.
|
||||
@@ -0,0 +1 @@
|
||||
ente is an end-to-end encrypted photo storage app
|
||||
1
mobile/fastlane/metadata/android/ku/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
ente - encrypted photo storage
|
||||
@@ -4,33 +4,33 @@ Se busca por uma alternativa do Google Fotos baseada em privacidade, chegaste ao
|
||||
|
||||
Temos aplicações de fonte aberta para Android, iOS, sítio web e desktop, e as fotos serão perfeitamente sincronizadas entre todas elas numa maneira de encriptação de ponta a ponta (e2ee).
|
||||
|
||||
Ente também simplifica a partilha dos seus álbuns com os seus entes queridos, mesmo que estes não estejam no ente. Pode partilhar ligações visíveis publicamente, onde podem ver o seu álbum e colaborar adicionando fotografias ao mesmo, mesmo sem uma conta ou aplicação.
|
||||
Ente facilita o partilhamento dos seus álbuns com entes queridos, mesmo se não estiverem no ente. Pode partilhar ligações visíveis a público, onde eles podem ver o seu álbum e colaborar a adicionar fotos, mesmo sem uma conta ou a aplicação.
|
||||
|
||||
Os seus dados encriptados são replicados em 3 locais diferentes, incluindo um abrigo de emergência em Paris. Levamos a posteridade a sério e facilitamos a tarefa de garantir que as suas memórias perdurem para além de si.
|
||||
Os dados são replicados em 3 localizações diferentes, incluindo um posto em Paris. Levamos a nossa postura a sério e facilitamos para certificarmos que as suas memórias revivam-no.
|
||||
|
||||
Estamos aqui para criar a aplicação de fotografias mais segura de sempre, junte-se à nossa viagem!
|
||||
Estamos aqui para fazer a aplicação mais segura do mundo, venha e adere a nossa jornada!
|
||||
|
||||
RECURSOS
|
||||
- Cópias de segurança de qualidade original, porque cada pixel é importante
|
||||
- Planos familiares, para que possa partilhar o armazenamento com a sua família
|
||||
- Álbuns colaborativos, para que possa reunir fotos depois de uma viagem
|
||||
- Pastas partilhadas, caso queira que o seu parceiro desfrute dos seus cliques na “Câmara”
|
||||
- Links para álbuns, que podem ser protegidas com uma palavra-passe
|
||||
- Capacidade de libertar espaço, removendo ficheiros dos quais foi feita uma cópia de segurança segura
|
||||
- Apoio humano, porque vale a pena
|
||||
- Descrições, para que possa legendar as suas memórias e encontrá-las facilmente
|
||||
- Editor de imagens, para dar os retoques finais
|
||||
- Favoritar, ocultar e reviver suas memórias, pois elas são preciosas
|
||||
- Importação com um clique do Google, da Apple, do seu disco rígido e muito mais
|
||||
- Tema escuro, porque as suas fotos ficam bem com ele
|
||||
FUNCIONALIDADES
|
||||
- Backups com qualidade original, por cada píxel valer a pena
|
||||
- Planos em família, para poder partilhar armazenamento com familiares
|
||||
- Álbuns de colaboração, para unir fotos depois de uma caminhada
|
||||
- Pastas partilhadas, se quiser que o seu parceiro desfrute dos seus cliques na "Câmara"
|
||||
- Ligações para álbuns, que podem ser protegidos com uma palavra-passe
|
||||
- Possibilidade de liberar espaço, removendo ficheiros que já foram feitos backup
|
||||
- Suporte físico, por valer a pena
|
||||
- Descrições, para entender as suas memórias e encontrá-las facilmente
|
||||
- Editor de imagens, para dar retoques finais
|
||||
- Adicionar aos favoritos, obscurecer e reviver as suas memórias, para aqueles tão preciosos
|
||||
- Importar num só clique do Google, Apple, e o seu disco rígido e mais
|
||||
- Tema escuro, para as suas fotos encaixarem melhor
|
||||
- 2FA, 3FA, autenticação biométrica
|
||||
- e MUITO mais!
|
||||
- e MAIS além!
|
||||
|
||||
PERMISSÕES
|
||||
ente solicita determinadas permissões para servir o objetivo de um fornecedor de armazenamento de fotografias, que pode ser consultado aqui: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md
|
||||
Ente pede por certas permissões para servir o propósito dum provedor de armazenamento de foto, onde pode ser revisto aqui: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md
|
||||
|
||||
PREÇO
|
||||
Não oferecemos planos gratuitos para sempre, porque é importante para nós mantermo-nos sustentáveis e resistirmos ao teste do tempo. Em vez disso, oferecemos planos acessíveis que pode partilhar livremente com a sua família. Pode encontrar mais informações em ente.io.
|
||||
Não garantimos planos gratuitos para sempre, já que é importante a nós mantermo-nos sustentáveis e conseguirmos superar o desafio do tempo. Ao invés, garantimos planos acessíveis para poder partilhar livremente com os seus familiares. Para mais informações, consulte "ente.io"
|
||||
|
||||
SUPPORT
|
||||
Orgulhamo-nos de oferecer um apoio humano Se for nosso cliente pago, pode contactar team@ente.io e esperar uma resposta da nossa equipa no prazo de 24 horas.
|
||||
SUPORTE
|
||||
Estamos orgulhosos ao oferecer suporte físico. Se for um cliente pago, pode contactar a nossa equipa através de "team@ente.io" e esperar uma resposta nossa dentro de um dia.
|
||||
|
||||
33
mobile/fastlane/metadata/ios/ku/description.txt
Normal file
@@ -0,0 +1,33 @@
|
||||
Ente is a simple app to automatically backup and organize your photos and videos.
|
||||
|
||||
If you've been looking for a privacy-friendly alternative to preserve your memories, you've come to the right place. With Ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them.
|
||||
|
||||
We have apps across all platforms, and your photos will seamlessly sync between all your devices in an end-to-end encrypted (e2ee) manner.
|
||||
|
||||
Ente also makes it simple to share your albums with your loved ones. You can either share them directly with other Ente users, end-to-end encrypted; or with publicly viewable links.
|
||||
|
||||
Your encrypted data is stored across multiple locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
|
||||
|
||||
We are here to make the safest photos app ever, come join our journey!
|
||||
|
||||
FEATURES
|
||||
- Original quality backups, because every pixel is important
|
||||
- Family plans, so you can share storage with your family
|
||||
- Shared folders, in case you want your partner to enjoy your "Camera" clicks
|
||||
- Album links, that can be protected with a password and set to expire
|
||||
- Ability to free up space, by removing files that have been safely backed up
|
||||
- Image editor, to add finishing touches
|
||||
- Favorite, hide and relive your memories, for they are precious
|
||||
- One-click import from all major storage providers
|
||||
- Dark theme, because your photos look good in it
|
||||
- 2FA, 3FA, biometric auth
|
||||
- and a LOT more!
|
||||
|
||||
PRICING
|
||||
We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
|
||||
|
||||
SUPPORT
|
||||
We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.
|
||||
|
||||
TERMS
|
||||
https://ente.io/terms
|
||||
1
mobile/fastlane/metadata/ios/ku/keywords.txt
Normal file
@@ -0,0 +1 @@
|
||||
photos,photography,family,privacy,cloud,backup,videos,photo,encryption,storage,album,alternative
|
||||
1
mobile/fastlane/metadata/ios/ku/name.txt
Normal file
@@ -0,0 +1 @@
|
||||
Ente Photos
|
||||
1
mobile/fastlane/metadata/ios/ku/subtitle.txt
Normal file
@@ -0,0 +1 @@
|
||||
Encrypted photo storage
|
||||
30
mobile/fastlane/metadata/playstore/ku/full_description.txt
Normal file
@@ -0,0 +1,30 @@
|
||||
Ente is a simple app to automatically backup and organize your photos and videos.
|
||||
|
||||
If you've been looking for a privacy-friendly alternative to preserve your memories, you've come to the right place. With Ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them.
|
||||
|
||||
We have apps across Android, iOS, web and Desktop, and your photos will seamlessly sync between all your devices in an end-to-end encrypted (e2ee) manner.
|
||||
|
||||
Ente also makes it simple to share your albums with your loved ones. You can either share them directly with other Ente users, end-to-end encrypted; or with publicly viewable links.
|
||||
|
||||
Your encrypted data is stored across multiple locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
|
||||
|
||||
We are here to make the safest photos app ever, come join our journey!
|
||||
|
||||
✨ FEATURES
|
||||
- Original quality backups, because every pixel is important
|
||||
- Family plans, so you can share storage with your family
|
||||
- Shared folders, in case you want your partner to enjoy your "Camera" clicks
|
||||
- Album links, that can be protected with a password and set to expire
|
||||
- Ability to free up space, by removing files that have been safely backed up
|
||||
- Image editor, to add finishing touches
|
||||
- Favorite, hide and relive your memories, for they are precious
|
||||
- One-click import from Google, Apple, your hard drive and more
|
||||
- Dark theme, because your photos look good in it
|
||||
- 2FA, 3FA, biometric auth
|
||||
- and a LOT more!
|
||||
|
||||
💲 PRICING
|
||||
We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
|
||||
|
||||
🙋 SUPPORT
|
||||
We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.
|
||||
@@ -0,0 +1 @@
|
||||
Encrypted photo storage - backup, organize and share your photos and videos
|
||||
1
mobile/fastlane/metadata/playstore/ku/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
Ente Photos
|
||||
@@ -2,29 +2,29 @@ Ente é uma aplicação simples feita para fazer backup automaticamente e organi
|
||||
|
||||
Se busca por uma alternativa mais privada para preservar as suas memórias, chegaste ao lugar correto. Com Ente, eles são armazenados em encriptação de ponta a ponta (e2ee). Isto significa que só vos podeis vê-las.
|
||||
|
||||
Temos aplicações para Android, iOS, Web e ambiente de trabalho, e as suas fotografias serão perfeitamente sincronizadas entre todos os seus dispositivos de uma forma encriptada de ponta a ponta (e2ee).
|
||||
Nós temos aplicações em Android, iOS, Sítio Web e Desktop, todas as suas fotos são sincronizadas sem parar entre os aparelhos numa forma de encriptação (e2ee).
|
||||
|
||||
O Ente também simplifica a partilha dos seus álbuns com os seus entes queridos Pode partilhá-los diretamente com outros utilizadores do Ente, encriptados de ponta a ponta, ou com ligações publicamente visíveis.
|
||||
Ente também facilita a partilha de álbuns com entes queridos. É possível partilhá-los diretamente com outros utilizadores, em encriptação ponta-a-ponta; ou com ligações visíveis a público.
|
||||
|
||||
Os seus dados encriptados são armazenados em vários locais, incluindo um abrigo de emergência em Paris. Levamos a posteridade a sério e facilitamos a tarefa de garantir que as suas memórias perdurem para além de si.
|
||||
Os seus dados encriptados são armazenados em várias localizações, incluindo um abrigo avançado em Paris. Levamos a nossa postura a sério e facilitamos para certificarmos que as suas memórias revivam-no.
|
||||
|
||||
Estamos aqui para criar a aplicação de fotografias mais segura de sempre, junte-se à nossa viagem!
|
||||
Estamos aqui para fazer a aplicação mais segura do mundo, venha e adere a nossa jornada!
|
||||
|
||||
✨ RECURSOS
|
||||
- Cópias de segurança de qualidade original, porque cada pixel é importante
|
||||
- Planos familiares, para que possa partilhar o armazenamento com a sua família
|
||||
- Pastas partilhadas, caso queira que o seu parceiro desfrute dos seus cliques na “Câmara”
|
||||
- Links para álbuns, que podem ser protegidas com uma palavra-passe e definidas para expirar
|
||||
- Capacidade de libertar espaço, removendo ficheiros dos quais foi feita uma cópia de segurança segura
|
||||
- Editor de imagens, para dar os retoques finais
|
||||
- Favoritar, ocultar e reviver suas memórias, pois elas são preciosas
|
||||
- Importação com um clique do Google, da Apple, do seu disco rígido e muito mais
|
||||
- Tema escuro, porque as suas fotografias ficam bem com ele
|
||||
✨ FUNCIONALIDADES
|
||||
- Backups com qualidade original, por cada píxel valer a pena
|
||||
- Planos em família, para poder partilhar armazenamento com familiares
|
||||
- Pastas partilhadas, para que o seu parceiro desfrute de cliques na "Câmara"
|
||||
- Links de álbuns, para poder ser protegido por uma palavra-passe e definido para expiração
|
||||
- Possibilidade de liberar espaço, removendo ficheiros que já foram feitos backup
|
||||
- Editor de imagens, para dar retoques finais
|
||||
- Adicionar aos favoritos, obscurecer e reviver as suas memórias, para aqueles tão preciosos
|
||||
- Importar num só clique do Google, Apple, e o seu disco rígido e mais
|
||||
- Tema escuro, para as suas fotos encaixarem melhor
|
||||
- 2FA, 3FA, autenticação biométrica
|
||||
- and a LOT more!
|
||||
- e MAIS além!
|
||||
|
||||
💲 PREÇOS
|
||||
Não oferecemos planos gratuitos para sempre, porque é importante para nós mantermo-nos sustentáveis e resistirmos ao teste do tempo. Em vez disso, oferecemos planos acessíveis que pode partilhar livremente com a sua família. Pode encontrar mais informações em ente.io.
|
||||
Não garantimos planos gratuitos para sempre, já que é importante a nós mantermo-nos sustentáveis e conseguirmos superar o desafio do tempo. Ao invés, garantimos planos acessíveis para poder partilhar livremente com os seus familiares. Para mais informações, consulte "ente.io"
|
||||
|
||||
🙋 SUPPORT
|
||||
Orgulhamo-nos de oferecer um apoio humano. Se for nosso cliente pago, pode contactar team@ente.io e esperar uma resposta da nossa equipa no prazo de 24 horas.
|
||||
🙋 SUPORTE
|
||||
Estamos orgulhosos ao oferecer suporte físico. Se for um cliente pago, pode contactar a nossa equipa através de "team@ente.io" e esperar uma resposta nossa dentro de um dia.
|
||||
@@ -1,8 +1,6 @@
|
||||
PODS:
|
||||
- app_links (0.0.2):
|
||||
- Flutter
|
||||
- background_fetch (1.3.7):
|
||||
- Flutter
|
||||
- battery_info (0.0.1):
|
||||
- Flutter
|
||||
- connectivity_plus (0.0.1):
|
||||
@@ -82,28 +80,28 @@ PODS:
|
||||
- GoogleDataTransport (10.1.0):
|
||||
- nanopb (~> 3.30910.0)
|
||||
- PromisesObjC (~> 2.4)
|
||||
- GoogleUtilities/AppDelegateSwizzler (8.0.2):
|
||||
- GoogleUtilities/AppDelegateSwizzler (8.1.0):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Network
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Environment (8.0.2):
|
||||
- GoogleUtilities/Environment (8.1.0):
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Logger (8.0.2):
|
||||
- GoogleUtilities/Logger (8.1.0):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Network (8.0.2):
|
||||
- GoogleUtilities/Network (8.1.0):
|
||||
- GoogleUtilities/Logger
|
||||
- "GoogleUtilities/NSData+zlib"
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Reachability
|
||||
- "GoogleUtilities/NSData+zlib (8.0.2)":
|
||||
- "GoogleUtilities/NSData+zlib (8.1.0)":
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Privacy (8.0.2)
|
||||
- GoogleUtilities/Reachability (8.0.2):
|
||||
- GoogleUtilities/Privacy (8.1.0)
|
||||
- GoogleUtilities/Reachability (8.1.0):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/UserDefaults (8.0.2):
|
||||
- GoogleUtilities/UserDefaults (8.1.0):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Privacy
|
||||
- home_widget (0.0.1):
|
||||
@@ -129,6 +127,9 @@ PODS:
|
||||
- libwebp/sharpyuv (1.5.0)
|
||||
- libwebp/webp (1.5.0):
|
||||
- libwebp/sharpyuv
|
||||
- local_auth_darwin (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- local_auth_ios (0.0.1):
|
||||
- Flutter
|
||||
- Mantle (2.2.0):
|
||||
@@ -153,7 +154,7 @@ PODS:
|
||||
- nanopb/encode (= 3.30910.0)
|
||||
- nanopb/decode (3.30910.0)
|
||||
- nanopb/encode (3.30910.0)
|
||||
- native_video_player (1.0.0):
|
||||
- native_video_player (4.0.0):
|
||||
- Flutter
|
||||
- objective_c (0.0.1):
|
||||
- Flutter
|
||||
@@ -183,14 +184,14 @@ PODS:
|
||||
- PromisesObjC (2.4.0)
|
||||
- receive_sharing_intent (1.8.1):
|
||||
- Flutter
|
||||
- SDWebImage (5.21.0):
|
||||
- SDWebImage/Core (= 5.21.0)
|
||||
- SDWebImage/Core (5.21.0)
|
||||
- SDWebImage (5.21.1):
|
||||
- SDWebImage/Core (= 5.21.1)
|
||||
- SDWebImage/Core (5.21.1)
|
||||
- SDWebImageWebPCoder (0.14.6):
|
||||
- libwebp (~> 1.0)
|
||||
- SDWebImage/Core (~> 5.17)
|
||||
- Sentry/HybridSDK (8.46.0)
|
||||
- sentry_flutter (8.14.1):
|
||||
- sentry_flutter (8.14.2):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- Sentry/HybridSDK (= 8.46.0)
|
||||
@@ -202,16 +203,16 @@ PODS:
|
||||
- sqflite_darwin (0.0.4):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- sqlite3 (3.49.1):
|
||||
- sqlite3/common (= 3.49.1)
|
||||
- sqlite3/common (3.49.1)
|
||||
- sqlite3/dbstatvtab (3.49.1):
|
||||
- sqlite3 (3.49.2):
|
||||
- sqlite3/common (= 3.49.2)
|
||||
- sqlite3/common (3.49.2)
|
||||
- sqlite3/dbstatvtab (3.49.2):
|
||||
- sqlite3/common
|
||||
- sqlite3/fts5 (3.49.1):
|
||||
- sqlite3/fts5 (3.49.2):
|
||||
- sqlite3/common
|
||||
- sqlite3/perf-threadsafe (3.49.1):
|
||||
- sqlite3/perf-threadsafe (3.49.2):
|
||||
- sqlite3/common
|
||||
- sqlite3/rtree (3.49.1):
|
||||
- sqlite3/rtree (3.49.2):
|
||||
- sqlite3/common
|
||||
- sqlite3_flutter_libs (0.0.1):
|
||||
- Flutter
|
||||
@@ -239,10 +240,11 @@ PODS:
|
||||
- Flutter
|
||||
- wakelock_plus (0.0.1):
|
||||
- Flutter
|
||||
- workmanager (0.0.1):
|
||||
- Flutter
|
||||
|
||||
DEPENDENCIES:
|
||||
- app_links (from `.symlinks/plugins/app_links/ios`)
|
||||
- background_fetch (from `.symlinks/plugins/background_fetch/ios`)
|
||||
- battery_info (from `.symlinks/plugins/battery_info/ios`)
|
||||
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
|
||||
- cupertino_http (from `.symlinks/plugins/cupertino_http/darwin`)
|
||||
@@ -267,6 +269,7 @@ DEPENDENCIES:
|
||||
- in_app_purchase_storekit (from `.symlinks/plugins/in_app_purchase_storekit/darwin`)
|
||||
- integration_test (from `.symlinks/plugins/integration_test/ios`)
|
||||
- launcher_icon_switcher (from `.symlinks/plugins/launcher_icon_switcher/ios`)
|
||||
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
|
||||
- local_auth_ios (from `.symlinks/plugins/local_auth_ios/ios`)
|
||||
- maps_launcher (from `.symlinks/plugins/maps_launcher/ios`)
|
||||
- media_extension (from `.symlinks/plugins/media_extension/ios`)
|
||||
@@ -298,9 +301,10 @@ DEPENDENCIES:
|
||||
- video_thumbnail (from `.symlinks/plugins/video_thumbnail/ios`)
|
||||
- volume_controller (from `.symlinks/plugins/volume_controller/ios`)
|
||||
- wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`)
|
||||
- workmanager (from `.symlinks/plugins/workmanager/ios`)
|
||||
|
||||
SPEC REPOS:
|
||||
https://github.com/ente-io/ffmpeg-kit-custom-repo-ios:
|
||||
https://github.com/ente-io/ffmpeg-kit-custom-repo-ios.git:
|
||||
- ffmpeg_kit_custom
|
||||
trunk:
|
||||
- Firebase
|
||||
@@ -325,8 +329,6 @@ SPEC REPOS:
|
||||
EXTERNAL SOURCES:
|
||||
app_links:
|
||||
:path: ".symlinks/plugins/app_links/ios"
|
||||
background_fetch:
|
||||
:path: ".symlinks/plugins/background_fetch/ios"
|
||||
battery_info:
|
||||
:path: ".symlinks/plugins/battery_info/ios"
|
||||
connectivity_plus:
|
||||
@@ -375,6 +377,8 @@ EXTERNAL SOURCES:
|
||||
:path: ".symlinks/plugins/integration_test/ios"
|
||||
launcher_icon_switcher:
|
||||
:path: ".symlinks/plugins/launcher_icon_switcher/ios"
|
||||
local_auth_darwin:
|
||||
:path: ".symlinks/plugins/local_auth_darwin/darwin"
|
||||
local_auth_ios:
|
||||
:path: ".symlinks/plugins/local_auth_ios/ios"
|
||||
maps_launcher:
|
||||
@@ -437,84 +441,87 @@ EXTERNAL SOURCES:
|
||||
:path: ".symlinks/plugins/volume_controller/ios"
|
||||
wakelock_plus:
|
||||
:path: ".symlinks/plugins/wakelock_plus/ios"
|
||||
workmanager:
|
||||
:path: ".symlinks/plugins/workmanager/ios"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
app_links: 76b66b60cc809390ca1ad69bfd66b998d2387ac7
|
||||
background_fetch: 94b36ee293e82972852dba8ede1fbcd3bd3d9d57
|
||||
battery_info: 83f3aae7be2fccefab1d2bf06b8aa96f11c8bcdd
|
||||
connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
|
||||
cupertino_http: 94ac07f5ff090b8effa6c5e2c47871d48ab7c86c
|
||||
dart_ui_isolate: 46f6714abe6891313267153ef6f9748d8ecfcab1
|
||||
device_info_plus: 335f3ce08d2e174b9fdc3db3db0f4e3b1f66bd89
|
||||
app_links: f3e17e4ee5e357b39d8b95290a9b2c299fca71c6
|
||||
battery_info: b6c551049266af31556b93c9d9b9452cfec0219f
|
||||
connectivity_plus: 2a701ffec2c0ae28a48cf7540e279787e77c447d
|
||||
cupertino_http: 947a233f40cfea55167a49f2facc18434ea117ba
|
||||
dart_ui_isolate: d5bcda83ca4b04f129d70eb90110b7a567aece14
|
||||
device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6
|
||||
ffmpeg_kit_custom: 682b4f2f1ff1f8abae5a92f6c3540f2441d5be99
|
||||
ffmpeg_kit_flutter: 915b345acc97d4142e8a9a8549d177ff10f043f5
|
||||
file_saver: 6cdbcddd690cb02b0c1a0c225b37cd805c2bf8b6
|
||||
ffmpeg_kit_flutter: 9dce4803991478c78c6fb9f972703301101095fe
|
||||
file_saver: 503e386464dbe118f630e17b4c2e1190fa0cf808
|
||||
Firebase: d80354ed7f6df5f9aca55e9eb47cc4b634735eaf
|
||||
firebase_core: 6cbed78b4f298ed103a9fd034e6dbc846320480f
|
||||
firebase_messaging: 5e0adf2eb18b0ee59aa0c109314c091a0497ecac
|
||||
firebase_core: 6e223dfa350b2edceb729cea505eaaef59330682
|
||||
firebase_messaging: 07fde77ae28c08616a1d4d870450efc2b38cf40d
|
||||
FirebaseCore: 99fe0c4b44a39f37d99e6404e02009d2db5d718d
|
||||
FirebaseCoreInternal: df24ce5af28864660ecbd13596fc8dd3a8c34629
|
||||
FirebaseInstallations: 6c963bd2a86aca0481eef4f48f5a4df783ae5917
|
||||
FirebaseMessaging: 487b634ccdf6f7b7ff180fdcb2a9935490f764e8
|
||||
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
|
||||
flutter_email_sender: aa1e9772696691d02cd91fea829856c11efb8e58
|
||||
flutter_image_compress_common: 1697a328fd72bfb335507c6bca1a65fa5ad87df1
|
||||
flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99
|
||||
flutter_local_notifications: a5a732f069baa862e728d839dd2ebb904737effb
|
||||
flutter_native_splash: 6cad9122ea0fad137d23137dd14b937f3e90b145
|
||||
flutter_secure_storage: 2c2ff13db9e0a5647389bff88b0ecac56e3f3418
|
||||
flutter_sodium: 7e4621538491834eba53bd524547854bcbbd6987
|
||||
flutter_timezone: 7c838e17ffd4645d261e87037e5bebf6d38fe544
|
||||
fluttertoast: 2c67e14dce98bbdb200df9e1acf610d7a6264ea1
|
||||
flutter_email_sender: e03bdda7637bcd3539bfe718fddd980e9508efaa
|
||||
flutter_image_compress_common: ec1d45c362c9d30a3f6a0426c297f47c52007e3e
|
||||
flutter_inappwebview_ios: 6f63631e2c62a7c350263b13fa5427aedefe81d4
|
||||
flutter_local_notifications: ff50f8405aaa0ccdc7dcfb9022ca192e8ad9688f
|
||||
flutter_native_splash: f71420956eb811e6d310720fee915f1d42852e7a
|
||||
flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be
|
||||
flutter_sodium: a00383520fc689c688b66fd3092984174712493e
|
||||
flutter_timezone: ac3da59ac941ff1c98a2e1f0293420e020120282
|
||||
fluttertoast: 21eecd6935e7064cc1fcb733a4c5a428f3f24f0f
|
||||
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
||||
GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d
|
||||
home_widget: f169fc41fd807b4d46ab6615dc44d62adbf9f64f
|
||||
image_editor_common: 3de87e7c4804f4ae24c8f8a998362b98c105cac1
|
||||
in_app_purchase_storekit: d1a48cb0f8b29dbf5f85f782f5dd79b21b90a5e6
|
||||
integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e
|
||||
launcher_icon_switcher: 84c218d233505aa7d8655d8fa61a3ba802c022da
|
||||
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
|
||||
home_widget: 0434835a4c9a75704264feff6be17ea40e0f0d57
|
||||
image_editor_common: d6f6644ae4a6de80481e89fe6d0a8c49e30b4b43
|
||||
in_app_purchase_storekit: a1ce04056e23eecc666b086040239da7619cd783
|
||||
integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
|
||||
launcher_icon_switcher: 8e0ad2131a20c51c1dd939896ee32e70cd845b37
|
||||
libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8
|
||||
local_auth_ios: f7a1841beef3151d140a967c2e46f30637cdf451
|
||||
local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3
|
||||
local_auth_ios: 5046a18c018dd973247a0564496c8898dbb5adf9
|
||||
Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
|
||||
maps_launcher: edf829809ba9e894d70e569bab11c16352dedb45
|
||||
media_extension: 671e2567880d96c95c65c9a82ccceed8f2e309fd
|
||||
media_kit_libs_ios_video: 5a18affdb97d1f5d466dc79988b13eff6c5e2854
|
||||
media_kit_video: 1746e198cb697d1ffb734b1d05ec429d1fcd1474
|
||||
motion_sensors: 741e702c17467b9569a92165dda8d4d88c6167f1
|
||||
motionphoto: 23e2aeb5c6380112f69468d71f970fa7438e5ed1
|
||||
move_to_background: 7e3467dd2a1d1013e98c9c1cb93fd53cd7ef9d84
|
||||
maps_launcher: 2e5b6a2d664ec6c27f82ffa81b74228d770ab203
|
||||
media_extension: 6618f07abd762cdbfaadf1b0c56a287e820f0c84
|
||||
media_kit_libs_ios_video: a5fe24bc7875ccd6378a0978c13185e1344651c1
|
||||
media_kit_video: 5da63f157170e5bf303bf85453b7ef6971218a2e
|
||||
motion_sensors: 03f55b7c637a7e365a0b5f9697a449f9059d5d91
|
||||
motionphoto: 8b65ce50c7d7ff3c767534fc3768b2eed9ac24e4
|
||||
move_to_background: cd3091014529ec7829e342ad2d75c0a11f4378a5
|
||||
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
|
||||
native_video_player: e363dd14f6a498ad8a8f7e6486a0db046ad19f13
|
||||
objective_c: 89e720c30d716b036faf9c9684022048eee1eee2
|
||||
onnxruntime: f9b296392c96c42882be020a59dbeac6310d81b2
|
||||
native_video_player: 29ab24a926804ac8c4a57eb6d744c7d927c2bc3e
|
||||
objective_c: 77e887b5ba1827970907e10e832eec1683f3431d
|
||||
onnxruntime: e7c2ae44385191eaad5ae64c935a72debaddc997
|
||||
onnxruntime-c: a909204639a1f035f575127ac406f781ac797c9c
|
||||
onnxruntime-objc: b6fab0f1787aa6f7190c2013f03037df4718bd8b
|
||||
open_mail_app: 7314a609e88eed22d53671279e189af7a0ab0f11
|
||||
open_mail_app: 70273c53f768beefdafbe310c3d9086e4da3cb02
|
||||
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
|
||||
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
|
||||
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
|
||||
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
|
||||
photo_manager: d2fbcc0f2d82458700ee6256a15018210a81d413
|
||||
privacy_screen: 3159a541f5d3a31bea916cfd4e58f9dc722b3fd4
|
||||
package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4
|
||||
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
||||
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
|
||||
photo_manager: ff695c7a1dd5bc379974953a2b5c0a293f7c4c8a
|
||||
privacy_screen: 1a131c052ceb3c3659934b003b0d397c2381a24e
|
||||
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
|
||||
receive_sharing_intent: 222384f00ffe7e952bbfabaa9e3967cb87e5fe00
|
||||
SDWebImage: f84b0feeb08d2d11e6a9b843cb06d75ebf5b8868
|
||||
receive_sharing_intent: 79c848f5b045674ad60b9fea3bafea59962ad2c1
|
||||
SDWebImage: f29024626962457f3470184232766516dee8dfea
|
||||
SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380
|
||||
Sentry: da60d980b197a46db0b35ea12cb8f39af48d8854
|
||||
sentry_flutter: 942017adbe00f963061cb11ec260414a990b7a42
|
||||
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
|
||||
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
|
||||
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
|
||||
sqlite3: fc1400008a9b3525f5914ed715a5d1af0b8f4983
|
||||
sqlite3_flutter_libs: 3c323550ef3b928bc0aa9513c841e45a7d242832
|
||||
system_info_plus: 555ce7047fbbf29154726db942ae785c29211740
|
||||
thermal: d4c48be750d1ddbab36b0e2dcb2471531bc8df41
|
||||
ua_client_hints: 92fe0d139619b73ec9fcb46cc7e079a26178f586
|
||||
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
|
||||
video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b
|
||||
video_thumbnail: 584ccfa55d8fd2f3d5507218b0a18d84c839c620
|
||||
volume_controller: 3657a1f65bedb98fa41ff7dc5793537919f31b12
|
||||
wakelock_plus: 04623e3f525556020ebd4034310f20fe7fda8b49
|
||||
sentry_flutter: 2df8b0aab7e4aba81261c230cbea31c82a62dd1b
|
||||
share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f
|
||||
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
|
||||
sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d
|
||||
sqlite3: 3c950dc86011117c307eb0b28c4a7bb449dce9f1
|
||||
sqlite3_flutter_libs: 069c435986dd4b63461aecd68f4b30be4a9e9daa
|
||||
system_info_plus: 5393c8da281d899950d751713575fbf91c7709aa
|
||||
thermal: a9261044101ae8f532fa29cab4e8270b51b3f55c
|
||||
ua_client_hints: aeabd123262c087f0ce151ef96fa3ab77bfc8b38
|
||||
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
|
||||
video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3
|
||||
video_thumbnail: 94ba6705afbaa120b77287080424930f23ea0c40
|
||||
volume_controller: 2e3de73d6e7e81a0067310d17fb70f2f86d71ac7
|
||||
wakelock_plus: 373cfe59b235a6dd5837d0fb88791d2f13a90d56
|
||||
workmanager: 0afdcf5628bbde6924c21af7836fed07b42e30e6
|
||||
|
||||
PODFILE CHECKSUM: a8ef88ad74ba499756207e7592c6071a96756d18
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
CEE6BE702D7AE7FD00E4048B /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DACD83C2B755B0600BA9516 /* WidgetKit.framework */; };
|
||||
CEE6BE712D7AE7FD00E4048B /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DACD83E2B755B0600BA9516 /* SwiftUI.framework */; };
|
||||
CEE6BE7C2D7AE7FE00E4048B /* EnteMemoryWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = CEE6BE6F2D7AE7FD00E4048B /* EnteMemoryWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||
DA6BE5E826B3BC8600656280 /* (null) in Resources */ = {isa = PBXBuildFile; };
|
||||
DA6BE5E826B3BC8600656280 /* BuildFile in Resources */ = {isa = PBXBuildFile; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
@@ -112,21 +112,21 @@
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
||||
CEE166342DD5E7830012CF61 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
|
||||
CEE166342DD5E7830012CF61 /* Exceptions for "EnteAlbumWidget" folder in "EnteAlbumWidgetExtension" target */ = {
|
||||
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
|
||||
membershipExceptions = (
|
||||
Info.plist,
|
||||
);
|
||||
target = CEE166222DD5E7820012CF61 /* EnteAlbumWidgetExtension */;
|
||||
};
|
||||
CEE1668C2DD5F6F30012CF61 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
|
||||
CEE1668C2DD5F6F30012CF61 /* Exceptions for "EntePeopleWidget" folder in "EntePeopleWidgetExtension" target */ = {
|
||||
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
|
||||
membershipExceptions = (
|
||||
Info.plist,
|
||||
);
|
||||
target = CEE1667A2DD5F6F20012CF61 /* EntePeopleWidgetExtension */;
|
||||
};
|
||||
CEE6BE802D7AE7FE00E4048B /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
|
||||
CEE6BE802D7AE7FE00E4048B /* Exceptions for "EnteMemoryWidget" folder in "EnteMemoryWidgetExtension" target */ = {
|
||||
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
|
||||
membershipExceptions = (
|
||||
Info.plist,
|
||||
@@ -136,9 +136,42 @@
|
||||
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
||||
|
||||
/* Begin PBXFileSystemSynchronizedRootGroup section */
|
||||
CEE166262DD5E7820012CF61 /* EnteAlbumWidget */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (CEE166342DD5E7830012CF61 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = EnteAlbumWidget; sourceTree = "<group>"; };
|
||||
CEE1667E2DD5F6F20012CF61 /* EntePeopleWidget */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (CEE1668C2DD5F6F30012CF61 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = EntePeopleWidget; sourceTree = "<group>"; };
|
||||
CEE6BE722D7AE7FD00E4048B /* EnteMemoryWidget */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (CEE6BE802D7AE7FE00E4048B /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = EnteMemoryWidget; sourceTree = "<group>"; };
|
||||
CEE166262DD5E7820012CF61 /* EnteAlbumWidget */ = {
|
||||
isa = PBXFileSystemSynchronizedRootGroup;
|
||||
exceptions = (
|
||||
CEE166342DD5E7830012CF61 /* Exceptions for "EnteAlbumWidget" folder in "EnteAlbumWidgetExtension" target */,
|
||||
);
|
||||
explicitFileTypes = {
|
||||
};
|
||||
explicitFolders = (
|
||||
);
|
||||
path = EnteAlbumWidget;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CEE1667E2DD5F6F20012CF61 /* EntePeopleWidget */ = {
|
||||
isa = PBXFileSystemSynchronizedRootGroup;
|
||||
exceptions = (
|
||||
CEE1668C2DD5F6F30012CF61 /* Exceptions for "EntePeopleWidget" folder in "EntePeopleWidgetExtension" target */,
|
||||
);
|
||||
explicitFileTypes = {
|
||||
};
|
||||
explicitFolders = (
|
||||
);
|
||||
path = EntePeopleWidget;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CEE6BE722D7AE7FD00E4048B /* EnteMemoryWidget */ = {
|
||||
isa = PBXFileSystemSynchronizedRootGroup;
|
||||
exceptions = (
|
||||
CEE6BE802D7AE7FE00E4048B /* Exceptions for "EnteMemoryWidget" folder in "EnteMemoryWidgetExtension" target */,
|
||||
);
|
||||
explicitFileTypes = {
|
||||
};
|
||||
explicitFolders = (
|
||||
);
|
||||
path = EnteMemoryWidget;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXFileSystemSynchronizedRootGroup section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -414,7 +447,7 @@
|
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
|
||||
DA6BE5E826B3BC8600656280 /* (null) in Resources */,
|
||||
DA6BE5E826B3BC8600656280 /* BuildFile in Resources */,
|
||||
277218A0270F596900FFE3CC /* GoogleService-Info.plist in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -494,7 +527,6 @@
|
||||
"${BUILT_PRODUCTS_DIR}/SDWebImageWebPCoder/SDWebImageWebPCoder.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/app_links/app_links.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/background_fetch/background_fetch.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/battery_info/battery_info.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/connectivity_plus/connectivity_plus.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/cupertino_http/cupertino_http.framework",
|
||||
@@ -516,6 +548,7 @@
|
||||
"${BUILT_PRODUCTS_DIR}/integration_test/integration_test.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/launcher_icon_switcher/launcher_icon_switcher.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/libwebp/libwebp.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/local_auth_darwin/local_auth_darwin.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/local_auth_ios/local_auth_ios.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/maps_launcher/maps_launcher.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/media_extension/media_extension.framework",
|
||||
@@ -547,6 +580,7 @@
|
||||
"${BUILT_PRODUCTS_DIR}/video_thumbnail/video_thumbnail.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/volume_controller/volume_controller.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/wakelock_plus/wakelock_plus.framework",
|
||||
"${BUILT_PRODUCTS_DIR}/workmanager/workmanager.framework",
|
||||
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg_kit_custom/ffmpegkit.framework/ffmpegkit",
|
||||
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg_kit_custom/libavcodec.framework/libavcodec",
|
||||
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg_kit_custom/libavdevice.framework/libavdevice",
|
||||
@@ -589,7 +623,6 @@
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImageWebPCoder.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sentry.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/app_links.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/background_fetch.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/battery_info.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/connectivity_plus.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/cupertino_http.framework",
|
||||
@@ -611,6 +644,7 @@
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/integration_test.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/launcher_icon_switcher.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libwebp.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/local_auth_darwin.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/local_auth_ios.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/maps_launcher.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/media_extension.framework",
|
||||
@@ -642,6 +676,7 @@
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/video_thumbnail.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/volume_controller.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/wakelock_plus.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/workmanager.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ffmpegkit.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libavcodec.framework",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libavdevice.framework",
|
||||
|
||||
@@ -2,6 +2,7 @@ import AVFoundation
|
||||
import Flutter
|
||||
import UIKit
|
||||
import app_links
|
||||
import workmanager
|
||||
|
||||
@main
|
||||
@objc class AppDelegate: FlutterAppDelegate {
|
||||
@@ -15,6 +16,14 @@ import app_links
|
||||
}
|
||||
|
||||
GeneratedPluginRegistrant.register(with: self)
|
||||
WorkmanagerPlugin.setPluginRegistrantCallback { registry in
|
||||
GeneratedPluginRegistrant.register(with: registry)
|
||||
}
|
||||
var freqInMinutes = 30 * 60
|
||||
// Register a periodic task in iOS 13+
|
||||
WorkmanagerPlugin.registerPeriodicTask(
|
||||
withIdentifier: "io.ente.frame.iOSBackgroundAppRefresh",
|
||||
frequency: NSNumber(value: freqInMinutes))
|
||||
|
||||
// Retrieve the link from parameters
|
||||
if let url = AppLinks.shared.getLink(launchOptions: launchOptions) {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<dict>
|
||||
<key>BGTaskSchedulerPermittedIdentifiers</key>
|
||||
<array>
|
||||
<string>com.transistorsoft.fetch</string>
|
||||
<string>io.ente.frame.iOSBackgroundAppRefresh</string>
|
||||
</array>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
|
||||
@@ -2,7 +2,6 @@ import "dart:async";
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:adaptive_theme/adaptive_theme.dart';
|
||||
import 'package:background_fetch/background_fetch.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
@@ -24,18 +23,15 @@ import "package:photos/services/people_home_widget_service.dart";
|
||||
import 'package:photos/services/sync/sync_service.dart';
|
||||
import 'package:photos/ui/tabs/home_widget.dart';
|
||||
import "package:photos/ui/viewer/actions/file_viewer.dart";
|
||||
import "package:photos/utils/bg_task_utils.dart";
|
||||
import "package:photos/utils/intent_util.dart";
|
||||
import "package:photos/utils/standalone/debouncer.dart";
|
||||
|
||||
class EnteApp extends StatefulWidget {
|
||||
final Future<void> Function(String) runBackgroundTask;
|
||||
final Future<void> Function(String) killBackgroundTask;
|
||||
final AdaptiveThemeMode? savedThemeMode;
|
||||
final Locale? locale;
|
||||
|
||||
const EnteApp(
|
||||
this.runBackgroundTask,
|
||||
this.killBackgroundTask,
|
||||
this.locale,
|
||||
this.savedThemeMode, {
|
||||
super.key,
|
||||
@@ -51,9 +47,9 @@ class EnteApp extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _EnteAppState extends State<EnteApp> with WidgetsBindingObserver {
|
||||
final _logger = Logger("EnteAppState");
|
||||
late Locale? locale;
|
||||
late StreamSubscription<MemoriesChangedEvent> _memoriesChangedSubscription;
|
||||
final _logger = Logger("EnteAppState");
|
||||
late StreamSubscription<PeopleChangedEvent> _peopleChangedSubscription;
|
||||
late Debouncer _changeCallbackDebouncer;
|
||||
|
||||
@@ -79,7 +75,7 @@ class _EnteAppState extends State<EnteApp> with WidgetsBindingObserver {
|
||||
(event) async {
|
||||
_changeCallbackDebouncer.run(
|
||||
() async =>
|
||||
unawaited(PeopleHomeWidgetService.instance.peopleChanged()),
|
||||
unawaited(PeopleHomeWidgetService.instance.checkPeopleChanged()),
|
||||
);
|
||||
},
|
||||
);
|
||||
@@ -112,7 +108,7 @@ class _EnteAppState extends State<EnteApp> with WidgetsBindingObserver {
|
||||
: MediaExtentionAction(action: IntentAction.main);
|
||||
AppLifecycleService.instance.setMediaExtensionAction(mediaExtentionAction);
|
||||
if (mediaExtentionAction.action == IntentAction.main) {
|
||||
_configureBackgroundFetch();
|
||||
await BgTaskUtils.configureWorkmanager();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -197,29 +193,4 @@ class _EnteAppState extends State<EnteApp> with WidgetsBindingObserver {
|
||||
AppLifecycleService.instance.onAppInBackground(stateChangeReason);
|
||||
}
|
||||
}
|
||||
|
||||
void _configureBackgroundFetch() {
|
||||
BackgroundFetch.configure(
|
||||
BackgroundFetchConfig(
|
||||
minimumFetchInterval: 15,
|
||||
forceAlarmManager: false,
|
||||
stopOnTerminate: false,
|
||||
startOnBoot: true,
|
||||
enableHeadless: true,
|
||||
requiresBatteryNotLow: true,
|
||||
requiresCharging: false,
|
||||
requiresStorageNotLow: false,
|
||||
requiresDeviceIdle: false,
|
||||
requiredNetworkType: NetworkType.ANY,
|
||||
), (String taskId) async {
|
||||
await widget.runBackgroundTask(taskId);
|
||||
}, (taskId) {
|
||||
_logger.info("BG task timeout taskID: $taskId");
|
||||
widget.killBackgroundTask(taskId);
|
||||
}).then((int status) {
|
||||
_logger.info('[BackgroundFetch] configure success: $status');
|
||||
}).catchError((e) {
|
||||
_logger.info('[BackgroundFetch] configure ERROR: $e');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,6 +75,7 @@ class Configuration {
|
||||
late FlutterSecureStorage _secureStorage;
|
||||
late String _tempDocumentsDirPath;
|
||||
late String _thumbnailCacheDirectory;
|
||||
late String _personFaceThumbnailCacheDirectory;
|
||||
|
||||
late String _sharedDocumentsMediaDirectory;
|
||||
String? _volatilePassword;
|
||||
@@ -95,6 +96,9 @@ class Configuration {
|
||||
final tempDirectoryPath = (await getTemporaryDirectory()).path;
|
||||
_thumbnailCacheDirectory = tempDirectoryPath + "/thumbnail-cache";
|
||||
Directory(_thumbnailCacheDirectory).createSync(recursive: true);
|
||||
_personFaceThumbnailCacheDirectory =
|
||||
_documentsDirectory + "/person-face-thumbnail-cache";
|
||||
Directory(_personFaceThumbnailCacheDirectory).createSync(recursive: true);
|
||||
_sharedDocumentsMediaDirectory =
|
||||
_documentsDirectory + "/ente-shared-media";
|
||||
Directory(_sharedDocumentsMediaDirectory).createSync(recursive: true);
|
||||
@@ -549,6 +553,10 @@ class Configuration {
|
||||
return _thumbnailCacheDirectory;
|
||||
}
|
||||
|
||||
String getPersonFaceThumbnailCacheDirectory() {
|
||||
return _personFaceThumbnailCacheDirectory;
|
||||
}
|
||||
|
||||
String getSharedMediaDirectory() {
|
||||
return _sharedDocumentsMediaDirectory;
|
||||
}
|
||||
|
||||
@@ -47,6 +47,14 @@ extension SuperLogRecord on LogRecord {
|
||||
var msg = "$header $message";
|
||||
|
||||
if (error != null) {
|
||||
if (error is DioException) {
|
||||
final String? id = (error as DioException)
|
||||
.requestOptions
|
||||
.headers['x-request-id'] as String?;
|
||||
if (id != null) {
|
||||
msg += "\n⤷ id: $id";
|
||||
}
|
||||
}
|
||||
msg += "\n⤷ type: ${error.runtimeType}\n⤷ error: $error";
|
||||
}
|
||||
if (stackTrace != null) {
|
||||
@@ -179,7 +187,7 @@ class SuperLogging {
|
||||
setupSentry().ignore();
|
||||
}
|
||||
|
||||
Logger.root.level = Level.ALL;
|
||||
Logger.root.level = kDebugMode ? Level.ALL : Level.INFO;
|
||||
Logger.root.onRecord.listen(onLogRecord);
|
||||
|
||||
if (isFDroidClient) {
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
import "dart:io";
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:photos/core/configuration.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
import "package:photos/models/base/id.dart";
|
||||
|
||||
class EnteRequestInterceptor extends Interceptor {
|
||||
final String enteEndpoint;
|
||||
final String id = Platform.isIOS ? "ios" : "droid";
|
||||
|
||||
EnteRequestInterceptor(this.enteEndpoint);
|
||||
|
||||
@@ -17,7 +20,7 @@ class EnteRequestInterceptor extends Interceptor {
|
||||
);
|
||||
}
|
||||
// ignore: prefer_const_constructors
|
||||
options.headers.putIfAbsent("x-request-id", () => Uuid().v4().toString());
|
||||
options.headers.putIfAbsent("x-request-id", () => newID(id));
|
||||
final String? tokenValue = Configuration.instance.getToken();
|
||||
if (tokenValue != null) {
|
||||
options.headers.putIfAbsent("X-Auth-Token", () => tokenValue);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:native_dio_adapter/native_dio_adapter.dart';
|
||||
import "package:native_dio_adapter/native_dio_adapter.dart";
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
import "package:photos/core/configuration.dart";
|
||||
import "package:photos/core/event_bus.dart";
|
||||
|
||||
@@ -206,14 +206,14 @@ extension DeviceFiles on FilesDB {
|
||||
});
|
||||
|
||||
if (rowUpdated > 0) {
|
||||
_logger.fine("Updated $rowUpdated rows for ${pathEntity.name}");
|
||||
_logger.info("Updated $rowUpdated rows for ${pathEntity.name}");
|
||||
hasUpdated = true;
|
||||
}
|
||||
} else {
|
||||
hasUpdated = true;
|
||||
await db.execute(
|
||||
'''
|
||||
INSERT INTO device_collections (id, name, count, cover_id, should_backup)
|
||||
INSERT INTO device_collections (id, name, count, cover_id, should_backup)
|
||||
VALUES (?, ?, ?, ?, ?);
|
||||
''',
|
||||
[
|
||||
@@ -267,8 +267,8 @@ extension DeviceFiles on FilesDB {
|
||||
final db = await sqliteAsyncDB;
|
||||
final rows = await db.getAll(
|
||||
'''
|
||||
SELECT collection_id FROM device_collections where should_backup =
|
||||
$_sqlBoolTrue
|
||||
SELECT collection_id FROM device_collections where should_backup =
|
||||
$_sqlBoolTrue
|
||||
and collection_id != -1;
|
||||
''',
|
||||
);
|
||||
@@ -338,12 +338,12 @@ extension DeviceFiles on FilesDB {
|
||||
SELECT *
|
||||
FROM ${FilesDB.filesTable}
|
||||
WHERE ${FilesDB.columnLocalID} IS NOT NULL AND
|
||||
${FilesDB.columnCreationTime} >= $startTime AND
|
||||
${FilesDB.columnCreationTime} >= $startTime AND
|
||||
${FilesDB.columnCreationTime} <= $endTime AND
|
||||
(${FilesDB.columnOwnerID} IS NULL OR ${FilesDB.columnOwnerID} =
|
||||
$ownerID ) AND
|
||||
${FilesDB.columnLocalID} IN
|
||||
(SELECT id FROM device_files where path_id = '${deviceCollection.id}' )
|
||||
(${FilesDB.columnOwnerID} IS NULL OR ${FilesDB.columnOwnerID} =
|
||||
$ownerID ) AND
|
||||
${FilesDB.columnLocalID} IN
|
||||
(SELECT id FROM device_files where path_id = '${deviceCollection.id}' )
|
||||
ORDER BY ${FilesDB.columnCreationTime} $order , ${FilesDB.columnModificationTime} $order
|
||||
''' +
|
||||
(limit != null ? ' limit $limit;' : ';');
|
||||
@@ -359,14 +359,14 @@ extension DeviceFiles on FilesDB {
|
||||
) async {
|
||||
final db = await sqliteAsyncDB;
|
||||
const String rawQuery = '''
|
||||
SELECT ${FilesDB.columnLocalID}, ${FilesDB.columnUploadedFileID},
|
||||
${FilesDB.columnFileSize}
|
||||
SELECT ${FilesDB.columnLocalID}, ${FilesDB.columnUploadedFileID},
|
||||
${FilesDB.columnFileSize}
|
||||
FROM ${FilesDB.filesTable}
|
||||
WHERE ${FilesDB.columnLocalID} IS NOT NULL AND
|
||||
(${FilesDB.columnOwnerID} IS NULL OR ${FilesDB.columnOwnerID} = ?)
|
||||
AND (${FilesDB.columnUploadedFileID} IS NOT NULL AND ${FilesDB.columnUploadedFileID} IS NOT -1)
|
||||
AND
|
||||
${FilesDB.columnLocalID} IN
|
||||
AND
|
||||
${FilesDB.columnLocalID} IN
|
||||
(SELECT id FROM device_files where path_id = ?)
|
||||
''';
|
||||
final results = await db.getAll(rawQuery, [ownerID, pathID]);
|
||||
@@ -425,7 +425,7 @@ extension DeviceFiles on FilesDB {
|
||||
final EnteFile? result =
|
||||
await getDeviceCollectionThumbnail(deviceCollection.id);
|
||||
if (result == null) {
|
||||
_logger.finest(
|
||||
_logger.info(
|
||||
'Failed to find coverThumbnail for deviceFolder',
|
||||
);
|
||||
continue;
|
||||
@@ -453,7 +453,7 @@ extension DeviceFiles on FilesDB {
|
||||
debugPrint("Call fallback method to get potential thumbnail");
|
||||
final db = await sqliteAsyncDB;
|
||||
final fileRows = await db.getAll(
|
||||
'''SELECT * FROM FILES f JOIN device_files df on f.local_id = df.id
|
||||
'''SELECT * FROM FILES f JOIN device_files df on f.local_id = df.id
|
||||
and df.path_id= ? order by f.creation_time DESC limit 1;
|
||||
''',
|
||||
[pathID],
|
||||
|
||||
@@ -77,6 +77,20 @@ extension EntitiesDB on FilesDB {
|
||||
);
|
||||
}
|
||||
|
||||
Future<List<LocalEntityData>> getCertainEntities(
|
||||
EntityType type,
|
||||
List<String> ids,
|
||||
) async {
|
||||
final db = await sqliteAsyncDB;
|
||||
final List<Map<String, dynamic>> maps = await db.getAll(
|
||||
'SELECT * FROM entities WHERE type = ? AND id IN (${List.filled(ids.length, '?').join(',')})',
|
||||
[type.name, ...ids],
|
||||
);
|
||||
return List.generate(maps.length, (i) {
|
||||
return LocalEntityData.fromJson(maps[i]);
|
||||
});
|
||||
}
|
||||
|
||||
Future<List<LocalEntityData>> getEntities(EntityType type) async {
|
||||
final db = await sqliteAsyncDB;
|
||||
final List<Map<String, dynamic>> maps = await db.getAll(
|
||||
@@ -99,4 +113,19 @@ extension EntitiesDB on FilesDB {
|
||||
}
|
||||
return LocalEntityData.fromJson(maps.first);
|
||||
}
|
||||
|
||||
Future<String?> getPreHashForEntities(
|
||||
EntityType type,
|
||||
List<String> ids,
|
||||
) async {
|
||||
final db = await sqliteAsyncDB;
|
||||
final maps = await db.get(
|
||||
'SELECT GROUP_CONCAT(id || \':\' || updatedAt, \',\') FROM entities WHERE type = ? AND id IN (${List.filled(ids.length, '?').join(',')})',
|
||||
[type.name, ...ids],
|
||||
);
|
||||
if (maps.isEmpty) {
|
||||
return null;
|
||||
}
|
||||
return maps.values.first as String?;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1436,22 +1436,6 @@ class FilesDB with SqlDbBase {
|
||||
return convertToFiles(rows).first;
|
||||
}
|
||||
|
||||
Future<void> markForReUploadIfLocationMissing(List<String> localIDs) async {
|
||||
if (localIDs.isEmpty) {
|
||||
return;
|
||||
}
|
||||
final inParam = localIDs.map((id) => "'$id'").join(',');
|
||||
final db = await instance.sqliteAsyncDB;
|
||||
await db.execute(
|
||||
'''
|
||||
UPDATE $filesTable
|
||||
SET $columnUpdationTime = NULL
|
||||
WHERE $columnLocalID IN ($inParam)
|
||||
AND ($columnLatitude IS NULL OR $columnLongitude IS NULL OR $columnLongitude = 0.0 or $columnLongitude = 0.0);
|
||||
''',
|
||||
);
|
||||
}
|
||||
|
||||
Future<bool> doesFileExistInCollection(
|
||||
int uploadedFileID,
|
||||
int collectionID,
|
||||
@@ -1586,25 +1570,6 @@ class FilesDB with SqlDbBase {
|
||||
return files;
|
||||
}
|
||||
|
||||
// For givenUserID, get List of unique LocalIDs for files which are
|
||||
// uploaded by the given user and location is missing
|
||||
Future<List<String>> getLocalIDsForFilesWithoutLocation(int ownerID) async {
|
||||
final db = await instance.sqliteAsyncDB;
|
||||
final rows = await db.getAll(
|
||||
'''
|
||||
SELECT DISTINCT $columnLocalID FROM $filesTable
|
||||
WHERE $columnOwnerID = ? AND $columnLocalID IS NOT NULL AND
|
||||
($columnLatitude IS NULL OR $columnLongitude IS NULL OR $columnLatitude = 0.0 or $columnLongitude = 0.0)
|
||||
''',
|
||||
[ownerID],
|
||||
);
|
||||
final result = <String>[];
|
||||
for (final row in rows) {
|
||||
result.add(row[columnLocalID].toString());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// For a given userID, return unique uploadedFileId for the given userID
|
||||
Future<List<int>> getUploadIDsWithMissingSize(int userId) async {
|
||||
final db = await instance.sqliteAsyncDB;
|
||||
@@ -1622,25 +1587,6 @@ class FilesDB with SqlDbBase {
|
||||
return result;
|
||||
}
|
||||
|
||||
Future<List<String>> getLocalFilesBackedUpWithoutLocation(int userId) async {
|
||||
final db = await instance.sqliteAsyncDB;
|
||||
final rows = await db.getAll(
|
||||
'''
|
||||
SELECT DISTINCT $columnLocalID FROM $filesTable
|
||||
WHERE $columnOwnerID = ? AND $columnLocalID IS NOT NULL AND
|
||||
($columnUploadedFileID IS NOT NULL AND $columnUploadedFileID IS NOT -1)
|
||||
AND ($columnLatitude IS NULL OR $columnLongitude IS NULL OR
|
||||
$columnLatitude = 0.0 or $columnLongitude = 0.0)
|
||||
''',
|
||||
[userId],
|
||||
);
|
||||
final result = <String>[];
|
||||
for (final row in rows) {
|
||||
result.add(row[columnLocalID] as String);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// updateSizeForUploadIDs takes a map of upploadedFileID and fileSize and
|
||||
// update the fileSize for the given uploadedFileID
|
||||
Future<void> updateSizeForUploadIDs(
|
||||
|
||||
@@ -13,6 +13,7 @@ abstract class IMLDataDB<T> {
|
||||
Future<int> getFaceIndexedFileCount({int minimumMlVersion});
|
||||
Future<Map<String, int>> clusterIdToFaceCount();
|
||||
Future<Set<String>> getPersonIgnoredClusters(String personID);
|
||||
Future<Map<String, Set<String>>> getPersonToRejectedSuggestions();
|
||||
Future<Set<String>> getPersonClusterIDs(String personID);
|
||||
Future<Set<String>> getPersonsClusterIDs(List<String> personID);
|
||||
Future<void> clearTable();
|
||||
@@ -40,6 +41,7 @@ abstract class IMLDataDB<T> {
|
||||
Future<Map<String, Iterable<String>>> getAllClusterIdToFaceIDs();
|
||||
Future<Iterable<String>> getFaceIDsForCluster(String clusterID);
|
||||
Future<Map<String, Map<String, Set<String>>>> getPersonToClusterIdToFaceIds();
|
||||
Future<Map<String, Set<String>>> getPersonToClusterIDs();
|
||||
Future<Map<String, Set<String>>> getClusterIdToFaceIdsForPerson(
|
||||
String personID,
|
||||
);
|
||||
|
||||
@@ -103,9 +103,9 @@ class MLDataDB with SqlDbBase implements IMLDataDB<int> {
|
||||
|
||||
const String sql = '''
|
||||
INSERT INTO $facesTable (
|
||||
$fileIDColumn, $faceIDColumn, $faceDetectionColumn, $embeddingColumn, $faceScore, $faceBlur, $isSideways, $imageHeight, $imageWidth, $mlVersionColumn
|
||||
$fileIDColumn, $faceIDColumn, $faceDetectionColumn, $embeddingColumn, $faceScore, $faceBlur, $isSideways, $imageHeight, $imageWidth, $mlVersionColumn
|
||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
ON CONFLICT($fileIDColumn, $faceIDColumn) DO UPDATE SET $faceIDColumn = excluded.$faceIDColumn, $faceDetectionColumn = excluded.$faceDetectionColumn, $embeddingColumn = excluded.$embeddingColumn, $faceScore = excluded.$faceScore, $faceBlur = excluded.$faceBlur, $isSideways = excluded.$isSideways, $imageHeight = excluded.$imageHeight, $imageWidth = excluded.$imageWidth, $mlVersionColumn = excluded.$mlVersionColumn
|
||||
ON CONFLICT($fileIDColumn, $faceIDColumn) DO UPDATE SET $faceIDColumn = excluded.$faceIDColumn, $faceDetectionColumn = excluded.$faceDetectionColumn, $embeddingColumn = excluded.$embeddingColumn, $faceScore = excluded.$faceScore, $faceBlur = excluded.$faceBlur, $isSideways = excluded.$isSideways, $imageHeight = excluded.$imageHeight, $imageWidth = excluded.$imageWidth, $mlVersionColumn = excluded.$mlVersionColumn
|
||||
''';
|
||||
final parameterSets = batch.map((face) {
|
||||
final map = mapRemoteToFaceDB(face);
|
||||
@@ -158,7 +158,7 @@ class MLDataDB with SqlDbBase implements IMLDataDB<int> {
|
||||
final db = await instance.asyncDB;
|
||||
final String query = '''
|
||||
SELECT $fileIDColumn, $mlVersionColumn
|
||||
FROM $facesTable
|
||||
FROM $facesTable
|
||||
WHERE $mlVersionColumn >= $minimumMlVersion
|
||||
''';
|
||||
final List<Map<String, dynamic>> maps = await db.getAll(query);
|
||||
@@ -212,6 +212,21 @@ class MLDataDB with SqlDbBase implements IMLDataDB<int> {
|
||||
return ignoredClusterIDs.union(rejectClusterIDs);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Map<String, Set<String>>> getPersonToRejectedSuggestions() async {
|
||||
final db = await instance.asyncDB;
|
||||
final List<Map<String, dynamic>> rejectMaps = await db.getAll(
|
||||
'SELECT $personIdColumn, $clusterIDColumn FROM $notPersonFeedback',
|
||||
);
|
||||
final Map<String, Set<String>> result = {};
|
||||
for (final map in rejectMaps) {
|
||||
final personID = map[personIdColumn] as String;
|
||||
final clusterID = map[clusterIDColumn] as String;
|
||||
result.putIfAbsent(personID, () => {}).add(clusterID);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Set<String>> getPersonClusterIDs(String personID) async {
|
||||
final db = await instance.asyncDB;
|
||||
@@ -267,9 +282,9 @@ class MLDataDB with SqlDbBase implements IMLDataDB<int> {
|
||||
final Map<String, List<Uint8List>> result = {};
|
||||
|
||||
final selectQuery = '''
|
||||
SELECT fc.$clusterIDColumn, fe.$embeddingColumn
|
||||
FROM $faceClustersTable fc
|
||||
INNER JOIN $facesTable fe ON fc.$faceIDColumn = fe.$faceIDColumn
|
||||
SELECT fc.$clusterIDColumn, fe.$embeddingColumn
|
||||
FROM $faceClustersTable fc
|
||||
INNER JOIN $facesTable fe ON fc.$faceIDColumn = fe.$faceIDColumn
|
||||
WHERE fc.$clusterIDColumn IN (${List.filled(clusterIDs.length, '?').join(',')})
|
||||
${limit != null ? 'LIMIT ?' : ''}
|
||||
''';
|
||||
@@ -323,10 +338,10 @@ class MLDataDB with SqlDbBase implements IMLDataDB<int> {
|
||||
|
||||
final List<Map<String, dynamic>> faceMaps = await db.getAll(
|
||||
'''
|
||||
SELECT * FROM $facesTable
|
||||
SELECT * FROM $facesTable
|
||||
WHERE $faceIDColumn IN (
|
||||
SELECT $faceIDColumn
|
||||
FROM $faceClustersTable
|
||||
SELECT $faceIDColumn
|
||||
FROM $faceClustersTable
|
||||
WHERE $clusterIDColumn IN (${List.filled(clusterIDs.length, '?').join(',')})
|
||||
)
|
||||
AND $fileIDColumn IN (${List.filled(fileId.length, '?').join(',')})
|
||||
@@ -420,8 +435,8 @@ class MLDataDB with SqlDbBase implements IMLDataDB<int> {
|
||||
|
||||
final List<Map<String, dynamic>> maps = await db.getAll(
|
||||
'''
|
||||
SELECT $clusterIDColumn, $faceIDColumn
|
||||
FROM $faceClustersTable
|
||||
SELECT $clusterIDColumn, $faceIDColumn
|
||||
FROM $faceClustersTable
|
||||
WHERE $clusterIDColumn IN (${List.filled(clusterIDs.length, '?').join(',')})
|
||||
''',
|
||||
[...clusterIDs],
|
||||
@@ -512,6 +527,21 @@ class MLDataDB with SqlDbBase implements IMLDataDB<int> {
|
||||
return result;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Map<String, Set<String>>> getPersonToClusterIDs() async {
|
||||
final db = await instance.asyncDB;
|
||||
final List<Map<String, dynamic>> maps = await db.getAll(
|
||||
'SELECT $personIdColumn, $clusterIDColumn FROM $clusterPersonTable',
|
||||
);
|
||||
final Map<String, Set<String>> result = {};
|
||||
for (final map in maps) {
|
||||
final personID = map[personIdColumn] as String;
|
||||
final clusterID = map[clusterIDColumn] as String;
|
||||
result.putIfAbsent(personID, () => {}).add(clusterID);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
Future<Map<String, String>> getFaceIdToPersonIdForFaces(
|
||||
Iterable<String> faceIDs,
|
||||
) async {
|
||||
@@ -581,9 +611,9 @@ class MLDataDB with SqlDbBase implements IMLDataDB<int> {
|
||||
Future<Iterable<double>> getBlurValuesForCluster(String clusterID) async {
|
||||
final db = await instance.asyncDB;
|
||||
const String query = '''
|
||||
SELECT $facesTable.$faceBlur
|
||||
FROM $facesTable
|
||||
JOIN $faceClustersTable ON $facesTable.$faceIDColumn = $faceClustersTable.$faceIDColumn
|
||||
SELECT $facesTable.$faceBlur
|
||||
FROM $facesTable
|
||||
JOIN $faceClustersTable ON $facesTable.$faceIDColumn = $faceClustersTable.$faceIDColumn
|
||||
WHERE $faceClustersTable.$clusterIDColumn = ?
|
||||
''';
|
||||
// const String query2 = '''
|
||||
@@ -757,11 +787,11 @@ class MLDataDB with SqlDbBase implements IMLDataDB<int> {
|
||||
while (true) {
|
||||
// Query a batch of rows
|
||||
final String query = '''
|
||||
SELECT $faceIDColumn, $embeddingColumn
|
||||
FROM $facesTable
|
||||
WHERE $faceIDColumn IN (${faceIDs.map((id) => "'$id'").join(",")})
|
||||
ORDER BY $faceIDColumn DESC
|
||||
LIMIT $batchSize OFFSET $offset
|
||||
SELECT $faceIDColumn, $embeddingColumn
|
||||
FROM $facesTable
|
||||
WHERE $faceIDColumn IN (${faceIDs.map((id) => "'$id'").join(",")})
|
||||
ORDER BY $faceIDColumn DESC
|
||||
LIMIT $batchSize OFFSET $offset
|
||||
''';
|
||||
final List<Map<String, dynamic>> maps = await db.getAll(query);
|
||||
// Break the loop if no more rows
|
||||
@@ -985,8 +1015,8 @@ class MLDataDB with SqlDbBase implements IMLDataDB<int> {
|
||||
return db.then((db) async {
|
||||
final List<Map<String, dynamic>> maps = await db.getAll(
|
||||
'''
|
||||
SELECT $clusterIDColumn, $faceIDColumn
|
||||
FROM $faceClustersTable
|
||||
SELECT $clusterIDColumn, $faceIDColumn
|
||||
FROM $faceClustersTable
|
||||
WHERE $clusterIDColumn IN (${List.filled(clusterIDs.length, '?').join(',')})
|
||||
''',
|
||||
[...clusterIDs],
|
||||
@@ -1009,7 +1039,7 @@ class MLDataDB with SqlDbBase implements IMLDataDB<int> {
|
||||
final db = await instance.asyncDB;
|
||||
|
||||
const String sql = '''
|
||||
INSERT INTO $clusterSummaryTable ($clusterIDColumn, $avgColumn, $countColumn) VALUES (?, ?, ?) ON CONFLICT($clusterIDColumn) DO UPDATE SET $avgColumn = excluded.$avgColumn, $countColumn = excluded.$countColumn
|
||||
INSERT INTO $clusterSummaryTable ($clusterIDColumn, $avgColumn, $countColumn) VALUES (?, ?, ?) ON CONFLICT($clusterIDColumn) DO UPDATE SET $avgColumn = excluded.$avgColumn, $countColumn = excluded.$countColumn
|
||||
''';
|
||||
final List<List<Object?>> parameterSets = [];
|
||||
int batchCounter = 0;
|
||||
@@ -1158,7 +1188,7 @@ class MLDataDB with SqlDbBase implements IMLDataDB<int> {
|
||||
final result = await db.getAll(
|
||||
'''
|
||||
SELECT DISTINCT $facesTable.$fileIDColumn
|
||||
FROM $faceClustersTable
|
||||
FROM $faceClustersTable
|
||||
JOIN $facesTable ON $faceClustersTable.$faceIDColumn = $facesTable.$faceIDColumn
|
||||
WHERE $faceClustersTable.$clusterIDColumn = ?
|
||||
''',
|
||||
@@ -1189,8 +1219,8 @@ class MLDataDB with SqlDbBase implements IMLDataDB<int> {
|
||||
final notInParam = exceptClusters?.map((e) => "'$e'").join(',') ?? '';
|
||||
final db = await instance.asyncDB;
|
||||
final result = await db.getAll('''
|
||||
SELECT DISTINCT $facesTable.$fileIDColumn
|
||||
FROM $facesTable
|
||||
SELECT DISTINCT $facesTable.$fileIDColumn
|
||||
FROM $facesTable
|
||||
JOIN $faceClustersTable on $faceClustersTable.$faceIDColumn = $facesTable.$faceIDColumn
|
||||
WHERE $faceClustersTable.$clusterIDColumn NOT IN ($notInParam);
|
||||
''');
|
||||
|
||||
7
mobile/lib/events/compute_control_event.dart
Normal file
@@ -0,0 +1,7 @@
|
||||
import "package:photos/events/event.dart";
|
||||
|
||||
class ComputeControlEvent extends Event {
|
||||
final bool shouldRun;
|
||||
|
||||
ComputeControlEvent(this.shouldRun);
|
||||
}
|
||||
8
mobile/lib/events/create_new_album_event.dart
Normal file
@@ -0,0 +1,8 @@
|
||||
import "package:photos/events/event.dart";
|
||||
import "package:photos/models/collection/collection.dart";
|
||||
|
||||
class CreateNewAlbumEvent extends Event {
|
||||
final Collection collection;
|
||||
|
||||
CreateNewAlbumEvent(this.collection);
|
||||
}
|
||||
20
mobile/lib/events/details_sheet_event.dart
Normal file
@@ -0,0 +1,20 @@
|
||||
import "package:photos/events/event.dart";
|
||||
|
||||
class DetailsSheetEvent extends Event {
|
||||
final int? uploadedFileID;
|
||||
final String? localID;
|
||||
final bool opened;
|
||||
|
||||
DetailsSheetEvent({
|
||||
required this.localID,
|
||||
required this.uploadedFileID,
|
||||
required this.opened,
|
||||
});
|
||||
|
||||
bool isSameFile({required int? uploadedFileID, required String? localID}) {
|
||||
if (this.uploadedFileID == uploadedFileID && this.localID == localID) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||