From 05ae99eec4504e8dda485b2cecf1de07fc27032d Mon Sep 17 00:00:00 2001 From: "Leroy.H.Y" Date: Fri, 5 Jul 2019 20:43:33 +0800 Subject: [PATCH] [RENAMED] Renamed from Hv2ray to Qv2ray Former-commit-id: 08e6e26201ed971369a4fa794bf43dc4f0edca72 --- .appveyor.yml | 4 +- .gitignore | 18 +- .travis.yml | 2 +- CHANGELOG.md | 8 +- Hv2ray.pro => Qv2ray.pro | 4 +- README.md | 17 +- icons/Hv2ray.ico | Bin 270398 -> 0 bytes icons/Qv2ray.ico | Bin 0 -> 17566 bytes icons/Qv2ray.xcf | Bin 0 -> 52449 bytes resources.qrc | 2 +- src/HConfigObjects.hpp | 39 +-- src/HUtils.cpp | 12 +- src/HUtils.hpp | 6 +- src/V2ConfigObjects.hpp | 134 +------ src/main.cpp | 30 +- src/runguard.cpp | 2 +- src/runguard.hpp | 2 +- src/vinteract.cpp | 2 +- src/vinteract.hpp | 2 +- src/w_ConnectionEditWindow.cpp | 4 +- src/w_ConnectionEditWindow.h | 4 +- src/w_ConnectionEditWindow.ui | 8 +- src/w_ImportConfig.cpp | 6 +- src/w_ImportConfig.h | 4 +- src/w_ImportConfig.ui | 8 +- src/w_MainWindow.cpp | 8 +- src/w_MainWindow.h | 4 +- src/w_MainWindow.ui | 6 +- src/w_PrefrencesWindow.cpp | 6 +- src/w_PrefrencesWindow.h | 6 +- src/w_PrefrencesWindow.ui | 8 +- translations/en-US.ts | 615 +++++---------------------------- translations/zh-CN.ts | 615 +++++---------------------------- 33 files changed, 283 insertions(+), 1303 deletions(-) rename Hv2ray.pro => Qv2ray.pro (98%) delete mode 100644 icons/Hv2ray.ico create mode 100644 icons/Qv2ray.ico create mode 100644 icons/Qv2ray.xcf diff --git a/.appveyor.yml b/.appveyor.yml index d462cdee..5d1da84b 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -7,7 +7,7 @@ install: build_script: - mkdir python37 && xcopy C:\Python37 python37 /E /H /Q - tools\FixPythonWithMinGW.bat - - lrelease.exe Hv2ray.pro + - lrelease.exe Qv2ray.pro - mkdir build && cd build - - qmake ..\Hv2ray.pro + - qmake ..\Qv2ray.pro - mingw32-make diff --git a/.gitignore b/.gitignore index ba5bbdc4..067f5b34 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,6 @@ -Hv2ray.pro.user -conf -Debug -Release -config.json -__pycache__/ -geoip.dat -geosite.dat -v2ctl -v2ray -v2ray.sig -v2ctl.sig -./.vscode +*.pro.user *.qm build/ -python37/ -tools/python-3.7.3.exe +src/build/ ./.vscode +tools/python-3.7.3.exe diff --git a/.travis.yml b/.travis.yml index c362f953..56f56d29 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,7 +22,7 @@ before_script: script: - git submodule update --init - - lrelease ./Hv2ray.pro + - lrelease ./Qv2ray.pro - mkdir build && cd ./build - QT_SELECT=5 QTDIR=/usr/share/qt5 qmake ../ - make diff --git a/CHANGELOG.md b/CHANGELOG.md index 21c8f1a5..7fb24328 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,13 +7,13 @@ **2019-07-01**: 休息了几天,主要是去关注别的项目了。现在开始重构 v2ray 交互部分。 -**2019-06-24**: Mac OS 测试构建完成,合并到开发分支 [dev](https://github.com/lhy0403/Hv2ray/tree/dev) +**2019-06-24**: Mac OS 测试构建完成,合并到开发分支 [dev](https://github.com/lhy0403/Qv2ray/tree/dev) -**2019-06-24**: 新建分支 MacOS-Build 开始测试 MacOS 构建,当前状态:![Build Status](https://travis-ci.com/lhy0403/Hv2ray.svg?branch=MacOS-Build) +**2019-06-24**: 新建分支 MacOS-Build 开始测试 MacOS 构建,当前状态:![Build Status](https://travis-ci.com/lhy0403/Qv2ray.svg?branch=MacOS-Build) **2019-06-23**: UI 结构已经固定,新建分支 translations 进行翻译 UI -**2019-06-23**: 基本 UI 完成,切换到 [dev](https://github.com/lhy0403/Hv2ray/tree/dev) 分支进行代码实现 +**2019-06-23**: 基本 UI 完成,切换到 [dev](https://github.com/lhy0403/Qv2ray/tree/dev) 分支进行代码实现 -**2019-06-22**: 当前开发分支[ui-implementation](https://github.com/lhy0403/Hv2ray/tree/ui-implementation) - 用于实现基本 UI +**2019-06-22**: 当前开发分支[ui-implementation](https://github.com/lhy0403/Qv2ray/tree/ui-implementation) - 用于实现基本 UI diff --git a/Hv2ray.pro b/Qv2ray.pro similarity index 98% rename from Hv2ray.pro rename to Qv2ray.pro index 1d110756..6a6d1512 100644 --- a/Hv2ray.pro +++ b/Qv2ray.pro @@ -8,7 +8,7 @@ QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets -TARGET = Hv2ray +TARGET = Qv2ray TEMPLATE = app # The following define makes your compiler emit warnings if you use @@ -59,7 +59,7 @@ TRANSLATIONS += \ translations/zh-CN.ts \ translations/en-US.ts -RC_ICONS += ./icons/Hv2ray.ico +RC_ICONS += ./icons/Qv2ray.ico INCLUDEPATH += 3rdparty/\ 3rdparty/jsoncons/include diff --git a/README.md b/README.md index 2b3ca1b3..51d6a5c9 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/a034dd186c36408c92ffb04449fb6996)](https://app.codacy.com/app/lhy0403/Hv2ray?utm_source=github.com&utm_medium=referral&utm_content=lhy0403/Hv2ray&utm_campaign=Badge_Grade_Dashboard) -# Hv2ray [![HitCount](http://hits.dwyl.io/lhy0403/Hv2ray.svg)](http://hits.dwyl.io/lhy0403/Hv2ray) +[![Codacy Badge](https://api.codacy.com/project/badge/Grade/a034dd186c36408c92ffb04449fb6996)](https://app.codacy.com/app/lhy0403/Qv2ray?utm_source=github.com&utm_medium=referral&utm_content=lhy0403/Qv2ray&utm_campaign=Badge_Grade_Dashboard) +# Qv2ray [![HitCount](http://hits.dwyl.io/lhy0403/Qv2ray.svg)](http://hits.dwyl.io/lhy0403/Qv2ray) TODO: 使用 Qt 的跨平台 v2ray 客户端,目前仍处于早期开发,多数功能尚未齐全。 -[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/lhy0403/Hv2ray.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/lhy0403/Hv2ray/context:cpp) [![Total alerts](https://img.shields.io/lgtm/alerts/g/lhy0403/Hv2ray.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/lhy0403/Hv2ray/alerts/) +[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/lhy0403/Qv2ray.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/lhy0403/Qv2ray/context:cpp) [![Total alerts](https://img.shields.io/lgtm/alerts/g/lhy0403/Qv2ray.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/lhy0403/Qv2ray/alerts/) -| OS | 主分支 [master](https://github.com/lhy0403/Hv2ray/tree/master) | 开发分支 [dev](https://github.com/lhy0403/Hv2ray/tree/dev) | +| OS | 主分支 [master](https://github.com/lhy0403/Qv2ray/tree/master) | 开发分支 [dev](https://github.com/lhy0403/Qv2ray/tree/dev) | | ------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | -| Linux & MacOS | [![Build Status](https://travis-ci.com/lhy0403/Hv2ray.svg?branch=master)](https://travis-ci.com/lhy0403/Hv2ray) | [![Build Status](https://travis-ci.com/lhy0403/Hv2ray.svg?branch=dev)](https://travis-ci.com/lhy0403/Hv2ray) | -| Windows | [![Build status](https://ci.appveyor.com/api/projects/status/ml51d2s41pqmfgme/branch/master?svg=true)](https://ci.appveyor.com/project/lhy0403/hv2ray/branch/master) | [![Build status](https://ci.appveyor.com/api/projects/status/ml51d2s41pqmfgme/branch/dev?svg=true)](https://ci.appveyor.com/project/lhy0403/hv2ray/branch/dev) | +| Linux & MacOS | [![Build Status](https://travis-ci.com/lhy0403/Qv2ray.svg?branch=master)](https://travis-ci.com/lhy0403/Qv2ray) | [![Build Status](https://travis-ci.com/lhy0403/Qv2ray.svg?branch=dev)](https://travis-ci.com/lhy0403/Qv2ray) | +| Windows | [![Build status](https://ci.appveyor.com/api/projects/status/i1l524ws0hiitpm4/branch/master?svg=true)](https://ci.appveyor.com/project/lhy0403/qv2ray/branch/master) | [![Build status](https://ci.appveyor.com/api/projects/status/i1l524ws0hiitpm4/branch/dev?svg=true)](https://ci.appveyor.com/project/lhy0403/qv2ray/branch/dev) | ## 最近更新内容 @@ -19,6 +19,7 @@ TODO: 使用 Qt 的跨平台 v2ray 客户端,目前仍处于早期开发,多 # 鸣谢 [@aliyuchang33](https://github.com/aliyuchang33) - 项目原作者/发起人,感谢他使用 Qt 作为基础框架。 + - 可惜原项目不更新了qwq @@ -41,8 +42,8 @@ TODO: 使用 Qt 的跨平台 v2ray 客户端,目前仍处于早期开发,多 - !! 该分支可能不稳定 或 甚至无法正常工作 !! ### Linux ```bash -git clone https://github.com/lhy0403/Hv2ray && cd Hv2ray -lrelease ./Hv2ray.pro +git clone https://github.com/lhy0403/Qv2ray && cd Qv2ray +lrelease ./Qv2ray.pro mkdir build && cd build qmake ../ make diff --git a/icons/Hv2ray.ico b/icons/Hv2ray.ico deleted file mode 100644 index 6d84a174ffa80716d67d9234ab2a6c45d0fa0199..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270398 zcmeI53A`*-amEh~h=TjBQ3LMLs8J)5L}Q{cCTgO_BxW;FabHjoToMh63JMB}3MwEd z`@Zk{{@C|@2`(roD5xl?c=G+LyXN)Wd%>Q$(|5Y>l=)TedzYTm=X_s%Rdwog&r4|) z{U85ZC9R#Fy7p@6;rjDa%U`5al)vY%DXmuii2ol51OkCTAP@)y0)apv5C{YUfj}S- z2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YU zfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv z5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}Jl9)T_2k@BW*N_mqv z^v9Sl^IrDkOmTr+$$sqvspy+;Z1(1qw|ZB~+ie*7Z|ZJ}^ZE1dOd0I@pnvAce3^ICHO6(L zBk+w6rJ_&1@u~Gw{+w#UFTFSA9X1aAH)Z_m8(F<%*nPU=F@X6Q#~Y-~yqm5ut{WYJ zZ~b>F`r;dCe~Y)L{KfaA{M8Lp-uWY;|E7%Z^q~^7ZKNr*wb@%z{zS+2e9VV=F+b)B z$IQFw8soar5!n4>spz_IuoomJY*}f4yZ5KO;|EjT^`oKxri}0MKPju$Gfkl_YHRk_ z#MEi`1h_x*U_Q*twav>qbXl|4*i( zYrcVBkPkMOUvM_DwfutpKJ_4ZAMNk)v6T1QH1yw;abaaz+Ew{We^c=Q7mKYA_&nn<9^*1T_u+orm-{mh_+?(qk9p#k%)99tCk^u#)Xw> zN%daVp3iVZXVg;U+iit08l?6Hcg|PH$;4l{hZD|RM>Rgj=NX6b7?<(65BKA~+@Ev>qbZ5@Xw~geM9xMVNZT-+cyS&A>VMnAkUKv(7gMFOlF$VV?>8H)UK{WySh@z^4>Dg&+E&hEfm3u-#eOqqfqSiuK&d#X4U#9ylLb ztidPaF)saP?!*1KFWfQ@=EJ<0AM<3s%)99tod_Zg>=hyw>s4YYPO&J%@`G_q_Jsq-nnODJ*9J`Nj1z+kauttmYgwQ1h517td zMmGPfkHxr*&waQb_vQY~gZYq)m>)jLe3^ICHO6(LBXHc-saVK2)E8J%-x%_XO7ETv zm<##d^8tQwl>FkjtwR4z89#pOl#ksifo(J#? z)BKiYJ~&ps!JJR}V(7mq&@|GVg{fKVl zX7`k@m0h<-%Kx`#Y1ixLxaMOp9^*1T_u+orm-{mh=EJ<0pT`O2-EfI<*%$~Y78ld< zjo;}P@(ujrvTrWn7iFFb{Ws(sU4f%(9sQw2IQaHnDSv10l)txc%HQ8FUsq)1YiV64yxk48DZ^${Ca?O*+(H%IO)}>1{{^LVZzV)z_e|mVz zKR+_%UmTV4FON?7j$=~36FYVc)93g+<1ilMGCud=e%$va-Jf|dALhmU>an2V663Nl z5RhLK_v9PI>{fhZ0l)a!5h>p$zxc_aWv=1g#Dp7^D~JczD^E~E5(}8KEcD-ybF>e3 zUv+`<2LX%xNwN?QN*aVg(*e9FH)A?1AH_{QfMhw&Jf@wt!l&Hb4N z^I=|fu9{hzmRYIM!w;G;W^?q<%oKIuzIno2|Na9-l6}7 zoG-+2=)WO&%lNX;|1u`GwzSZH4UG8X0D;i|0E%V(htU7Brg!Ych5pBeu2&xn{r8Hl zC7W#Mf61Vp>WxDGQ-!~?HxK=HmYRu9Ec8E7IG4>}q5ow=c^xri`+L=%2za3orK5FQ{ z?+iAZf9Ss%PP2AZ=zlgC5B<*u&!es~^gk+M{k%T(-%sA!o^|NIZG^iqe(1j&Jalaq zq5rNi($0KB|Lx$~_fbRteP^)Q{6qiEaGJHNLjSYDc<6sNcpi0?q5n}4>*w{M|9o}Bk#^=2`fmrmFd<{$cRhSRKF75bkI#zX(J z!SkrA4E>LaSU;~1{r8i%wr3ssZyVumj34^%1`l1EMd-h4jI=YK(0@C)_I=dQf8QBw zHviCnGn{7as?h&zFdq7!4W36`W$1rY#QJ%C=)a%5wLR<5f7=LmWBky6H+bmUEJFWX zW2Bw=g#O#XweO>b{`<~gv-yYqo8dHTSB3s(gYnS+Z16nlDntLHBG%9AL;wBct?gNd z{@X^l8{>!myTL=(W)b@D8YAt@C-mPAu6-Xh^xt;|o6SG;-wdZ&yDIcQ8;pnkXM^Wa zR~h;r6|sI^ANubnZ*9*y^xrnZ-55Xg-whtRHjB`I*BEJMKB511aP9l3q5r-!*lhlx z|7JMN+Et!DjOh{WrsD)~*Wu&j#b6|JmSq)K!N5M@6ik*LOw#cOIMaFON?7 z_9IjN>ES8gdT7eG9Fp=64@~(7`=|W9eN+C<-YNgzo+)3mTgq4Nl5#&0@5ii#Zvn<& z4d!4E2XFx=a05qh1!r&vhrd29<-3kg`L`#eoKGCj`0QP>-)Nj)Y0Nv0N%+I=JEagG_QS9{`OueU$;j&U-|TU{Xlv8v+Rui#W6lq=lDnB_{IZL zzM-al=6i+w^3t6{|808DB|E1AjKLbrJqEx9oWKn_M2~Q0`WJ_x|2A2f{MgghKQSJk z@fiQJBa~MTQ+_$P%rnII?<&4~-goU^xMS#l^4_p=#0z#v1sHn_@Hzl4;KXVGaRgUz zMt+7vxP;Tl|0}WV@}Ih(f3NXwmk&`-{zP>p^&NSJnv>e@+TF{VAAiIz&;5GnzfHe7 z=WD3|V~+vs1>gWK-~?{q2(D}oQ0X5oL;r0uGug4bqW}8dpSsfb{p1_=byw}0@@3yl z`J!*6eBSmcpSfM=f3lu1JlYxCrUHz?8qC2S4&VY#ybl0Z-UA^2hyI6g?E2rPssDP9 zXR!CD_Loo5+qpq?Ci&(X<((_OmGZ?qrF_2p@vN_=eEL^H|84r#Dcht1jKLbr!5$9a z0#4utj^OGxappY$*FW4w|F2DkCNp*y^zXfYe2D$z&DvL5?O*NtJ@-?KsxHlE$S+Uc zCiFiU4_J7VgIkD%Y=STkWy8o0frF`7hq5n30>FCd;LNOqNweJJ02B`V~a05qh1!vv^tm}W= z9$=jRwaM)8*wfO#b4OXT9<+=Z;EmJ;tv(W!!Jz;pX{WeVn7=tzS7TCi9 zT)+wE0B{6Xu75ZT{SV{V^}lsN|C}4)J3LFqb3gQzIAdb(PrXUqNgw)D?M2B)s!j9$ zpA7xC>05hlk_s>eYcL0UIPg6H+`tiB!5Q4ap+5se|1awQHW`}C*i+TN`oz?VrhoPR zIY*-R@4Y|vne6?kJ6EXwJn4(dN7|E;m-ha6=zlUEu<$6m{!c2v*lGY_4)$%T+)?RiB?U*9MdV7$*KO3c9?4&Z_wfb{^Sf4G7(p4))K$p3A!GWoGPrT^;epJ&T> z#)NZ!_M7ycsXvcYFY3TgrM!po(l z+=c#E;@6iybxHr6BXgd_`z7?3>HV?a)U)VTf6|NEchi)2QC|Am2SWdC`q&rVoeD4p zYcL0U_5g4JCvanD0M!{F+=c$zWTc(3r>%dU7w6f3fA-JxU-ka!{qfA-XXz?FtAR0CgE{*yIDiW{fg8>MI0J+;*FRjs>0-VE#Gei0 zIbz0QPrStrFZ^F%G+(2@>cIkd9$}f{-0F-2TL#o z+iwbEu(sM?*uw!_z=@y#!xfzQcYwt6f0NPWQjIcg{jcXWrg!{cS)+dbor(c(ju^1m7yyP~N!<^&V7y@Oe@^cY&f@*QrBdupXMYA~|Kg1PjracI{r|~ow9V0`sek&s^&T%h0DA{O`GogM{JX!r24L^WyJ$R% z;?DqcKDE94m7KM;>ekP`E#*(GA3cF4F@U{3Sb-VXfg#!lQ-Agstijx${fCSCyFd2* zKZmb;_Se7vXWVCh$qUi{Z&UHZV|PLSeg?oEfPEzA0CQ^qe+PKQwq+lR_tNx^s`=?I z%2m{>>{++jpv+_V^ruzNMm;dU9@G^@Vzx#{7_`Cmb z1XpkdcmC`jF+KD@th28EZQAwWdCcUEoRx|4jFI`*r|Y1Fh|lAr5&HuHJ%9sa+?+hxjs3!@ZP^T^SwW@d@;}dMEyTcqOJa7 z>iR!nxCh|p0OS?&%h2}#tM>Ho1HdooN%8$u>`{3~jl6{q^SlbZYu;bMzo~12Ju~&bhvqF5F^MV7F<9K#}=h^Uoj5Ds~Xudwy%9>d_7=Q(s zfDIUd6+J$%14FRn{T{FdW3UGEx!UKPhBH6!`@vnk_7DAcQttC6HBJ4`t@XSHnESqm z*8!Xf^1dm1P|l#3JNb$4rM_UtGG}p4MgF2cKrX|#*~@Z<&G%SQ-{SWe-z7wkds$kw zM%KxiSvwej1(<*h7=aa-k?+9}EWyff)l_tegjUz5}Dao%0W-^p|QyB72hmb0-&*2oFZQF4l4f2`zZJ>y(-p)Khw7+pW)v;Lx8Un zBgk`R@_)Y1X4zS_KGw>bSvwej1(<*h7=aa-fgQOXEbBSIbr1HI2gHTf{BY#?puX>4 zOzj`~UzD6j{_wQ*?|gd<;OuB94ydn89I(FNQRSYKdVspbVnJ04lB1|m$yfL<`vmeA zH4TPu6C*565G$&9f!{A%tJdl31_Q?fY`_Stzzpobkh+>@`oI>9!J2$e{Rand!8!ks z?!}qs{l#kE{h|JBxaR@pK^%(ue`J~8?FYJ`f9D+EStt(7tqFW@fKTER7`e&fg8YMX zDc&Q%hcWyG!>`R$Kakhl`2O1EWWKJ!&uZO{gX025V1=f@4h$VnuqDqAG+)d0@G-aE zckbYFvF1L&J%}@*|GSm%qW?oz^gq{U+@Jg>`M``^Q`HFght~@Dq#Hgn*Qiy)=Hudd z+_7_QJGNkLR^jh__|Lh#P2%s29r=IJ(rz?BSM@&$KZ-FHpNpq~Vd%e+bSH9A=)a#D znT9Tx>YkzhiAcNAAff-z|5E9?>3u@~jift~i$edQ|E9WJs_R1k6OneKK|=qb|E1D( z)BA+}8%cK}7j;+vtLPj_c2eC6{oQR<{n>3b{kd+d>+iCY=i0sWyIHn5cz}^v9XtN) zxboBS=4XuyxG|f2{0#k1MB0r8>5l#@e=;9)pTqy$H}PGxyGCXA&iR!4$kvptCA+We zemS3t-Cy>A${whn*n>(tO+U>Zte>-B)p~vXh6Q*yK42xxz|JrPOE49-Ckx{N-okz; zR@7sI#{zyXJ|2Yr8%cK}7j;Ab@|y*9U)MZ(uW8*hE8CGB>?7;9euq0LzBNQ9zF<}r7 z>ak#OdFef`(9k1t^h>0bHWa=Y@DYu>bu&MS?ZmVaNGUOVSA*O5Iz z_QcZ8dQ#43Jz4gYnmtv2Ud~ouD{B`9j)!3*jKFFIm=Q0C55m&of?~oT7EmjAeV`aT zFAg|w)gEDy`-0GaBk4}$qVDOxrhTjLsYj{lUH9a9@)fyVIc>$`WUh5Ij?YWeXFpB$ zblEdu zmgAM*(Y)#X4@>{X-%Z^%yYz9w74n(glF&>VFma3`X9-cgX$Z z6#9Ddue$baZ~v$&=c`^NSGn%bA;+Wn=gPO&E&bdy{(_t@c%ke?vcHi1WzHAASoV_2 z{z^ZWv-vu;X4Y;PfQ2wQU)X?=#ROpnb`}e$4LlAA;}yc1I?MJ13&a4pf-~z4u3B*^ zP8YEU2>s8J{$2aZAC~*Q&&PhBnqN7`v`^lr-e+(B#IkNBXAN|(yf)B0K91J$|Ci=` z(aU6iBm3K&FMhe~6*YUM{=6KmzDBK?wHpS)0!+ZhVuG+5!~$XHaR6-D8-O*K&x--# z#(INmiZ^j)`v7t1H9+Wp=|sGUJ54|TyZ*`j+Di^{zk1J{Sy^A-YkuV-%lq=nf%d8I zsp-k}%JKO1MSorTx@jG4|6R_Pyh`?J*=tI>^dE9Id#!#hN2}K7>$SBD1F*1oM@%3l z3M-2R!VV0<@?2p`Tph%KCscI+JpuLt>cQA~qBx>Xvl?JdA0YI<2vsiKM?0f`dsatv zq@D5Ix61twk-w?`L{HlG`;V_`{-;-YUw%r?zu?d1!>Vyj_vCoxzDxeT)cZi=|CIA( z|15i*>|ZMTSN&Yh=Idn5TKlEKz+#i%`)hfgZ^ru6dZUy-X! z`{aDpwFBKN$D5y{d3;|Qzx>~1{~>#QX;=Jb&a+^?UR%2`uy`j-JQi4e;BkPx0s8{Q z0ILIpF<4taK-j~9?*j%kfVd)N5A6X8#Q}N%X)KHV{{)2HaENZ{U%e#j`zf#3zTb0y zz3zX8wErCW=kv>Y)$+b;|5fs9>RxoO+~=A%o&T5g{>IX-d{fR>u0JEDwc5Jhpr2r% zxHpIe!pPzP^?aC!uTyJg?N@>U@qk!R#R01a*c%ADK@1S4^il@ypQ%R=c~rY$6faW&A%h(tKV7KyYv%#_cAqKU$x$=w04Vo#DZEJ zu>Ar10%8DlfUpG9c{PBrAM^pl3Ec2Z0DVAvCWt+NV))=3F!bL*epA1sd-}h>{7ODG z==)LoKT*E-2il81Q~Iy(`(Ik+{#VO)srkwKuKo4p=j3~GAi8(0zbEHwHmK~q`njB~ zTIbbTv&A`K;Bmm}0bxX(1T(M$L;8Z$Q#=v0mb3a89<8u--vo#>dU*Q{|CsYw67f6`#)K}_jKi; zXRGhGuJ)yRW|wDI==odi|BtoYuO6S}eb>I{`%3qw_YX+-8_kHZR>e7s1z)|LH@t5 za*6Bzk;?ztXAbTCUH>nbqkq+{?EA@Mmitxn5Ar^FPkuk7`;BwH?t`;o*J`a6>pTt+ z1BA(-4iHv@8bBCcdN=y#eJOh$=qV*9aAVH`DOUS)0E06?)pT$><}*NX{x=b6HyWfH z`d_`$KlQ)szgGWKb5eT_o%_EqH(Fp^G!_Ed{}=Y20PhFTbMfZ@hU)*{mH!pv$9M)H z^gkA5V|{3P`q$pjp8p|Np#L?>9@5~QpNE$D#h&?Jr`7{_W_1RzZs>n3#+!Xe&jJ@# z_uD&y!u)LY{^-LDYJb&d_6*Pi#oPT#?xO$S4BQS~HGTcF2hf@E+-Ls>@BQeU>2BWp z=@5*|ZYt7#G5ijI&R_=b0f`g)zMy*V?>;4m_I+(|I$rLlUWoj^bnet0{nu)MK_5W= zHT3SE&Yi3updOUYqLvP&*}IeK{ld;%>Gy&83SsZh{tmRSy_!Ayvu0VpS?^!5Jf8pS zjl)b;|MZ8v2RNt!=mW~1>M_9H1E3%9=&~nB9+FS?2IL-2RL}bsrS65beUG59=S&7J z?98vOea`*V!?oPMxZYpn|D|=7>Fd891E>M~EWl&H{nZoH9@D;y?qQ`5S{!&x=)Xl* z(RV8qmhbI3A9OG5{dwQP_kxo5UHjtB-~F@NKkEM$>6zHj)73xEht%~??O2Zi+Ea3_ zY_)*L0qqH_9(Z`@e_~!Re<0ObMfrS>=X=HAf$rgi{eE5haJTr}ANhYi7j6Eg8~XPc zK;H--k}ugafz$#z7qIUHp&r2R)N95MRTH#{%dC&B7+YA~WtykI5BB7HbPp$RL(Z@1 zez5N!Klg|Jm)7&9um7qBusUFYI5003kaMUD)(ri(=qie_#Y(+{`CQH4o$eQ>{m_4l zq%JUYH}p>om}~eE@t__PYW0EQ!UD^QUrh)B)%Hc1+vn=s&-N;Q=J7U{$I<^D=YJC- zvB5B1(?8rdwFb+JOU6V%=Q2f89=L9P{2u>zjCYspH^-;^t7B8XO2ZGZJ8L#`WG&%>g?~}U+VQV*;yl3_+&PbnjRm3qr6YRU`gfo4c<;J*trPoy zd30&yfZH+U0dm38p)`AU64nJ6gEg3gz4HJk#0EGb9t`5ZgknJGf9d?K3;M5Xf3EJm z?)%vhDgRWpANAj@ho$_JLqq>hOiP}9EhQNCf{ zQuo*Inew%}hyEwy0Sk|!v$O(?!J0S#_Hf`a0B-0Dcs~H{;L!R2q5p+J?ci^xu7B+p z$s4YJdd<|9p8KggZ#~?L;oEjqeD{( z{db6r7N-*WZxP%c4;}jNF?l0QJ@h{USTl5K=zliI4*kyt&!es~^gk+M{k%T(-%sA! zo^|NIZG^iqe(1j&Jalaqq5rNi($0KB|Lx$~_fbRteP^)Q{6qiEaGJHNLjSYDc<6sN zcpi0?q5n}4>*w{M|9o}Bk#^=2`fmrmFd z<{$cRhSRKF75bkI#zX(J!SkrA4E>LaSU;~1{r8i%wr3ssZyVumj34^%1`l1EMd-h4 zjI=YK(0@C)_I=dQf8QBwHviCnGn{7as?h&zFdq7!4W36`W$1rY#QJ%C=)a%5wLR<5 zf7=LmWBky6H+bmUEJFWXW2Bw=g#O#XweO>b{`<~gv-yYqo8dHTSB3s(gYnS+Z16nl zDntLHBG%9AL;wBct?gNd{@X^l8{>!myTL=(W)b@D8YAt@C-mPAu6-Xh^xt;|o6SG; z-wdZ&yDIcQ8;pnkXM^WaR~h;r6|sI^ANubnZ*9*y^xrnZ-55Xg-whtRHjB`I*BEJM zKB511aP9l3q5r-!*lhlx|7JMN+Et!DjOh{WrsD)~*Wu&j#b6|JmSq)K!N5 zM@6ik*N6W5$y?jA4*j={a5u&e{da?huFWF!-!(?snNR4y9bEf9YUsc33^tp8=)W0G zvvyVJe>NBo{m%x^qpmXaKPqDVygu~bPu|*|b?Cosgu5~Rb$g_I{az`5cb}BMzhBBX z9hmaX2dDg#LsS0g;VIvKRLXZ8lk%^ROZl!7QqCvJPAX)p%2v<$Wb9sJm_EnnZ5)lK zaT%Zca6j(L{h0^zVP4FSc`{$--3Jr&dO4fl)HFoJLMO@kYD`l zh?H-YU)&k< zG-5BZ@r{~aoa%mYpEAFYE0iaGb9|K}=~3^JU(@V`=f97lDAZR4n8hXsHuD}mZ zRxF@yJaLsl9Ps>bv;5*l`Gw{l`ftcRwe@Yvt<>AUIyPC}HQfz#Pku-9k1930;`eht z^YOAL=6u$ZWlxbkbqwQk`aI(>9^(=dxDWR`RrfW%%Q!$i!2Fme^JU%*ml&6gfq?4j z;+}nj8n6xDaKCs`1XO1gL%wm+Qu)Rlzc?GeAWuA@$`RBB!~w+~ z%MWYVev!I_8j%>F-azQTA?IkxYC3u?}-^Kw4#`LaLB z`TReX{n;3%&+&Q2IalK`E-{7s7~i@tai4iu{ik`^o}jS#GVg{ z@F)CYJ(>H(vnsz(ZD4Ug`N8VMhss~?U+oE2wf?d7j*kreH>G@-UtxKgFlA3}b-wcP z*-xu<|J+im=>38h%Kjqf3tudIiR`b&Fg~ZxGY;c1uEhe~$KrtQd#3Jh`vT2}c^TL2 z2g(@Gbd7P{=m^|-Y${6MP|uA$H+`9bZ>T1R8}kim^V~`LhWo`|$}j%B%qzr#bN^U= zp?i6LSh0@$RQ)4r0czD#*0g>RXGq#7M*eR|dD+{q_@xI2re_LU_Vv`|$dm%T#v$}x=3>GOe_v5~{FCgYS*P0)GXg#1J@_$2) z$GJ@Xmg1g$;~5M4#zlXVu0e+iJ||doR>Af zG({Yx|7P{R_FUv(VlK59aTp%p!!-YQIbZTB*=usX^dDre9mDiFKF>H8Ydnhu&Np#i z_qCX>dC(hRUe+JfJS_&?JM`a_`GGo7`vQ7L)F1SZ zIeR+YV}Nqm$*V{HZ^*gT)RyYhr-rXEA^};Qpcih8&M`nd<3czHdlxt@}ph7nl9B{Nf+0 z9P#(H{GdIf*8=pA*$-F@peNulV6D)9L(J47Qnae!~M7~_aAWW@xF=y+KV<^Vq7)`0@_m-ckdhO*R<&y z<`@4V-}tvGM^tfu{9yaVmy|WB^##}`dJLcrpgw$1=)WQ7<$hnawe@loPwBzYkE5q| z(cemsioMkM#A9@Nxp=wazhrO7`N}uR)?b9_^NhoIjB9a#xK9nJ`*MHg!F-sP#d~T# z%~ySjhD(gg#y~(iDyHWf_{AG5zj%Eu4p1kuUwpazf*Mi%BF>PkS5(CSs}CO$`ftd& z_0|S8KiX%nFU^55Sd){f@yXMc>&1&{{w+CQ^;X&2WN#nC_?$j}rN&`A<6E_a)dRYp z)dJ2nF+lUO7(gAsUSOTje?yMPxlH@4Vx@187uKtML%LhgH^>Q-@D2PzW`6Nz{UjFD z@&o%ts}a>Fq#wok(NGLfeYoPWq5p=Y+p~MNr*rMYuduaxpFKV~UoqJ7y>x1tNAK^* z`RaGd-X(kY7{=%HdB(B$K`bB+s2<>c+_%oP#rs+eQ2)2#663Nl5KxU(Ovg9y3)zrg zC=Lwr1A7A1h}JJ+pIDCp^aGwoKOpqqkaIgzwVI#2@7jM&i81>xa=z91%G1Qy9`}j)y07j3oao<$;p=U$@j!& zbdToWCwqTs*KU~esOF!waWtOC0gL-y3)HywcyD#U3sv*28~Sg^@i>=BM@8uyo)_dB z)(3Lmp#RgRZ{T0}8L>cd!2E*zKrKLxNWX}EqIv>DF+g?fInNILHzeKq>z4QH{L%Jkbbv8hMLOsfcON`6LKtN|M#Z-OcZvDb*0cyl*pJ=_J z*H(1^G2lg^|1mg^j|2jNKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCT zAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ z1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv5C{YUfj}S-2m}Iw zKp+qZ1Ok0TAjkg#ff+~O4ioMJR-$mL{o+Obi}>&05%{=2ySuyVpZ9mp_a!IU zJ!h{x&z;$wxpU_(004aZ{`Ua_r~si-006<;d6=rQEIJAa%G)XWCpjtg|E~V`Lqd2v z7`PN$0Nx6Jk`mYSOh3->@ST!=dCj_@TR3lj&QarBOXeSM9%*|2z&&Y%m{q?jZi|8kK}|@CvYb1C*AFdXO(u{ddTVYpK=2s~kq9&`YA!CWF+kX9#EwPT$M^R+1+ijmYkx2XK1qDYSa>*H3 zL=(HY;SDmMZSO=?tTD0B!KjZcZ2amx@$XYB zQ{FVsj+agx$lS!5-^)20X-7+G2o_|`zjKsf%NC17F@R;E7Yi`IG!#$$9*|KOlH)}# zs*NmGwSS7Nc0WAQiD2FKMrvFiArOphhaAXADxx90P=hTG_)dzTqdI@4<8Ka>3S5Wd za0dpCVy^j&8M&(5W|j@o*Wb3FENI>P-JwK|J~@8c_QRZg50>9HQ^+epr5Z8>)WTzF z^4Jk1MkbL2s}=?@4vrOososP90BerVUA7C>*@rR(v+doYBGNNps}C*fnW_{ks)e1S z_m&k;zfrODN!mw+HRq{%&GYIVOq~uX?TC52|B8?E!^hf&UoYp@Bv0hTv&x-7VuMT~Yal>7wW z$4%+#JJCk+gWM0_M*=fO;&1 zFd>w+T9Cocz^P5$fro0~ zpJR|xAKVLq1aBgGbfaBU5H(0UF>(e><%vhtWZ>zx+~0@;sp0^`HbG*^7$kPz0$xWf z7n(UKsupi!tUtUyZ?+$+LR7ihm%t_Mp8&p?hTcmnAxAYEysCA9i}0z4`P>7+%O|G< zy)|}qTX0tYP|gz3mp3^tj=mB5;Yp_vf!4lx2?yXX(M9qIw$Mi)zK2mq-Zp4Mq~#U- z+D$^Djqlx&DH_$zmmTN;)xB?MZL94(!EaL`V*vm{hHfT<}CV88y@ zZA`ey{@W6d;5Y0CAmZ&gSn4L|N1{2tTcv{e&?g~5sfSfQM;uic!nvr0V^U9v!-EWpf8!C&*6b>ANi zd0pNFEM%xR0ER@Fjx13w*0N^-T@L;#gv4tVlLixwly zQina~?e8c&nk(d@hZ)UIilN|k-Snxcpvpkd=;HrBS^@0Yt~r^Er1;9 zpv<$u;Qt9h40D|`@xxicz6@~8j*8ojTFlBbFw~!|sxs)jk-G!298qKq(s@00udN&6 zXwWq8{Kc3jztNSkz+(dH;C-w0jXZzfRjfN3Ohr~FWhs`U`VPYsCSpt)!`wr^N>aZ8wE&yd2guN} z^!WC&$_=zw-P>K3!%xXyUgqn4pzSaU6T&L|yPcDEc8a4S^6WLa zPC(b(`G;v94+V2I& zJxokbQ9BT|0jF?|%k8&+Ykpa($7;So`95*?iiTfkRS+ z7V4F`fCV*q03~}FyS&xc2C>7jue{YJuO2F*;pgbJ%4EBaIut7klS%*tioek$GZ8t1Gm+r7{#TOnMiE=3aw!x{ zrMc~RC{S`Z9tw$;H(_#mUA}#`kH&$Fyva$MaoETJw1i*){;Heg^gG-1oamqk?Mx*; zJO}`giynDMUa=f?HI`1ZB|PIkYi*_Ubt-zR3B`e6C0MYFpx_`1V25`G0zQ+PWWY$dADq1Ox^eVvFW_e)Pe`4T*t^#pc73$Epw$Kh7vI0wWCK;jA zAd?de-FF~>EF=gP*GlQ9r~?|~RMUV$-^QFvp_Z@`Y(yKCNGVoUL3=q6E%#_=saRBr zs$_QM#W22`>#R+eg8D?R+kBQ=%BHV@xs5p_vPfN2qW+OzJ%ytIu$njl0HV~i)P)caT zU;%(cZt@q+_Jb!)pHvpqvv~y++VFhdiGGebVa-&M^5z%k9L2)Wb zxcGvWgLEv%ZM@}<=HPoDpe=ylrwK>6{Csuk$jo5kGD!zsJ7m>YiHl=^bjV@p-Uy{UjvZvXH;C0(K=P)O6H6mc?hTeiKu?e|3qU`)b5VhE_0%gu zS^!AB0qUJ{C%5mWu#2`A^VObw36QlCf<41>Hx8te7*+_fd|O;d&VDDY2u{J|lXr?m5fB1YN)5l(g zvl(+yk4ZAao~_$nxtDI0B%>#SqnnVAn5iPEZmW5yP0CA zsH}uQ#IvVA_cNv8Gy(#VfP|g*1gk=iE0kM3FN2{Lo}(4(nIB?;>54XA4n4PG667jo zpo`(9gobJc?Zp+#URA#~ql6!jddE!DqGWTdBT{j3vHQVBhI|1I9;LY2by>>PfCBz- zjjai@tVG<0*QJ{MItGQ8wZ^?_`z)L#Azfl2Pr+YdO|%G>}CaIG^`TR5pg+MR3vko@l>cPu-zA{rmlVV};ypQ7f z!h9>VsrmPx{d=k)RqyE!X}()cmMI)-Jzz_7E+?h$msqUqpzZbay)=F%?nvxi zT^r=DW@R>-??N%?075QHaEe46f?dtUh-?)4ALy-n?-#qz`^YCltHJyBIy zMQj80_*)J)+;>*f4q2mD zVwYZpvs&J@_DWL~^S0V4t-=xqRFN33Qx810dmJAvzgC>9FtO1~8CmcBu{Zfg+0829 zW8;2kk)~nHxI_dBeXrK!j%masWk=3^2RA|=gPwfpe}1w%DJSWL_DU{ZE0|{hHXqpJ)NFM4~PheHj4hfl0RoI4!4@ zeCPVdxnGRzb>Pty>~3}ZoS_uw0FYoRh3+^ri?iCw)Z`~z!h2ifvO|^6T66Mij5|2X zRfuZ-^`g*;T`(3&hlP1TR{aQ7Rp7BgD1u|**qFoyj*U@5w1LvaN`-Mq;$Ua)c1J%| zT7pNAo^BQHM{fkhzJrIq0MVQM9fbaw8F9{t>+Twq-5B{uLq7kkrOEqQ5e+%IQ>?Fn}FVVRI!K9?%exE3?-t70>Vc}X7dj85>ayJ(u z_3`?n2@M|f-rg<{53JZI_Ooct`%_R z$x=jo_K!;rU3yNz^j8^3q9tql@~)!oj8_di)nv}Dn?d!(rPNhcD(NwBb6ZO%jACEqE{Ofd&0Hi7jg!d@j_BU@MGsjAEnbe*3QVgCBGr- zr5c!r!ra8_ERdyy{EI`=rSt(FbXO-hJ*9}%?cP{v3H>GWi&tC^uk1Nq@?^&(XN2Yy zEze(Ztx+GGJhkr(L6YDoI3}h5x_r8~IRVByI~vvfc@JfHW#y^oG-~h{t>O6Y)28fN zl}G!qo8i0jxaO~z(gCk1veI||kd(~!jyCr>8MfN8a)Xi$@*A+jIm6PC?+(E$t#q04 zZU{JXnjpZMuA1by%1lf>oiE|fF)3Rb4!#8;COrn~|FPbLa^X6kYU_S}GmG;Hy3$`m z;oboHaxJgk5e$>BTzu(7N}p7GGiaIO(txlUK%BE=C`MyfNMe)nXzk||qn(NND{m8W zCj9jvH7jv&0-)zt6ROx7ha1qBnpjIbxd^^{!=xX)Ds?(S92B>Thq;yfB4s(VDjn}0 z4|zQ35GDS*mx@Sm)Th_F-`UHRp5#hR!eAQGzjKfYr=VeRtsO`;3?DJih* z-yB3y=_uK>aDs!Rr0RR)jF-s;dh0d42?H)E)6Wvc$x!H&n7;Cz0Nf|BLPw^U+9tt~ ztZ%f>=|8sGs?ZmA$4{Yg&32Sb`o9@FZTQgd%T>rG>_{X>MKBhArM`J4p85b+xsi|u zn_R9K@YmGW7ztJ0wwRhAjgqHLMxo8gybkE*rk?k!Co6y2;(s8__U8Mf12m*dd-MTu zoCk+VZywd^I|1BJVtZJ2so55qm;?S?iL@TkVwBTD29obWQ8G?CAA&Pq?+Ml~>ijDT zgGBpu$JsV!;2DJX?jOEjHpz-J+%@e;hXJ$3JC5P$5Z5RXciJ>1?oH}CZEcux6G2&G?~ zxZtq8@L!qj@#i_$Rn6Z4AFw`;b?QU0z=IRV(3c1&KO{Lq!Zr|as;deInk!pH25S8-&H=x%y$$81( zOhuwohBrY=xUJ7A?h#{PWbwrazy6XRj`X8u{X>;IEwCK$$l7l7Oi(_a2YzGgi)XT% zy`0zNaica--i^&rQ$yfYjNp}xa6+@EZzV)$YSV3T(Fmnr zV2qGRZBMOi1w09-L?6TH++p%umcU)D>P^BbEj}lHlt$X%MB^hhq~V4RDadXWbVE** zWFQDl?!~`lD~qAsADyZYnu}0)v|)r=)i@!TZ=Pt0NTGO^F5S_H@-}Q=R?S(_@j~<| zbEt2SYDie_xHLnJT}``A*%zGs(G58j(&i@RkXk(-0zRYgIP7O;(46U_mL!|gM^9rm zamUxJ(%8tjKsHr68&~kpTT3#}A_detRq4*7Wy^(XVgk448^t63g zx2*SU@vBnes{XnAsU`U)!->~ppC766;iu;@hpF3P>0X;gI^;eVzs-_dUy`F$~;aI%v#DU4#+36i5UJ84j7U=Q^CATvFsb8b&{Sgy*Zu8 zIn6L#4K3*cpA1=gm(}sRwa57%tbpaK3ctxQ_UAOi{94qMqH(@ftld3{bhyiLE^^NE zf81`PCaXc+Xw;q_y!-4yWrwCg%sO>hx~O7b3SUzHQuCrC;1Q+$MG}MCpAZe;vv0zn z5@^O>d)!TF1$Kb|Xcrmm%VyuOGJ%x^vp}UXx4}ZmjA^8puG1A1M*^s^V#_4L6?zH; zgQ-#{=E57EA7@G9L$PQzqPrxD72`m|Rfy}&h{b3k?Z01I(p_n-a(=BS5wRrFXkjS; zU*5Y%;5$dvzC;Sg^1ZUe)sWBNArXMa;cB$g02J_eAW)-y`cC0QigGRcicIj#i!AdsfKimtWsn&mU++JpPRs-~0Vy32@?t+=SKv z?32SILT=-_j9ScXrn0mkwfUs(a2L*&MN-RJ#l$fR!HsEpiCzC!Wc|0 zar%TIMrk2ya)t!p;65OoI>;CHh^gDfh-1%omcbY)37Wzf$gB3*IsPVQz7W|v{tjpP`SBPtUnVxzEK)(RGB$g`@9d;a_0b}>@uv`8qRjM~?RCUh| zA1D`9=pUIBv8S?PWsm1THi$c$1NJ+-b0n3%?&e?U0GnSDD)4=^Dm`AP#VB)RfWGCg zqD8AIAhN`mh>!9UMkQ3oi6||=$Ubv*-g3eEAD2!97H`I_35x|tM49K7XTDm0-Hk!j zQV76$2ha+j5T5$hZ(Vy@`S(VNwc*-5l=j54asW)Vy{V@zQbDKUA7W{R;?C9TxE*n~ z+*vv?{T|}3Z2Y?V*vUo>_)y1H<={3h_ljq)M71o?a3FJ}bv?(DF^3^oeOlT5qJ-Xn zt}K6R)T{%Re8YRZb+pOUOM=O{Jdbl%h}$XjRD{917}U1upfDK7?1P}xdXVr_0OeS zFAG9Lb&+6IMETb6ICJWx7Tl>LKP#i!EB%t-&?5GS-OSqSM_rt5{$W`2=WBlS{F?)m zZN}|ubT2haWe>`#cn1)aJ)tCdW=qb1kHo<-1;fMpyxki_wus)Ak1DYep8@AI1Ube} zxC-x)L0`yi4ESTh!bZeUxpN2I!$zcZs0lzER0!63& zsOqp-m}G2mfSa|BCIJABDc-;&w5P>}WOf{l9-pR;F72(m^f(fvuy*TRCZ?vk* zPx4b&a77{d-v}lQ8#$JMVSOmOkDnc^?`%N+f|C){myWCj4g!5{4PKtqYflh7xJtYA z`Bdd6&0{1Y(f9a}TjdusQI^TtU&lhvPPvyccy{d<`%HBv&-XoCP|5t$i>1$Dtv-a^ z>Oibi0)YktZfiXaJYg7HdVOFzIqriPqHNt+k(kvNJzJf3RTqwJ4)-;FVXc0%-FiSV zJiV06Am4!J=T7(aGS2xTR%CGoTF;g|EF>f*z$cjC+ra2_A9w-a35qQ71)md*y)An} zP6EEM4JEF2K74}U0D_W#AwlK?6`cYm`fhN}+f1{uq8mMnWvxmuKEj56N zo0wJc^RFRfhd>NR(;u=N4A>K=0d!FuDF>asjtZ_CQQ_d1&vV16<}W&<4gXb3k8bzj zxp{hj)SQwvLc!h0L+y3=N7o*>rI((m_3J%^Kq^}UNB6#c=k=VkJ;S5DTCQ=EC`ooe z?S9T@%Vc!4Co?Tfm;slS3*Qd3&&fIz^Tca$uU;2A4T`aF_Qsz4{oZ>sS47fM1+;_?^NzoJ)!*ybx`a!iTlljnxwbywpFoJM=(T&c4+viD+c(+l zS>T@ibC6f9_WETI39Hw@nUH!g-r8Qu5873oe_Yk(Df$-R&X+CoF^*;AqYcOkla`Va5x%izt5CGiIsRP0 z{@Nisc&Sa7ABq+ZPsN#L-$+e(Vykkfqm;)blJZFaE$4ABRpX=Sta4HdTJbVL<5ujp zqCD2dgepPts1+B_71s-{_4abBUl*G*}pcr1z+&&=r>4_g#m=QJ`3*eYXFse|p-D>g|X}zh2|M55TC^;-1z9aSi99wD<;_;`H*h=P3?8v=oKLl>%v)>=<;n+^;Zv7EG9ynH=a}F z+=8b%HIbDr(g$;MNn7SvcG20s*e=y)a|9&z|8fDw9#}iYSzkW!X?p-~^wTr(-L!5y zQ~0&%=}DLQJSbt!=9uoU%g~~-6+A^MvYs2ofU0m-n9>0s{JKU?e{iw*041go_5W?Ti3qpKKRA5GAX)8$lwN*O?O z^y%@ACoKtcAIS0}k7auMX(qh4<7b3rEmvrf|7piLna)`r#61Xy6tgTV9RIX$Y9K=% z&5uSSZ(2Q&!awe|VOTR#m_$`bq7za3$y_hGZX=g;3ZHys@jtF_%z zn$(MThpG?VZ%rl&7bMi`35i2a+}4-0l$Uo-OT1i3A51mm{0~_~VXivDt!}RGakQnP zrbQqbVsPT&-~UjoI?lv-Fu1y5@3*7M9cC)n__JAi&GWf@7&`))>DgWu6n=2hv#nuM z{fT%9)Q4eHJL$}*H|9kw)UT@D-gwA)`1(5Q-Qua-JjGQU#(a`^du)~_vtJ8+J9pQI z#u2D|VEtHcE+9u~EVolkGx3NQGs7Bv<-ni6V-X)053O1p6Q=0o1NZ!%H5ce9Fze>D~e9zvECcD330XA|D=j)oxZhl7;r zM&;H##zY@M+*^!<*bn86hOC}A+x|`{WkS{JaLrG8t8kmUW9x2?TAvR z_1ec~WjWYKKaxpA&KFc4rbzlZIf~x)0!u2j8~uIMU?je&Su+4l&v&5r>W|O_s*Bw4 zAU&NR+^{Lv!&Z6S76Ci^$4NR?i2baHU%An?jR02PS_F+2?cs#lS0z@NL5?dOnk=Ee z{u7PogF!T8WrUE)!tz@`2b+K8#DX>q^Y&R2&7N(0E$`b0K8l|3HlWt95q}!t>>jI` z82Y{fSR%fCVqADfUiPn@8}`7X5kjiPErQNJ587mLW=6=6LrZ<%LuQUHVJg*7-2%T&)Fsm zC|9IExB^kVzo;uB(~w&^dMj&lySFdCcJX<`6aOd=4y(5M0l4_64fk&YKvHvmSf24s zW-VTNc9edgqti?s800aUzc(`}M@lw56;^8LZ1*K8h=qne=?zmi?4GkjmTwMnP86RY zfUiPecnWw~S~(;)yX&CXzd-%0HgErO_wrvRAK0|9-u+W}|CrHtTT33r zr{d)>W*m8;_W%eYgcJ&OZZTFcP+*t~KPky2?FHP{e~X$K7C%Yc{FkB`Ay?gJgL~C# zF%#*dUjIa%+$1DWiGLRExm5ZwpH0Q+dM4y=*oZ9mTgQ?-XEdxsm00}WE*#UOIuUo` ze1?#uQDE5_&socyPP6u~DbHnGpm%%t@8d_l8fON4c1MED z_7Qkk^hOe5IQE%}iB;|9K95TUvBF8+x)rgK0>>B5zj{0^tG~U?j`4R#+T@jP_Sbrp z0BuW1Wf9YU1qoE(iUGYS-`2E&=|#Sa30`RH9860Ef7xla!2FeuEL^B3t|;8$j>!pn z|4VMXzquuF$xPN{@WYP4Ul+rmN7ZZn#6gi%*L8Fc?w%w1pH0|0K%%rW9*_{h0GB!*yT9>|nlU}0u5wXBn@MZduDh>s-Z{S!3B zYeIt{}>Cl9w`xEnFT)+g8otJ4OKqiEn2Tu6n zA=!~XizS2WRb1;{5Ld>~s|Amn)GGB>_^$TU@su-%_&odRGr)2r-X2oDz;&ri6NwXfFt=zqlBqZ-tl*TKqhA%&%BP5RkpzXK0RSIBoa(5wa+bS z1BnHi?FKg6Y&?Cy0FeI|t?$~GisRo&A&4J#F{*d7)FtFc+jNgImuTD%zqxE>j#4CD zKPX+EKBfrzdpMBqO5fst89EZe{soSpayv`Wv%J~3g%<2jhZ}_(V+dj(R|9L1K<37yjkDIYl1CHAvYX;d=f6)ibSga;2(cH6;~?}q+nsdr#_cST%mkwx z7XPyMfcdq;3sK{}k=@2;&lTfQ+Q7+MZJX`croH1ns4*vIYzge2=A00 zL@O&KZr9pwjQ3$5BK)w2(+`FHKc&|!P|NL+RdlUhd%*1iOMztk#Aq*nKZhRO?5oeM zm%$mAfQ*cd>ed$aUOtXr4w!okpFZEtr}?Zp4G>#Dqiouo(B?QCV_+*g6R{2wIGaa-1kd{4sJ=F~SwU%A@@aMp!UJYsf9x8+dSvO3cnbK5 zMLV2#blN#N-vx~pKXn&X_9OUhwAIj&Ze)ZwVMnV_vici?ME7)1o&=`&tzUngf>$uF zGq`;bQP{&yKmZO;*-pttgcAWEZOq=?QCB;0!`7DuHcx`jn_-sP{%Gm-ZB||7mm6br zp8IX9WYhL1`Nm(-_FefwlAdkl{%u44w=eP-qEBk&mXg!Qmjg*cILT=;-T7T+F*wxs z`U}V@k^KY%eLX`iGt=U(Mb5c81@!ozr~v@k<2@gz#q3i{lR#`i0VoXznWvA}_;(#> z=ManjMRj7BsQ#6t{=nAveRx8p4tiV9&T#BM1fwDyDJ>rti=PH}OP%(UjWlmmttCES zQ-h3>da*7R%QKtolo8l4HD^dFCF@m<&>wAo-)lUco(>ruVU6LQs+#Ft=klOh`rT~c zAqPPu#e|*s%DvUh9$ihzk;&l!XzY~*qFc@x1)r}=|IYb2WIyC$KrHJO=K zW95Kr9cmp59=y|5;IFU*fwfPu7dX`gt#;NFkk{Ii^A5Lk4P9XR9_9I2A{U>i-(6L* z@9l5>`UduT^nk)Pgz8JIGC?Fq%3zsS_M5D$1L?txH)S&&G7*j}BrhU`mQI!u3X?xM zI$5xvAR8bK0p*eG?C5%BK30N66)GK44YWK~RtW~qmu0=^ZzKu@6}>D2PKIzL9U3(J zPA|f4EIV2gD@py@O?AAlb4w*MNEIh^0U}WgGo=*ET(67NkGvoc3(S*peD>y0M?xV& zM+I0GU4)!OIP_rmr~e(@8GIESA4t>NSfKYT{!|Mb0pB|>`xTS9$qt1-5Al0_7avWp zmUh>Ah=}iKZOK7W_yENM+2&$o56c#H)#Sy*Q8*O0Ez9=r48_EqS9dqR^qjad%DEO? zZ-ti9*Ft4#E_aF`{(iOgSWEf4YD6_H#6)+eDhp}*oq)=OtW!Pa22K9Ewwa}JIc%(| zTPT-Lb#V3E5wDmw>SsJ6g-u6n87YQNK&Z!WN32uL+vyJ;G^1={ly9quCKMl7rZvt_ zej4wN3Y5_EagK)mA%6JNHfU!%SS4Ibc;oeFC5>zUEtC`Eh!XI6JO-BqR58aqnD*(H zG{P=c3Prl>?`8bOQ0GnqIWAU2srV%^(v*kwjdkId&p36?O}L{6+5O>wAlt(8+MsjG zq5s;42 z$Uj zA0oNte49W4z+zaJwG%J|bwNUL!cDWyl1cA^km|z9jY;5jROmduaL(b1jD0WjnAUpg z9DQB$weB-!WA&El9fYF39oB za{PCheEhchLcPpP{AG&DY^uK!T6xIh;P7cGAkg%;aSFeK-AA$E)Oy~StZFHYFCM*^ zBPHNsqjvh?!?TG(6;<;*UD>)7DzyHdkeHHNv z<^nseVh+NduJ9A#!Z;y)J8=29!LwcRhm zv*!;ijCHVJ?~c{!b^LfbWQgUp2kWKMjwe#Aam01bRxr1pPA#&l1UDg)wqXb>`J8$7 z)KPb=T9HwMvvWL+1J*pzR2~EVw1>II^+C5dBkrO_mSC6@A?SW3L4&?^?*P0ATK-_N zgkG16NWjO^SpyUU2Z8Nu2+M~eC2O04BfYSpQApbry<>0!sRS|rBE%bjzdDOaU@VZs zl*q(tzLL`3#I6%Ct{_S)+cHWtcMk@b>^)rBxQ(iG5YHY$sTFosn(ez#lLz!v{@B^Y zn$x}phiy>`;;;(WAESO5HOhZVJF$D}JLf9mbtRztSr_71TH1NCqJG?A77~^h4O(W8 zVZ8@d{P~rCqj$h7j2XNMD9apU1iz1kmT#Gw7(I+_IPJIvF0^j^7^cvOU-u$Tk}W%Yfa1LroPVttiy&y#=(t53se+Ls52N2TwXEwUw!^ zR6TUEn{if^6!WQ%Q~ai~9Ve=wHM70s8^b-niaVEoORWv8p6d)XGp_tlztUec6WkY$ zzrQxf`JD-F|C8HSBY~?y_-+&{9;L86&g#;`3~~ z(-doGQhnwjv=j=gZpo@bb*ZG3ZH(_V8T|*qS?DuH6haX4yQ*VC#7zuy!lr#FgJVMx z5Gr)`Y)+~vkd4ennmv^GW-U@rR!wf!mBOMCSAi zJv!yepi;eBZK`c|@etbr4|@eHI`II{HOdu zBuI4g;>jxJd;grh-d2t;+s4T0VRp`BJRi8lPcVB`Ib7dIJ-y#(mG6s=;)FXvU)#3U zVDJdFlJO@oILu$+URO8}ko$1%`SZLX@H(iVJ%93?1qw*J(YKeSoL_J}J~HOf6Ch^? zbjL#IMS4wJdHfQWNd9rfjr4LNt*1HtI2YZgnI6v#!=O4K>CFoRzS!nV{Yg#VjK-+? z^Ly23JqEqP^g9G0Z@SJ^CH+L`;>L$`e4Eervjk0n-40Tj=l-=w&A70h95N3pO_6mG z7J$-qkYWnj2x&Ch^D-mpEi1o-Xar%!jsgi|T(=ofl!-&~^c(6^(4!@Z4rx~aE15j* zF2xJLHPoo)2(<=lgJpiTP!y{;p1SK*x*cD#~TCqS^3k z*LP;7*YBJiMv)1k9xzdq6T|#8me&`fS+t(e+_s|K4q4tH`O2NLN6C~|eea~_+Uflk zch_WPROhA?4#7%Kn|wQhDyatMw|!JPLhUF$P1)VUVAyqc@(4mq|3s$w>(YvLi-kZU z;8#lPYnOLK#~ceg!SXu}#j1GDhVjhroLQ~XHSDCyjg!5Pd1pOcQ?s1(1-?*I34aV< ze)oZVW$cOHXC0l#{7!?>7&LV!R)6MVGzm@afSIeJrwgUn3(Z9Jx3UWtvJwq1kCiR; zn4z*zjdqQ(RjjJ)KDf@s?JN|s{$m&`%n=#`q6)Oy$&N3i?nrt|cgLIr`c6Jc6>?K1 zjOfsfF3* zz^IZnD5_u5F_+^G z5-3bPl199t%coEwd5;5QY!n1wtiD#}T*w`}#U>-GcfeRIwsotYO4vf z-NrgY+`l`Z96Ue0$j#y>;XwW*zJ~YasNNtIqmK4W@5o5E$`u|CN zEl}D?m(4;P3%+i~#*({tk23uzBbAH~QB@RhZy_~Hobe!X9oIKsen8hTLF<(6mMrbO zyC{7_>WgnK@JZ!?e{yyn;VR#uOJk>dxs4q{d86BLq#CN=SX6THgSzcj#_3Riw{D7; z0s#yU#fG5C0vbYeEf+*N=+3!PPuJQ?oK|ai(jrzKDXz(yUjl3)`@zN&gsW=Gz~ZOV z*5#O&oYBX+N#&>}Vs#J}xi%R66Qa@Q=fBAeN}1fIvT2qcb{+D>ym%C;D#z2&KUlKc zL}twHYX~KcXWF7EsMEYp^$BXCsU(UFwSLUuZ+M>9fRXKfI_LwBGoEE9W5N)~+Q%G_QqCgS~W)KJ@EZ zB{CgAjpHo=x1(~Vd{u7m^Ve7oz@6vx!N=M{#mu{U_|FR34OG^O#Dedo*;>E1l)jqx zAVDf&qW27V<0xWM&jBXgYaDue6pu-MpH~hSW@FQtP&BYNQLz0k5v_$?v_rq!NjcEd z2p^lq#yhw3vq1xGV=hS6EY?o#m*~eZspu}m%(XXtNJnEHZ5@(qF=*FzgC3LWSzw_! zkUg)Ey|=klKzB%~c4f24z*bmJlJ7T9GSUlD!#qq!gx-P(QiNzD<>h*nqd%;pC)H1} zEvmC*zXBvP@vg%6Watrp+@8*Wv+rx;P5A*px#q_y1$(%kN#W@clSpVi>OT@1eO{Y7 zf(9j{(mDyOyTEq_ECeI+9uXz^iK)c(2aU7)#6Yw zs!cr}8|})J&;(hy&*}rqFw%Jq2E;xJD?-Fz_BnQzW$2|Ynu-lAM}zDdH7VZ$l4U-CEmEfT4Q(7g|I|e>lHZTwphR8>7kOps-`d z#&#wz!(SIk=_l;CX-{;T*HWE>keYyptUM+C&w!aTvg0KO1Nkr`jnNzi(cJa=Q^|}E zWM;+Zj_kK>_n+5{cTWPSHqMQtU0k#GTHuMI#uQKolMvX&jkXWV!_S+oiXs2-+qtcN`(RP{Q4#fNV2X z6!p5Eb0RMF$BFm3(PyFK{Bt`ARKYhTVz`!D!>Oj90vYH41RM@_VFr)W4y#%|WKpUfDufa#yD@R#e{q9kxC=*;DW9poaTLwCoHPXU#yGsNm=}R^z%Y6jHWl5g}?5m^m-JRh_r$jeQ|*AD&TEEru%4IObIv^AOG-t z?7YcKd$|qjS2Sda{Ks<$op{?GAYlC`h$&lVUVRjrd*}nlV1jG*7g_j{ESci)ov=Hl zx&v5ydqk)@r`&DfM=GKTwQZ-KC}@tc;3~S}ZWrk3_IpKNWqNf1cU!>4P6M^S{a#8c zn9~!Bqg-j=nMfquPkq28o2)oiody2}>G+1Vw!uGHaMa~vpXXigy}EBzTj z@WJ2U-|SoCuVmt_>z=>U$^4(-NLC_LzB(*Ufi4_GkUyyF2^27B59wQFs5+nHeG0|_ z9DYVK2<7E=e{Ou_d)md{Yb{Tin$`BPse59e{-A+NTv>JW)!uuek4dvQOe~4(tp|d& zEKj$nw)P}R-p;Tk`>We>&-!3{8(?!IQKD#9U~PhSESQJ@!k+q*oiR6o%Dzyfd1VU@ zi{iAk`IUX4@wtNO*B4m3?`emK5kwUBcp}Jve6BhDyfKzXnLc}W)8X(!N#7e;ZLcTd z)i`7|d=$+<>crd7X&1;$27#TPoFC)0mr@a}hPYQJFiVlPDUD z(Ik+5ytZxOLH;q2`R%O=J3RBB$rYcL-@GgqZpZr!Mo6VSTkvd@QU9(PFEa>aCZ!(u zaq1|o``^|}UM(xvzcbvM!c!i=mDghY?0srppS=|`kx_@*(>PqyA=IW{W9Mt{yLrkX zOZqAoK9BK%=)nN71e7tCW~6zmUmf9>H%{b<^r*1PnH9AYZMR6+4PAo0N)n35aW!2LaVBm1h_G_{Q zUO0wGY7o9{b8fq!{IO$WD?%WRAytbxT#o75NSpl_yM+Qs*YaOoth{czwiKIE;Psn} zVxzj9Ax=ttCiodT`xISc7pTGZy){>4HKFtIw^eu{n;7H=U6XOaWZ5cw&R;4T385tm ze}wpMHLKoW91F{@h-+mRk1zkBx&gjzpNj;3C%drwj&2Y4PYW5)MD9>4lCO z?bg=?DSpP5(;$TLMobKK+jwJsYZ5bgW%=^m7ll=LC~2i0<2uH%4=KRU+6T9a(on3T z@q&SNCAVt)6j1lu?$=;Yr8{r5;{9s7#!Nxd6voEaKa22AAG2If&&TZ0R)oN~cIZ-) zXZ=3{_QvZF#OGiHZ8FsSAwWrI?R&oq_ijp6C^k9|jol}sdnLQHmn-7CDvK|+lOG@)5$_f5Y8S*UT0HlPqdtlA+tVAw6h{#zx|T-Oc{MNP$z_Dzv3 zu7T6%?n7Y*eK?^{q>_OR*7sjm|8GS?DND9UE+j71$<^WwCE)JgTltuf_Hk)x+(}3GcU<| z!kW1158veu7TLHb=k@mQe{)sNe14DM*>u5U%N8@-SoUmk<>k&3Ce@oy@q1=79;p+Y zaOL1)>8DrI*k?26%v;uWaJsuGkA#@-XNH=o_jQ;&4X?*lUDv8$(zd_wP?W)9`5#8v zAD6XT&Gp&eF`nD*dshARv1O<3Un+=S;dLWOmDlwA>bqhMJUh6T9Zr0|BAIjFx>a{C z?upT0ARnGs%es`zbr#a00Z$F`I^h^5WF;BRVsjK8l(5(J+q?g6?^oW7Wwu_JtC0tuTIcHuQ&05rK5E*}{W_~CL;KbeU~mdI_BHI@sO-nWHCs}Bu0rGV#_9JfzyF;X zbZS0>y0E|j*I82WlO^+3vIu45{p%=)McCc-n+hT z+Vk_;?Z*w4L8l@QglNuAvObnA((vrj=fj`R+n0MT`7h?06v%YpVCCbp+czzJ;?lE| zW%80K$qg|bJ`758*#(>!md&sKw^M%WZ}~+Y99|4oitG3Od&aQfh&CH@gPl-S@*XbE zjronNOaTS|em)P2`1wBIh@2`zY)}3EZ*8)g#fIAqye9`OtG*xn!AkPBBEvkOwcj_- oNQ*%ns)2gM2Hki`2miCLXxdQz=cAoG@PrWtPgg&ebxsLQ0DNiDhX4Qo literal 0 HcmV?d00001 diff --git a/icons/Qv2ray.xcf b/icons/Qv2ray.xcf new file mode 100644 index 0000000000000000000000000000000000000000..ec0ce0432064de47786746497bb15853ca72d17c GIT binary patch literal 52449 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 C7BI2^ literal 0 HcmV?d00001 diff --git a/resources.qrc b/resources.qrc index bd23da9a..7ef2d9f4 100644 --- a/resources.qrc +++ b/resources.qrc @@ -1,7 +1,7 @@ - icons/Hv2ray.ico translations/zh-CN.qm translations/en-US.qm + icons/Qv2ray.ico diff --git a/src/HConfigObjects.hpp b/src/HConfigObjects.hpp index e0e53a5d..4fd7c164 100644 --- a/src/HConfigObjects.hpp +++ b/src/HConfigObjects.hpp @@ -7,49 +7,46 @@ #include "vinteract.hpp" // Macros -#define HV2RAY_CONFIG_DIR_NAME "/.hv2ray/" +#define QV2RAY_CONFIG_DIR_NAME "/.qv2ray/" using namespace std; -namespace Hv2ray +namespace Qv2ray { - namespace HConfigModels + namespace QvConfigModels { - struct HInbondSetting { + struct QvInbondSetting { bool enabled; string ip; int port; bool useAuthentication; string authUsername; string authPassword; - HInbondSetting(): enabled(), ip(), port(), useAuthentication(), authUsername(), authPassword() {} - HInbondSetting(bool _e, string _ip, int _p): HInbondSetting() + QvInbondSetting(): enabled(), ip(), port(), useAuthentication(), authUsername(), authPassword() {} + QvInbondSetting(bool _e, string _ip, int _p): QvInbondSetting() { enabled = _e; port = _p; ip = _ip; } -#if USE_TODO_FEATURES == false XTOSTRUCT(O(enabled, ip, port, useAuthentication, authUsername, authPassword)) -#endif }; - struct HvConfigList { + struct QvConfigList { string alias; string fileName; int index; - HvConfigList(): alias(), fileName(), index() {} + QvConfigList(): alias(), fileName(), index() {} XTOSTRUCT(O(alias, fileName, index)) }; - struct Hv2Config { + struct Qv2Config { string language; bool runAsRoot; string logLevel; - //Hv2ray::V2ConfigModels::MuxObject muxSetting; - HInbondSetting httpSetting; - HInbondSetting socksSetting; - list configs; - Hv2Config(): language(), runAsRoot(), logLevel(), httpSetting(), socksSetting(), configs() { } - Hv2Config(string lang, string log, HInbondSetting httpIn, HInbondSetting socksIN): Hv2Config() + QvInbondSetting httpSetting; + QvInbondSetting socksSetting; + list configs; + Qv2Config(): language(), runAsRoot(), logLevel(), httpSetting(), socksSetting(), configs() { } + Qv2Config(string lang, string log, QvInbondSetting httpIn, QvInbondSetting socksIN): Qv2Config() { language = lang; logLevel = log; @@ -57,9 +54,7 @@ namespace Hv2ray socksSetting = socksIN; runAsRoot = false; } -#if USE_TODO_FEATURES == false XTOSTRUCT(O(language, runAsRoot, logLevel, httpSetting, socksSetting, configs)) -#endif }; } @@ -67,10 +62,4 @@ namespace Hv2ray /// place at first in main.cpp static QDir ConfigDir; } - - -#if USE_TODO_FEATURES -JSONCONS_MEMBER_TRAITS_DECL(Hv2ray::HConfigModels::Hv2Config, language, runAsRoot, logLevel, httpSetting, socksSetting) -JSONCONS_MEMBER_TRAITS_DECL(Hv2ray::HConfigModels::HInbondSetting, enabled, ip, port, useAuthentication, authUsername, authPassword) -#endif #endif // HCONFIGOBJECTS_HPP diff --git a/src/HUtils.cpp b/src/HUtils.cpp index c3fa48d7..14c88f71 100644 --- a/src/HUtils.cpp +++ b/src/HUtils.cpp @@ -1,17 +1,17 @@ #include "HUtils.hpp" #include -namespace Hv2ray +namespace Qv2ray { namespace Utils { - static HConfigModels::Hv2Config GlobalConfig; - void SetGlobalConfig(HConfigModels::Hv2Config conf) + static QvConfigModels::Qv2Config GlobalConfig; + void SetGlobalConfig(QvConfigModels::Qv2Config conf) { GlobalConfig = conf; } - HConfigModels::Hv2Config GetGlobalConfig() + QvConfigModels::Qv2Config GetGlobalConfig() { return GlobalConfig; } @@ -28,11 +28,11 @@ namespace Hv2ray void LoadConfig(QFile *configFile) { - using namespace Hv2ray::HConfigModels; + using namespace Qv2ray::QvConfigModels; configFile->open(QFile::ReadOnly); QTextStream stream(configFile); auto str = stream.readAll(); - auto config = StructFromJSON(str.toStdString()); + auto config = StructFromJSON(str.toStdString()); SetGlobalConfig(config); configFile->close(); } diff --git a/src/HUtils.hpp b/src/HUtils.hpp index a4e662c8..eb0a2617 100644 --- a/src/HUtils.hpp +++ b/src/HUtils.hpp @@ -14,14 +14,14 @@ #include "HConfigObjects.hpp" -namespace Hv2ray +namespace Qv2ray { namespace Utils { void showWarnMessageBox(QWidget *parent, QString title, QString text); QTranslator *getTranslator(string lang); - void SetGlobalConfig(HConfigModels::Hv2Config conf); - HConfigModels::Hv2Config GetGlobalConfig(); + void SetGlobalConfig(QvConfigModels::Qv2Config conf); + QvConfigModels::Qv2Config GetGlobalConfig(); void SaveConfig(QFile *configFile); void LoadConfig(QFile *configFile); /// Get file list in a Dir diff --git a/src/V2ConfigObjects.hpp b/src/V2ConfigObjects.hpp index 9765fb76..c0d7ca11 100644 --- a/src/V2ConfigObjects.hpp +++ b/src/V2ConfigObjects.hpp @@ -4,13 +4,8 @@ // TODO Features #define USE_TODO_FEATURES false -#if USE_TODO_FEATURES -#include -using namespace jsoncons; -#else #include using namespace x2struct; -#endif #ifndef V2CONFIG_H #define V2CONFIG_H @@ -18,7 +13,7 @@ using namespace x2struct; using namespace std; /*------------------------------------------------------------------------------------------------------------*/ -namespace Hv2ray +namespace Qv2ray { namespace V2ConfigModels { @@ -33,18 +28,14 @@ namespace Hv2ray string error; string loglevel; LogObject(): access(), error(), loglevel() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(access, error, loglevel)) -#endif }; struct ApiObject { string tag; list services; ApiObject() : tag(), services() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(tag, services)) -#endif }; namespace DNSObjects { @@ -53,9 +44,7 @@ namespace Hv2ray int port; list domains; ServerObject(): address(), port(), domains() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(address, port, domains)) -#endif }; } struct DnsObject { @@ -67,9 +56,7 @@ namespace Hv2ray list servers; #endif DnsObject(): hosts(), servers() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(hosts, servers)) -#endif }; namespace ROUTINGObjects { @@ -85,17 +72,13 @@ namespace Hv2ray string protocol; string attrs; RuleObject() : type(), domain(), ip(), port(), network(), source(), user(), inboundTag(), protocol(), attrs() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(type, domain, ip, port, network, source, user, inboundTag, protocol, attrs)) -#endif }; struct BalancerObject { string tag ; list selector; BalancerObject() : tag(), selector() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(tag, selector)) -#endif }; } @@ -104,9 +87,7 @@ namespace Hv2ray list rules; list balancers; RoutingObject() : domainStrategy(), rules(), balancers() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(domainStrategy, rules, balancers)) -#endif }; namespace POLICYObjects { @@ -114,9 +95,7 @@ namespace Hv2ray bool statsInboundUplink; bool statsInboundDownlink; SystemPolicyObject() : statsInboundUplink(), statsInboundDownlink() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(statsInboundUplink, statsInboundDownlink)) -#endif }; struct LevelPolicyObject { @@ -128,18 +107,14 @@ namespace Hv2ray bool statsUserDownlink; int bufferSize; LevelPolicyObject(): handshake(), connIdle(), uplinkOnly(), downlinkOnly(), statsUserUplink(), statsUserDownlink(), bufferSize() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(handshake, connIdle, uplinkOnly, downlinkOnly, statsUserUplink, statsUserDownlink, bufferSize)) -#endif }; } struct PolicyObject { map level; list system; PolicyObject(): level(), system() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(level, system)) -#endif }; namespace TRANSFERObjects { @@ -152,9 +127,7 @@ namespace Hv2ray list path; map> headers; HTTPRequestObject(): version(), method(), path(), headers() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(version, method, path, headers)) -#endif }; struct HTTPResponseObject { @@ -163,18 +136,14 @@ namespace Hv2ray string reason; map> headers; HTTPResponseObject(): version(), status(), reason(), headers() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(version, status, reason, headers)) -#endif }; struct TCPHeader_M_Object { string type; HTTPRequestObject request; HTTPResponseObject response; TCPHeader_M_Object(): type(), request(), response() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(type, request, response)) -#endif }; struct HeaderObject { string type; @@ -189,9 +158,7 @@ namespace Hv2ray struct TCPObject { TRANSFERObjectsInternal:: TCPHeader_M_Object header; TCPObject(): header() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(header)) -#endif }; @@ -205,9 +172,7 @@ namespace Hv2ray int writeBufferSize; TRANSFERObjectsInternal:: HeaderObject header; KCPObject(): mtu(), tti(), uplinkCapacity(), downlinkCapacity(), congestion(), readBufferSize(), writeBufferSize(), header() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(mtu, tti, uplinkCapacity, downlinkCapacity, congestion, readBufferSize, writeBufferSize, header)) -#endif }; @@ -215,26 +180,20 @@ namespace Hv2ray string path; map headers; WebSocketObject(): path(), headers() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(path, headers)) -#endif }; struct HttpObject { list host; string path; HttpObject() : host(), path() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(host, path)) -#endif }; struct DomainSocketObject { string path; DomainSocketObject(): path() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(path)) -#endif }; struct QuicObject { @@ -242,9 +201,7 @@ namespace Hv2ray string key; TRANSFERObjectsInternal::HeaderObject header; QuicObject(): security(), key(), header() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(security, key, header)) -#endif }; @@ -257,9 +214,7 @@ namespace Hv2ray TRANSFERObjects::DomainSocketObject dsSettings; TRANSFERObjects::QuicObject quicSettings; TransportObject(): tcpSettings(), kcpSettings(), wsSettings(), httpSettings(), dsSettings(), quicSettings() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(tcpSettings, kcpSettings, wsSettings, httpSettings, dsSettings, quicSettings)) -#endif }; namespace INBOUNDObjects { @@ -268,9 +223,7 @@ namespace Hv2ray bool enabled; string destOverride; SniffingObject(): enabled(), destOverride() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(enabled, destOverride)) -#endif }; struct AllocateObject { @@ -278,9 +231,7 @@ namespace Hv2ray int refresh; int concurrency; AllocateObject(): strategy(), refresh(), concurrency() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(strategy, refresh, concurrency)) -#endif }; } namespace STREAMSETTINGSObjects @@ -290,9 +241,7 @@ namespace Hv2ray bool tcpFastOpen; string tproxy; SockoptObject(): mark(), tcpFastOpen(), tproxy() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(mark, tcpFastOpen, tproxy)) -#endif }; struct CertificateObject { @@ -302,9 +251,7 @@ namespace Hv2ray list certificate; list key; CertificateObject(): usage(), certificateFile(), keyFile(), certificate(), key() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(usage, certificateFile, keyFile, certificate, key)) -#endif }; struct TLSObject { @@ -314,9 +261,7 @@ namespace Hv2ray list certificates; bool disableSystemRoot; TLSObject(): serverName(), allowInsecure(), certificates(), disableSystemRoot() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(serverName, allowInsecure, alpn, certificates, disableSystemRoot)) -#endif }; } @@ -332,9 +277,7 @@ namespace Hv2ray TRANSFERObjects::DomainSocketObject dsSettings; TRANSFERObjects::QuicObject quicSettings; StreamSettingsObject(): network(), security(), sockopt(), tlsSettings(), tcpSettings(), kcpSettings(), wsSettings(), httpSettings(), dsSettings(), quicSettings() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(network, security, sockopt, tcpSettings, tlsSettings, kcpSettings, wsSettings, httpSettings, dsSettings, quicSettings)) -#endif }; template @@ -349,9 +292,7 @@ namespace Hv2ray INBOUNDObjects::SniffingObject sniffing; INBOUNDObjects::AllocateObject allocate; InboundObject(): port(), listen(), protocol(), settings(), streamSettings(), tag(), sniffing(), allocate() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(port, listen, protocol, settings, streamSettings, tag, sniffing, allocate)) -#endif }; namespace OUTBOUNDObjects { @@ -359,18 +300,14 @@ namespace Hv2ray struct ProxySettingsObject { string tag; ProxySettingsObject(): tag() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(tag)) -#endif }; struct MuxObject { bool enabled; int concurrency; MuxObject(): enabled(), concurrency() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(enabled, concurrency)) -#endif }; } template @@ -384,17 +321,13 @@ namespace Hv2ray OUTBOUNDObjects::ProxySettingsObject proxySettings; OUTBOUNDObjects::MuxObject mux; OutboundObject(): sendThrough(), protocol(), settings(), tag(), streamSettings(), proxySettings(), mux() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(sendThrough, protocol, settings, tag, streamSettings, proxySettings, mux)) -#endif }; struct StatsObject { bool _; // Placeholder... StatsObject(): _() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(_)) -#endif }; namespace REVERSEObjects { @@ -403,18 +336,14 @@ namespace Hv2ray string tag; string domain; BridgeObject() : tag(), domain() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(tag, domain)) -#endif }; struct PortalObject { string tag; string domain; PortalObject() : tag(), domain() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(tag, domain)) -#endif }; } @@ -422,9 +351,7 @@ namespace Hv2ray list bridges; list portals; ReverseObject() : bridges(), portals() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(bridges, portals)) -#endif }; #if USE_TODO_FEATURES template @@ -449,14 +376,12 @@ namespace Hv2ray ReverseObject reverse; PolicyObject policy; RootObject(): log(), api(), dns(), routing(), inbounds(), outbounds(), transport(), stats(), reverse(), policy() {} -#if USE_TODO_FEATURES == false XTOSTRUCT(O(log, api, dns, routing, inbounds, outbounds, transport, stats, reverse, policy)) -#endif }; } } -namespace Hv2ray +namespace Qv2ray { namespace V2ConfigModels { @@ -572,61 +497,8 @@ namespace Hv2ray } } -#if USE_TODO_FEATURES -using namespace Hv2ray; -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::LogObject, access, error, loglevel) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::ApiObject, tag, services) - -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::DNSObjects::ServerObject, address, port, domains) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::DnsObject, hosts, servers) - -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::ROUTINGObjects::RuleObject, type, domain, ip, port, network, source, user, inboundTag, protocol, attrs) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::ROUTINGObjects::BalancerObject, tag, selector) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::RoutingObject, domainStrategy, rules, balancers) - -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::POLICYObjects::SystemPolicyObject, statsInboundUplink, statsInboundDownlink) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::POLICYObjects::LevelPolicyObject, handshake, connIdle, uplinkOnly, downlinkOnly, statsUserUplink, statsUserDownlink, bufferSize) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::PolicyObject, level, system) - -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::TRANSFERObjectsInternal::HTTPRequestObject, version, method, path, headers) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::TRANSFERObjectsInternal::HTTPResponseObject, version, status, reason, headers) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::TRANSFERObjectsInternal::TCPHeader_M_Object, type, request, response) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::TRANSFERObjectsInternal::HeaderObject, type) - -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::TCPObject, header) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::KCPObject, mtu, tti, uplinkCapacity, downlinkCapacity, congestion, readBufferSize, writeBufferSize, header) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::WebSocketObject, path, headers) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::HttpObject, host, path) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::DomainSocketObject, path) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TRANSFERObjects::QuicObject, security, key, header) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::TransportObject, tcpSettings, kcpSettings, wsSettings, httpSettings, dsSettings, quicSettings) - -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::INBOUNDObjects::SniffingObject, enabled, destOverride) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::INBOUNDObjects::AllocateObject, strategy, refresh, concurrency) - -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::OUTBOUNDObjects::ProxySettingsObject, tag) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::OUTBOUNDObjects::MuxObject, enabled, concurrency) - -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::REVERSEObjects::BridgeObject, tag, domain) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::REVERSEObjects::PortalObject, tag, domain) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::ReverseObject, bridges, portals) - -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::StatsObject, _) - -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::StreamSettingsObject, tcpSettings, kcpSettings, wsSettings, httpSettings, dsSettings, quicSettings, tlsSettings, sockopt, network, security) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::STREAMSETTINGSObjects::TLSObject, serverName, allowInsecure, alpn, certificates, disableSystemRoot) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::STREAMSETTINGSObjects::CertificateObject, usage, certificateFile, keyFile, certificate, key) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::STREAMSETTINGSObjects::SockoptObject, mark, tcpFastOpen, tproxy) - -// These 3 are used as templates. -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::RootObject, log, api, dns, routing, inbounds, outbounds, transport, stats, reverse, policy) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::InboundObject, port, listen, protocol, settings, streamSettings, tag, sniffing, allocate) -JSONCONS_MEMBER_TRAITS_DECL(V2ConfigModels::OutboundObject, sendThrough, protocol, settings, tag, streamSettings, proxySettings, mux) - -#endif - /// Code above has passed these tests. -//using namespace Hv2ray::V2ConfigModels; +//using namespace Qv2ray::V2ConfigModels; //RootObject x; //InboundObject inH; //x.inbounds.insert(x.inbounds.end(), inH); diff --git a/src/main.cpp b/src/main.cpp index 82b9d6bf..a111eb2e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,24 +10,24 @@ #include "w_MainWindow.h" using namespace std; -using namespace Hv2ray; -using namespace Hv2ray::Utils; -using namespace Hv2ray::HConfigModels; +using namespace Qv2ray; +using namespace Qv2ray::Utils; +using namespace Qv2ray::QvConfigModels; bool initializeHv() { - /// Hv2ray Config Path and ends with "/" + /// Qv2ray Config Path and ends with "/" QString configPath = ""; #if defined(__WIN32) || defined(__APPLE__) // For Windows and MacOS, there's no such 'installation' of a software // package, So as what ShadowSocks and v2rayX does, save config files next to // the executable. - configPath = HV2RAY_CONFIG_DIR_NAME; + configPath = QV2RAY_CONFIG_DIR_NAME; #else // However, for linux, this software can be and/or will be provided as a // package and install to whatever /usr/bin or /usr/local/bin or even /opt/ // Thus we save config files in the user's home directory. - configPath = QDir::homePath() + HV2RAY_CONFIG_DIR_NAME; + configPath = QDir::homePath() + QV2RAY_CONFIG_DIR_NAME; #endif ConfigDir = QDir(configPath); @@ -35,7 +35,7 @@ bool initializeHv() auto result = QDir().mkdir(configPath); if (result) { - qDebug() << "Created hv2ray config file path at: " + configPath; + qDebug() << "Created Qv2ray config file path at: " + configPath; } else { // We cannot continue as it failed to create a dir. qDebug() << "Failed to create config file folder under " + configPath; @@ -43,14 +43,14 @@ bool initializeHv() } } - QFile configFile(configPath + "hv2ray.conf"); + QFile configFile(configPath + "Qv2ray.conf"); if (!Utils::hasFile(&ConfigDir, ".initialised")) { // This is first run! // These below genenrated very basic global config. - HInbondSetting inHttp = HInbondSetting(true, "127.0.0.1", 8080); - HInbondSetting inSocks = HInbondSetting(true, "127.0.0.1", 1080); - Hv2Config conf = Hv2Config("zh-CN", "info", inHttp, inSocks); + QvInbondSetting inHttp = QvInbondSetting(true, "127.0.0.1", 8080); + QvInbondSetting inSocks = QvInbondSetting(true, "127.0.0.1", 1080); + Qv2Config conf = Qv2Config("zh-CN", "info", inHttp, inSocks); SetGlobalConfig(conf); SaveConfig(&configFile); // Create Placeholder for initialise indicator. @@ -67,17 +67,17 @@ bool initializeHv() int main(int argc, char *argv[]) { QApplication _qApp(argc, argv); - RunGuard guard("Hv2ray-Instance-Identifier"); + RunGuard guard("Qv2ray-Instance-Identifier"); if (!guard.isSingleInstance()) { - Utils::showWarnMessageBox(nullptr, QObject::tr("Hv2Ray"), QObject::tr("AnotherInstanceRunning")); + Utils::showWarnMessageBox(nullptr, QObject::tr("Qv2ray"), QObject::tr("AnotherInstanceRunning")); return -1; } // Set file startup path as Path // WARNING: This may be changed in the future. QDir::setCurrent(QFileInfo(QCoreApplication::applicationFilePath()).path()); - // Hv2ray Initialize + // Qv2ray Initialize initializeHv(); if (_qApp.installTranslator(getTranslator(GetGlobalConfig().language))) { @@ -92,7 +92,7 @@ int main(int argc, char *argv[]) } // Show MainWindow - Ui::MainWindow w; + Ui_Impl::MainWindow w; w.show(); return _qApp.exec(); } diff --git a/src/runguard.cpp b/src/runguard.cpp index d8456e04..72537e29 100644 --- a/src/runguard.cpp +++ b/src/runguard.cpp @@ -1,7 +1,7 @@ #include #include "runguard.hpp" -namespace Hv2ray +namespace Qv2ray { //from https://stackoverflow.com/a/28172162 diff --git a/src/runguard.hpp b/src/runguard.hpp index 3da1afb5..0135e423 100644 --- a/src/runguard.hpp +++ b/src/runguard.hpp @@ -5,7 +5,7 @@ #include #include -namespace Hv2ray +namespace Qv2ray { // From https://stackoverflow.com/a/28172162 class RunGuard diff --git a/src/vinteract.cpp b/src/vinteract.cpp index 1d53e4a8..5b4a0723 100644 --- a/src/vinteract.cpp +++ b/src/vinteract.cpp @@ -6,7 +6,7 @@ #include "vinteract.hpp" #include "w_MainWindow.h" -namespace Hv2ray +namespace Qv2ray { bool v2Instance::checkConfigFile(const QString path) { diff --git a/src/vinteract.hpp b/src/vinteract.hpp index ffd623c2..9b25b438 100644 --- a/src/vinteract.hpp +++ b/src/vinteract.hpp @@ -3,7 +3,7 @@ #include #include -namespace Hv2ray +namespace Qv2ray { enum V2RAY_INSTANCE_STARTUP_STATUS { STOPPED, diff --git a/src/w_ConnectionEditWindow.cpp b/src/w_ConnectionEditWindow.cpp index aad4b0d8..00e56435 100644 --- a/src/w_ConnectionEditWindow.cpp +++ b/src/w_ConnectionEditWindow.cpp @@ -5,9 +5,9 @@ #include #include -namespace Hv2ray +namespace Qv2ray { - namespace Ui + namespace Ui_Impl { ConnectionEditWindow::ConnectionEditWindow(QWidget *parent) : QDialog(parent) diff --git a/src/w_ConnectionEditWindow.h b/src/w_ConnectionEditWindow.h index a37eeece..89562a9f 100644 --- a/src/w_ConnectionEditWindow.h +++ b/src/w_ConnectionEditWindow.h @@ -4,9 +4,9 @@ #include #include "ui_w_ConnectionEditWindow.h" -namespace Hv2ray +namespace Qv2ray { - namespace Ui + namespace Ui_Impl { class ConnectionEditWindow : public QDialog { diff --git a/src/w_ConnectionEditWindow.ui b/src/w_ConnectionEditWindow.ui index d40f5d05..0bbb1213 100644 --- a/src/w_ConnectionEditWindow.ui +++ b/src/w_ConnectionEditWindow.ui @@ -1,7 +1,7 @@ - Hv2ray::Ui::ConnectionEditWindow - + ConnectionEditWindow + 0 @@ -864,7 +864,7 @@ buttonBox accepted() - Hv2ray::Ui::ConnectionEditWindow + ConnectionEditWindow accept() @@ -880,7 +880,7 @@ buttonBox rejected() - Hv2ray::Ui::ConnectionEditWindow + ConnectionEditWindow reject() diff --git a/src/w_ImportConfig.cpp b/src/w_ImportConfig.cpp index ad73ad1c..39b7310f 100644 --- a/src/w_ImportConfig.cpp +++ b/src/w_ImportConfig.cpp @@ -15,10 +15,10 @@ #include "w_ConnectionEditWindow.h" #include "w_ImportConfig.h" -using namespace Hv2ray; -namespace Hv2ray +using namespace Qv2ray; +namespace Qv2ray { - namespace Ui + namespace Ui_Impl { ImportConfig::ImportConfig(QWidget *parent) : QDialog(parent) diff --git a/src/w_ImportConfig.h b/src/w_ImportConfig.h index 74f797e3..b1b1b0dc 100644 --- a/src/w_ImportConfig.h +++ b/src/w_ImportConfig.h @@ -4,9 +4,9 @@ #include #include "ui_w_ImportConfig.h" -namespace Hv2ray +namespace Qv2ray { - namespace Ui + namespace Ui_Impl { class ImportConfig : public QDialog { diff --git a/src/w_ImportConfig.ui b/src/w_ImportConfig.ui index bd473e73..dc5f219f 100644 --- a/src/w_ImportConfig.ui +++ b/src/w_ImportConfig.ui @@ -1,7 +1,7 @@ - Hv2ray::Ui::ImportConfig - + ImportConfig + 0 @@ -162,7 +162,7 @@ buttonBox accepted() - Hv2ray::Ui::ImportConfig + ImportConfig accept() @@ -178,7 +178,7 @@ buttonBox rejected() - Hv2ray::Ui::ImportConfig + ImportConfig reject() diff --git a/src/w_MainWindow.cpp b/src/w_MainWindow.cpp index 1ff13ea6..5736df59 100644 --- a/src/w_MainWindow.cpp +++ b/src/w_MainWindow.cpp @@ -15,14 +15,14 @@ #include "w_MainWindow.h" #include "w_PrefrencesWindow.h" -namespace Hv2ray +namespace Qv2ray { - namespace Ui + namespace Ui_Impl { void MainWindow::CreateTrayIcon() { hTray = new QSystemTrayIcon(); - hTray->setToolTip(tr("Hv2ray")); + hTray->setToolTip(tr("Qv2ray")); hTray->setIcon(this->windowIcon()); connect(hTray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(on_activatedTray(QSystemTrayIcon::ActivationReason))); QAction *actionShow = new QAction(this); @@ -58,7 +58,7 @@ namespace Hv2ray : QMainWindow(parent) , ui(new Ui_MainWindow) { - this->setWindowIcon(QIcon(":/icons/Hv2ray.ico")); + this->setWindowIcon(QIcon(":/icons/Qv2ray.ico")); ui->setupUi(this); UpdateConfigTable(); // ui->configTable->setContextMenuPolicy(Qt::CustomContextMenu); diff --git a/src/w_MainWindow.h b/src/w_MainWindow.h index a9e32b52..6c3e1612 100644 --- a/src/w_MainWindow.h +++ b/src/w_MainWindow.h @@ -10,9 +10,9 @@ #include "vinteract.hpp" #include "V2ConfigObjects.hpp" -namespace Hv2ray +namespace Qv2ray { - namespace Ui + namespace Ui_Impl { class MainWindow : public QMainWindow { diff --git a/src/w_MainWindow.ui b/src/w_MainWindow.ui index 8d2640b0..15f196f3 100644 --- a/src/w_MainWindow.ui +++ b/src/w_MainWindow.ui @@ -1,7 +1,7 @@ - Hv2ray::Ui::MainWindow - + MainWindow + 0 @@ -23,7 +23,7 @@ - Hv2ray + Qv2ray diff --git a/src/w_PrefrencesWindow.cpp b/src/w_PrefrencesWindow.cpp index 660c208b..633ca143 100644 --- a/src/w_PrefrencesWindow.cpp +++ b/src/w_PrefrencesWindow.cpp @@ -16,12 +16,12 @@ #include #endif -using namespace Hv2ray; +using namespace Qv2ray; using namespace Utils; -namespace Hv2ray +namespace Qv2ray { - namespace Ui + namespace Ui_Impl { PrefrencesWindow::PrefrencesWindow(QWidget *parent) : QDialog(parent), CurrentConfig(), ui(new Ui_PrefrencesWindow) { diff --git a/src/w_PrefrencesWindow.h b/src/w_PrefrencesWindow.h index 7a7e8579..07409e10 100644 --- a/src/w_PrefrencesWindow.h +++ b/src/w_PrefrencesWindow.h @@ -5,9 +5,9 @@ #include #include "HConfigObjects.hpp" -namespace Hv2ray +namespace Qv2ray { - namespace Ui + namespace Ui_Impl { class PrefrencesWindow : public QDialog { @@ -28,7 +28,7 @@ namespace Hv2ray void on_runAsRootCheckBox_stateChanged(int arg1); private: - Hv2ray::HConfigModels::Hv2Config CurrentConfig; + Qv2ray::QvConfigModels::Qv2Config CurrentConfig; Ui_PrefrencesWindow *ui; }; } diff --git a/src/w_PrefrencesWindow.ui b/src/w_PrefrencesWindow.ui index 28f5cd5f..12586791 100644 --- a/src/w_PrefrencesWindow.ui +++ b/src/w_PrefrencesWindow.ui @@ -1,7 +1,7 @@ - Hv2ray::Ui::PrefrencesWindow - + PrefrencesWindow + 0 @@ -345,7 +345,7 @@ buttonBox accepted() - Hv2ray::Ui::PrefrencesWindow + PrefrencesWindow accept() @@ -361,7 +361,7 @@ buttonBox rejected() - Hv2ray::Ui::PrefrencesWindow + PrefrencesWindow reject() diff --git a/translations/en-US.ts b/translations/en-US.ts index 4d8ba137..9f9c123a 100644 --- a/translations/en-US.ts +++ b/translations/en-US.ts @@ -3,197 +3,6 @@ ConnectionEditWindow - - #ConnectionSettings - Connection Settings - - - #Host - Host - - - #Port - Port - - - #Name - Name - - - #UUID - UUID - - - #AlterID - Alter ID - - - #Security - Security Settings - - - auto - Auto - - - aes-128-gcm - aes-128-gcm - - - chacha20-poly1305 - chacha20-poly1305 - - - none - Do not use - - - #Transport - Transport Settings - - - tcp (TCP) - tcp (TCP) - - - http (HTTP) - http (HTTP) - - - ws (WebSocket) - ws (WebSocket) - - - kcp (mKCP) - kcp (mKCP) - - - domainsocket (Domain Socket) - domainsocket (Domain Socket) - - - quic (Quick UDP Internet Connection) - quic (Quick UDP Internet Connection) - - - #TransportSettings - Transport Settings - - - TCP - TCP - - - http - HTTP - - - #Type - Type - - - #Request - Request - - - #InsertDefaultContent - Insert Default Content - - - #Response - Response - - - HTTP - HTTP - - - #Path - Path - - - WebSocket - WebSocket - - - #Headers - Headers - - - mKCP - mKCP - - - #MTU - MTU - - - #TTI (ms) - TTI (ms) - - - #UplinkCapacity (MB/s) - Uplink Capacity (MB/s) - - - #Congestion - Congestion Control - - - #Enabled - Enabled - - - #DownlinkCapacity (MB/s) - Downlink Capacity (MB/s) - - - #ReadBufferSize (MB) - Read Buffer Size (MB) - - - #WriteBufferSize (MB) - Write Buffer Size (MB) - - - #Header - Headers - - - srtp (SRTP, FaceTime) - srtp (SRTP, FaceTime) - - - utp (BitTorrent) - utp (BitTorrent) - - - wechat-video (WeChat Video Message) - wechat-video (WeChat Video Message) - - - dtls (DTLS 1.2) - dtls (DTLS 1.2) - - - wireguard (WireGuard fake packets) - wireguard (WireGuard fake packets) - - - DomainSocket - DomainSocket - - - QUIC - QUIC - - - #Key - Key - - - - Hv2ray::Ui::ConnectionEditWindow #ConnectionSettings @@ -451,7 +260,7 @@ - Hv2ray::Ui::ImportConfig + ImportConfig Import file @@ -517,45 +326,26 @@ #VMess Connection String VMess Connection String - - - OpenConfigFile - Open Config File - - - - ImportConfig - Import Config - - - - CannotGenerateConfig - Failed to generate config file - - Hv2ray::Ui::MainWindow + MainWindow - - Hv2ray - Hv2ray + Qv2ray + - #Start Start - #Stop Stop - #Restart Restart @@ -595,7 +385,7 @@ Transport Settings - + #ConnectionSettings Connection Settings @@ -630,29 +420,11 @@ #Preferences Preferences - - - - #Hide - Hide - - - - #Quit - Quit - - - - #Show - Show - - Hv2ray::Ui::PrefrencesWindow + PrefrencesWindow - - Prefrences Preferences @@ -737,11 +509,6 @@ #InboundSettings Inbound Settings - - - HTTP - HTTP - @@ -771,311 +538,33 @@ #Password Password - - - SOCKS - SOCKS - 9001 - #Prefrences - Preferences - - - #CannotOpenConfigFile - Cannot open config file - - - - PortNumbersCannotBeSame - Port numbers cannot be the same - - - - RunAsRootNotOnWindows - Run as root is not avaliable on Windows Platform - - - - ImportConfig - - Import file - Import file - - - #ImportFrom - Import From - - - Existing File - Existing File - - - VMess Connection String - VMess Connection String - - - #FromFile - From file - - - #Path - Path - - - #SelectFile - Select File - - - #Name - Name - - - #Inbound - Inbound Settings - - - #UseCurrent - Use Current Settings - - - #UseImported - Use Imported Inbound Settings - - - #From VMess Connection String - From VMess Connection String - - - #VMess Connection String - VMess Connection String - - - OpenConfigFile - Open Config File - - - ImportConfig - Import Config - - - CannotOpenFile - Cannot open file - - - SaveFailed - Failed to save - - - CannotCopyCustomConfig - Failed to copy config file - - - CannotGenerateConfig - Failed to generate config file - - - - MainWindow - - Hv2ray - Hv2ray - - - #Start - Start - - - #Stop - Stop - - - #Restart - Restart - - - #ClearLog - Clear Log - - - #HostList - Host List - - - #ConfigDetail - Detailed Config Info - - - #Host - Host - - - #Port - Port - - - #UUID - UUID - - - #Transport - Transport Settings - - - #ConnectionSettings - Connection Settings - - - #File - File - - - #NewConnection - New Connection - - - #ManuallyInput - Manually Input Config - - - #ImportConnection - Import Config File - - - #Exit - Exit - - - #Preferences - Preferences - - - #Hide - Hide - - - #Quit - Quit - - - #Show - Show - - - - PrefrencesWindow - - Prefrences - Preferences - - - #General - General - - - #Language - Language - - - #RunAsRoot - Run v2ray as root - - - #Enabled - Enabled - - - #LogLevel - Log Level - - - debug - Debug - - - info - Info - - - warning - Warning - - - error - Error - - - none - Do not use - - - #MuxCool - Mux Settings - - - #Concurrency - Maximum Connections - - - #InboundSettings - Inbound Settings - - - #Port - Port - - - #Username - Username - - - #Auth - Authentication - - - #Password - Password - - + HTTP - HTTP + HTTP + SOCKS - SOCKS - - - #Prefrences - Preferences - - - #CannotOpenConfigFile - Cannot open config file - - - PortNumbersCannotBeSame - Port numbers cannot be the same - - - RunAsRootNotOnWindows - Run as root is not avaliable on Windows Platform + SOCKS QObject - Hv2Ray - Hv2ray + AnotherInstanceRunning + Another instance is already running - AnotherInstanceRunning - Another instance is already running + Qv2ray + @@ -1093,4 +582,80 @@ Configuration Error + + Qv2ray::Ui_Impl::ImportConfig + + + OpenConfigFile + Open Config File + + + + ImportConfig + Import Config + + + + CannotGenerateConfig + Failed to generate config file + + + + Qv2ray::Ui_Impl::MainWindow + + + Qv2ray + + + + + + #Hide + Hide + + + + #Quit + Quit + + + + #Start + Start + + + + #Stop + Stop + + + + #Restart + Restart + + + + #Show + Show + + + + Qv2ray::Ui_Impl::PrefrencesWindow + + + + Prefrences + Preferences + + + + PortNumbersCannotBeSame + Port numbers cannot be the same + + + + RunAsRootNotOnWindows + Run as root is not avaliable on Windows Platform + + diff --git a/translations/zh-CN.ts b/translations/zh-CN.ts index 1e0f5a54..5e1ef12e 100644 --- a/translations/zh-CN.ts +++ b/translations/zh-CN.ts @@ -3,197 +3,6 @@ ConnectionEditWindow - - #ConnectionSettings - 连接设置 - - - #Host - 域名 - - - #Port - 端口 - - - #Name - 名称 - - - #UUID - UUID - - - #AlterID - Alter ID - - - #Security - 安全设置 - - - auto - 自动 - - - aes-128-gcm - aes-128-gcm - - - chacha20-poly1305 - chacha20-poly1305 - - - none - 不使用 - - - #Transport - 传输设置 - - - tcp (TCP) - tcp (TCP) - - - http (HTTP) - http (HTTP) - - - ws (WebSocket) - ws (WebSocket) - - - kcp (mKCP) - kcp (mKCP) - - - domainsocket (Domain Socket) - domainsocket (Domain Socket) - - - quic (Quick UDP Internet Connection) - quic (Quick UDP Internet Connection) - - - #TransportSettings - 传输设置 - - - TCP - TCP - - - http - HTTP - - - #Type - 类型 - - - #Request - 请求 - - - #InsertDefaultContent - 默认值 - - - #Response - 相应 - - - HTTP - HTTP - - - #Path - 路径 - - - WebSocket - WebSocket - - - #Headers - 头伪装 - - - mKCP - mKCP - - - #MTU - 最大传输单元 - - - #TTI (ms) - 传输时间间隔 - - - #UplinkCapacity (MB/s) - 上行链路容量 (MB/s) - - - #Congestion - 拥塞控制 - - - #Enabled - 启用 - - - #DownlinkCapacity (MB/s) - 下行链路容量 (MB/s) - - - #ReadBufferSize (MB) - 读取缓冲区大小 (MB) - - - #WriteBufferSize (MB) - 写入缓冲区大小 (MB) - - - #Header - 头伪装 - - - srtp (SRTP, FaceTime) - srtp (SRTP, FaceTime) - - - utp (BitTorrent) - utp (BitTorrent) - - - wechat-video (WeChat Video Message) - wechat-video (WeChat Video Message) - - - dtls (DTLS 1.2) - dtls (DTLS 1.2) - - - wireguard (WireGuard fake packets) - wireguard (WireGuard fake packets) - - - DomainSocket - DomainSocket - - - QUIC - QUIC - - - #Key - 密钥 - - - - Hv2ray::Ui::ConnectionEditWindow #ConnectionSettings @@ -451,7 +260,7 @@ - Hv2ray::Ui::ImportConfig + ImportConfig Import file @@ -517,45 +326,26 @@ #VMess Connection String VMess 连接字符串 - - - OpenConfigFile - 打开配置文件 - - - - ImportConfig - 导入配置 - - - - CannotGenerateConfig - 无法生成配置文件 - - Hv2ray::Ui::MainWindow + MainWindow - - Hv2ray - Hv2ray + Qv2ray + - #Start 启动 - #Stop 停止 - #Restart 重新启动 @@ -595,7 +385,7 @@ 传输设置 - + #ConnectionSettings 连接设置 @@ -630,29 +420,11 @@ #Preferences 首选项 - - - - #Hide - 隐藏 - - - - #Quit - 退出 - - - - #Show - 显示 - - Hv2ray::Ui::PrefrencesWindow + PrefrencesWindow - - Prefrences 首选项 @@ -737,11 +509,6 @@ #InboundSettings 入站设置 - - - HTTP - HTTP - @@ -771,311 +538,33 @@ #Password 密码 - - - SOCKS - SOCKS - 9001 - #Prefrences - 首选项 - - - #CannotOpenConfigFile - 无法打开配置文件 - - - - PortNumbersCannotBeSame - 端口号不能相同 - - - - RunAsRootNotOnWindows - Windows 平台不支持这个选项 - - - - ImportConfig - - Import file - 导入文件 - - - #ImportFrom - 导入源 - - - Existing File - 现有文件 - - - VMess Connection String - VMess 连接字符串 - - - #FromFile - 从文件 - - - #Path - 路径 - - - #SelectFile - 选择文件 - - - #Name - 名称 - - - #Inbound - 入站设置 - - - #UseCurrent - 使用现有设置 - - - #UseImported - 使用导入的设置 - - - #From VMess Connection String - 从 VMess 连接字符串 - - - #VMess Connection String - VMess 连接字符串 - - - OpenConfigFile - 打开配置文件 - - - ImportConfig - 导入配置 - - - CannotOpenFile - 无法打开文件 - - - SaveFailed - 保存失败 - - - CannotCopyCustomConfig - 复制配置文件失败 - - - CannotGenerateConfig - 无法生成配置文件 - - - - MainWindow - - Hv2ray - Hv2ray - - - #Start - 启动 - - - #Stop - 停止 - - - #Restart - 重新启动 - - - #ClearLog - 清除日志 - - - #HostList - 服务器列表 - - - #ConfigDetail - 配置详细信息 - - - #Host - 域名 - - - #Port - 端口 - - - #UUID - UUID - - - #Transport - 传输设置 - - - #ConnectionSettings - 连接设置 - - - #File - 文件 - - - #NewConnection - 新建连接 - - - #ManuallyInput - 手动输入配置 - - - #ImportConnection - 导入配置文件 - - - #Exit - 退出 - - - #Preferences - 首选项 - - - #Hide - 隐藏 - - - #Quit - 退出 - - - #Show - 显示 - - - - PrefrencesWindow - - Prefrences - 首选项 - - - #General - 一般 - - - #Language - 语言 - - - #RunAsRoot - 使用 root 启动 - - - #Enabled - 启用 - - - #LogLevel - 日志等级 - - - debug - 调试 - - - info - 信息 - - - warning - 警告 - - - error - 错误 - - - none - 不使用 - - - #MuxCool - Mux 设置 - - - #Concurrency - 最大并发连接数 - - - #InboundSettings - 入站设置 - - - #Port - 端口 - - - #Username - 用户名 - - - #Auth - 鉴权 - - - #Password - 密码 - - + HTTP - HTTP + HTTP + SOCKS - SOCKS - - - #Prefrences - 首选项 - - - #CannotOpenConfigFile - 无法打开配置文件 - - - PortNumbersCannotBeSame - 端口号不能相同 - - - RunAsRootNotOnWindows - Windows 平台不支持这个选项 + SOCKS QObject - Hv2Ray - Hv2ray + AnotherInstanceRunning + 另一个实例正在运行 - AnotherInstanceRunning - 另一个实例正在运行 + Qv2ray + @@ -1093,4 +582,80 @@ 配置出错 + + Qv2ray::Ui_Impl::ImportConfig + + + OpenConfigFile + 打开配置文件 + + + + ImportConfig + 导入配置 + + + + CannotGenerateConfig + 无法生成配置文件 + + + + Qv2ray::Ui_Impl::MainWindow + + + Qv2ray + + + + + + #Hide + 隐藏 + + + + #Quit + 退出 + + + + #Start + 启动 + + + + #Stop + 停止 + + + + #Restart + 重新启动 + + + + #Show + 显示 + + + + Qv2ray::Ui_Impl::PrefrencesWindow + + + + Prefrences + 首选项 + + + + PortNumbersCannotBeSame + 端口号不能相同 + + + + RunAsRootNotOnWindows + Windows 平台不支持这个选项 + +