diff --git a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua index c31a56d68..97e4739c3 100644 --- a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua +++ b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua @@ -186,6 +186,7 @@ o:value("vmess", translate("VMess")) o:value("trojan", translate("Trojan")) o:value("shadowsocks", translate("Shadowsocks")) if is_installed("sagernet-core") then + o:value("shadowsocksr", translate("ShadowsocksR")) o:value("wireguard", translate("WireGuard")) end o:value("socks", translate("Socks")) @@ -237,8 +238,9 @@ o:depends("type", "trojan") o:depends("type", "naiveproxy") o:depends({type = "socks5", auth_enable = true}) o:depends({type = "v2ray", v2ray_protocol = "http", auth_enable = true}) -o:depends({type = "v2ray", v2ray_protocol = "socks", auth_enable = true}) +o:depends({type = "v2ray", v2ray_protocol = "socks", socks_ver = "5", auth_enable = true}) o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"}) +o:depends({type = "v2ray", v2ray_protocol = "shadowsocksr"}) o:depends({type = "v2ray", v2ray_protocol = "trojan"}) o = s:option(ListValue, "encrypt_method", translate("Encrypt Method")) @@ -247,6 +249,7 @@ for _, v in ipairs(encrypt_methods) do end o.rmempty = true o:depends("type", "ssr") +o:depends({type = "v2ray", v2ray_protocol = "shadowsocksr"}) o = s:option(ListValue, "encrypt_method_ss", translate("Encrypt Method")) for _, v in ipairs(encrypt_methods_ss) do @@ -270,7 +273,7 @@ o.default = "1" -- Shadowsocks Plugin o = s:option(Value, "plugin", translate("Obfs")) o:value("none", translate("None")) -if is_finded("obfs-local") then +if is_finded("obfs-local") or is_installed("sagernet-core") then o:value("obfs-local", translate("obfs-local")) end if is_finded("v2ray-plugin") or is_installed("sagernet-core") then @@ -281,12 +284,16 @@ if is_finded("xray-plugin") then end o.rmempty = true o:depends("type", "ss") -o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"}) +if is_installed("sagernet-core") then + o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"}) +end o = s:option(Value, "plugin_opts", translate("Plugin Opts")) o.rmempty = true o:depends("type", "ss") -o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"}) +if is_installed("sagernet-core") then + o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"}) +end o = s:option(ListValue, "protocol", translate("Protocol")) for _, v in ipairs(protocol) do @@ -294,9 +301,11 @@ for _, v in ipairs(protocol) do end o.rmempty = true o:depends("type", "ssr") +o:depends({type = "v2ray", v2ray_protocol = "shadowsocksr"}) o = s:option(Value, "protocol_param", translate("Protocol param (optional)")) o:depends("type", "ssr") +o:depends({type = "v2ray", v2ray_protocol = "shadowsocksr"}) o = s:option(ListValue, "obfs", translate("Obfs")) for _, v in ipairs(obfs) do @@ -304,9 +313,11 @@ for _, v in ipairs(obfs) do end o.rmempty = true o:depends("type", "ssr") +o:depends({type = "v2ray", v2ray_protocol = "shadowsocksr"}) o = s:option(Value, "obfs_param", translate("Obfs param (optional)")) o:depends("type", "ssr") +o:depends({type = "v2ray", v2ray_protocol = "shadowsocksr"}) -- [[ Hysteria ]]-- o = s:option(ListValue, "hysteria_protocol", translate("Protocol")) @@ -364,6 +375,15 @@ end o.rmempty = true o:depends({type = "v2ray", v2ray_protocol = "vmess"}) +-- SOCKS Version +o = s:option(ListValue, "socks_ver", translate("Socks Version")) +o:value("4", "Socks4") +o:value("4a", "Socks4A") +o:value("5", "Socks5") +o.rmempty = true +o.default = "5" +o:depends({type = "v2ray", v2ray_protocol = "socks"}) + -- 传输协议 o = s:option(ListValue, "transport", translate("Transport")) o:value("tcp", "TCP") @@ -410,18 +430,20 @@ o = s:option(Value, "ws_path", translate("WebSocket Path")) o:depends("transport", "ws") o.rmempty = true --- WS前置数据 -o = s:option(Value, "ws_ed", translate("Max Early Data")) -o:depends("transport", "ws") -o.datatype = "uinteger" -o.default = 2048 -o.rmempty = true +if is_finded("v2ray") then + -- WS前置数据 + o = s:option(Value, "ws_ed", translate("Max Early Data")) + o:depends("transport", "ws") + o.datatype = "uinteger" + o.default = 2048 + o.rmempty = true --- WS前置数据标头 -o = s:option(Value, "ws_ed_header", translate("Early Data Header Name")) -o:depends("transport", "ws") -o.default = "Sec-WebSocket-Protocol" -o.rmempty = true + -- WS前置数据标头 + o = s:option(Value, "ws_ed_header", translate("Early Data Header Name")) + o:depends("transport", "ws") + o.default = "Sec-WebSocket-Protocol" + o.rmempty = true +end -- [[ H2部分 ]]-- @@ -440,48 +462,52 @@ o = s:option(Value, "serviceName", translate("gRPC Service Name")) o:depends("transport", "grpc") o.rmempty = true --- gPRC模式 -o = s:option(ListValue, "grpc_mode", translate("gRPC Mode")) -o:depends("transport", "grpc") -o:value("gun", translate("Gun")) -o:value("multi", translate("Multi")) -o:value("raw", translate("Raw")) -o.rmempty = true +if is_installed("sagernet-core") then + -- gPRC模式 + o = s:option(ListValue, "grpc_mode", translate("gRPC Mode")) + o:depends("transport", "grpc") + o:value("gun", translate("Gun")) + o:value("multi", translate("Multi")) + o:value("raw", translate("Raw")) + o.rmempty = true +end --- gRPC初始窗口 -o = s:option(Value, "initial_windows_size", translate("Initial Windows Size")) -o.datatype = "uinteger" -o:depends("transport", "grpc") -o.default = 0 -o.rmempty = true +if is_finded("xray") or is_installed("sagernet-core") then + -- gRPC初始窗口 + o = s:option(Value, "initial_windows_size", translate("Initial Windows Size")) + o.datatype = "uinteger" + o:depends("transport", "grpc") + o.default = 0 + o.rmempty = true --- H2/gRPC健康检查 -o = s:option(Flag, "health_check", translate("H2/gRPC Health Check")) -o:depends("transport", "h2") -o:depends("transport", "grpc") -o.rmempty = true + -- H2/gRPC健康检查 + o = s:option(Flag, "health_check", translate("H2/gRPC Health Check")) + o:depends("transport", "h2") + o:depends("transport", "grpc") + o.rmempty = true -o = s:option(Value, "read_idle_timeout", translate("H2 Read Idle Timeout")) -o.datatype = "uinteger" -o:depends({health_check = true, transport = "h2"}) -o.default = 60 -o.rmempty = true + o = s:option(Value, "read_idle_timeout", translate("H2 Read Idle Timeout")) + o.datatype = "uinteger" + o:depends({health_check = true, transport = "h2"}) + o.default = 60 + o.rmempty = true -o = s:option(Value, "idle_timeout", translate("gRPC Idle Timeout")) -o.datatype = "uinteger" -o:depends({health_check = true, transport = "grpc"}) -o.default = 60 -o.rmempty = true + o = s:option(Value, "idle_timeout", translate("gRPC Idle Timeout")) + o.datatype = "uinteger" + o:depends({health_check = true, transport = "grpc"}) + o.default = 60 + o.rmempty = true -o = s:option(Value, "health_check_timeout", translate("Health Check Timeout")) -o.datatype = "uinteger" -o:depends("health_check", 1) -o.default = 20 -o.rmempty = true + o = s:option(Value, "health_check_timeout", translate("Health Check Timeout")) + o.datatype = "uinteger" + o:depends("health_check", 1) + o.default = 20 + o.rmempty = true -o = s:option(Flag, "permit_without_stream", translate("Permit Without Stream")) -o:depends({health_check = true, transport = "grpc"}) -o.rmempty = true + o = s:option(Flag, "permit_without_stream", translate("Permit Without Stream")) + o:depends({health_check = true, transport = "grpc"}) + o.rmempty = true +end -- [[ QUIC部分 ]]-- o = s:option(ListValue, "quic_security", translate("QUIC Security")) @@ -591,7 +617,7 @@ o:depends({type = "v2ray", v2ray_protocol = "vless", xtls = false}) o:depends({type = "v2ray", v2ray_protocol = "vmess", xtls = false}) o:depends({type = "v2ray", v2ray_protocol = "trojan", xtls = false}) o:depends({type = "v2ray", v2ray_protocol = "shadowsocks", xtls = false}) -o:depends({type = "v2ray", v2ray_protocol = "socks", xtls = false}) +o:depends({type = "v2ray", v2ray_protocol = "socks", socks_ver = "5", xtls = false}) o:depends({type = "v2ray", v2ray_protocol = "http", xtls = false}) o:depends("type", "trojan") @@ -620,15 +646,17 @@ o = s:option(Flag, "tls_sessionTicket", translate("Session Ticket")) o:depends({type = "trojan", tls = true}) o.default = "0" --- [[ uTLS ]]-- -o = s:option(ListValue, "fingerprint", translate("Finger Print")) -o:value("disable", translate("disable")) -o:value("firefox", translate("firefox")) -o:value("chrome", translate("chrome")) -o:value("safari", translate("safari")) -o:value("randomized", translate("randomized")) -o:depends({type = "v2ray", tls = true}) -o.default = "disable" +if is_finded("xray") then + -- [[ uTLS ]]-- + o = s:option(ListValue, "fingerprint", translate("Finger Print")) + o:value("disable", translate("disable")) + o:value("firefox", translate("firefox")) + o:value("chrome", translate("chrome")) + o:value("safari", translate("safari")) + o:value("randomized", translate("randomized")) + o:depends({type = "v2ray", tls = true}) + o.default = "disable" +end o = s:option(Value, "tls_host", translate("TLS Host")) o.datatype = "hostname" diff --git a/luci-app-ssr-plus/po/zh-cn/ssr-plus.po b/luci-app-ssr-plus/po/zh-cn/ssr-plus.po index 1d1b7a553..9be3eb183 100644 --- a/luci-app-ssr-plus/po/zh-cn/ssr-plus.po +++ b/luci-app-ssr-plus/po/zh-cn/ssr-plus.po @@ -70,6 +70,9 @@ msgstr "布隆过滤器" msgid "VLESS Encryption" msgstr "VLESS 加密" +msgid "Socks Version" +msgstr "Socks 版本" + msgid "Flow" msgstr "流控 (Flow)" diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua b/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua index 181ab6216..a4b2391e4 100755 --- a/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua +++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua @@ -32,14 +32,21 @@ function vmess_vless() end function trojan_shadowsocks() outbound_settings = { - plugin = (server.v2ray_protocol == "shadowsocks") and server.plugin ~= "none" and server.plugin or nil, + plugin = ((server.v2ray_protocol == "shadowsocks") and server.plugin ~= "none" and server.plugin) or (server.v2ray_protocol == "shadowsocksr" and "shadowsocksr") or nil, pluginOpts = (server.v2ray_protocol == "shadowsocks") and server.plugin_opts or nil, + pluginArgs = (server.v2ray_protocol == "shadowsocksr") and { + "--protocol=" .. server.protocol, + "--protocol-param=" .. (server.protocol_param or ""), + "--obfs=" .. server.obfs, + "--obfs-param=" .. (server.obfs_param or "") + } or nil, servers = { { address = server.server, port = tonumber(server.server_port), password = server.password, method = (server.v2ray_protocol == "shadowsocks") and server.encrypt_method_ss or nil, + method = (server.v2ray_protocol == "shadowsocksr") and server.encrypt_method or nil, uot = (server.v2ray_protocol == "shadowsocks") and (server.uot == '1') or nil, ivCheck = (server.v2ray_protocol == "shadowsocks") and (server.ivCheck == '1') or nil, flow = (server.v2ray_protocol == "trojan") and (server.xtls == '1') and (server.vless_flow and server.vless_flow or "xtls-rprx-splice") or nil @@ -47,7 +54,9 @@ function trojan_shadowsocks() } } - if (server.v2ray_protocol == "shadowsocks") and (server.mux ~= "1") and (not (outbound_settings.plugin or server.transport ~= "tcp" or server.tls or server.xtls)) then + if server.v2ray_protocol == "shadowsocksr" then + server.v2ray_protocol = "shadowsocks" + elseif (server.v2ray_protocol == "shadowsocks") and (server.mux ~= "1") and (not (outbound_settings.plugin or server.transport ~= "tcp" or server.tls or server.xtls)) then server.v2ray_protocol = "shadowsocks_sing" outbound_settings = outbound_settings.servers[1] elseif (server.v2ray_protocol == "trojan") and (server.tls and server.mux ~= "1") and (not (server.transport ~= "tcp" or server.xtls)) then @@ -59,6 +68,7 @@ function trojan_shadowsocks() end function socks_http() outbound_settings = { + version = server.socks_ver or nil, servers = { { address = server.server, @@ -105,6 +115,9 @@ function outbound:handleIndex(index) shadowsocks = function() trojan_shadowsocks() end, + shadowsocksr = function() + trojan_shadowsocks() + end, socks = function() socks_http() end, diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua b/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua index b3d6d8507..9900a434f 100755 --- a/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua +++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua @@ -28,6 +28,7 @@ local filter_words = ucic:get_first(name, 'server_subscribe', 'filter_words', ' local save_words = ucic:get_first(name, 'server_subscribe', 'save_words', '') local packet_encoding = luci.model.ipkg.installed("sagernet-core") and ucic:get_first(name, 'global', 'default_packet_encoding', 'xudp') or nil local v2_ss = luci.sys.exec('type -t -p ss-redir sslocal') ~= "" and "ss" or "v2ray" +local v2_ssr = luci.sys.exec('type -t -p ssr-redir') ~= "" and "ssr" or "v2ray" local v2_tj = luci.sys.exec('type -t -p trojan') ~= "" and "trojan" or "v2ray" local log = function(...) print(os.date("%Y-%m-%d %H:%M:%S ") .. table.concat({...}, " ")) @@ -147,6 +148,8 @@ local function processData(szType, content) if szType == 'ssr' then local dat = split(content, "/%?") local hostInfo = split(dat[1], ':') + result.type = v2_ssr + result.v2ray_protocol = (v2_ssr == "v2ray") and "shadowsocksr" or nil result.server = hostInfo[1] result.server_port = hostInfo[2] result.protocol = hostInfo[3] diff --git a/sagernet-core/Makefile b/sagernet-core/Makefile index 7195e3741..c2afe6fa6 100644 --- a/sagernet-core/Makefile +++ b/sagernet-core/Makefile @@ -10,9 +10,9 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/SagerNet/v2ray-core.git -PKG_SOURCE_DATE:=2022-06-10 -PKG_SOURCE_VERSION:=f55a069e73bb1d34ed8bd2a149832fb018a07820 -PKG_MIRROR_HASH:=1eade99c74edfd1b1f0103dbc67d8afedc69f186799af4d7ec99e13b883d82a5 +PKG_SOURCE_DATE:=2022-06-14 +PKG_SOURCE_VERSION:=eb9f1a689e37c9577825165d50d562c2e7747f2a +PKG_MIRROR_HASH:=9cc7b4a5b2830ac72510c519f59e83e902347965fcfa57ed7cad0b43dfd80cab PKG_VERSION:=$(BASE_VERSION)-$(PKG_SOURCE_DATE)-$(call version_abbrev,$(PKG_SOURCE_VERSION)) PKG_LICENSE:=GPL-3.0-or-later @@ -70,6 +70,31 @@ define Package/sagernet-extra/description This includes extra resources for sagernet-core. endef +LIBCORE_NAME:=LibSagerNetCore +LIBCORE_DATE:=2022-06-10 +LIBCORE_VERSION:=9ef7ab1de7604ab959222d4de8ab6152a402e432 +LIBCORE_FILE:=$(LIBCORE_NAME)-$(LIBCORE_DATE)-$(call version_abbrev,$(LIBCORE_VERSION)).tar.xz +define Download/libcore + PROTO:=git + URL:=https://github.com/SagerNet/LibSagerNetCore.git + VERSION:=$(LIBCORE_VERSION) + FILE:=$(LIBCORE_FILE) + SUBDIR:=$(LIBCORE_NAME) + MIRROR_HASH:=9420189c45d5fbe682acee1da0b8f727cc5ea8c847ceeff5b026cd71ce60cf0f +endef + +define Build/Prepare + $(call Build/Prepare/Default) + + xzcat $(DL_DIR)/$(LIBCORE_FILE) | tar -C $(PKG_BUILD_DIR) $(TAR_OPTIONS) + $(CP) $(PKG_BUILD_DIR)/$(LIBCORE_NAME)/{obfs,ssr}.go \ + $(PKG_BUILD_DIR)/proxy/shadowsocks/plugin/self/ + $(SED) '/plugin\/self/d' -e 's/self.ParsePluginOptions/ParsePluginOptions/g' \ + $(PKG_BUILD_DIR)/proxy/shadowsocks/plugin/self/obfs.go + $(SED) 's/package libcore/package self/g' \ + $(PKG_BUILD_DIR)/proxy/shadowsocks/plugin/self/{obfs,ssr}.go +endef + define Package/sagernet-core/install $(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR)) $(INSTALL_DIR) $(1)/usr/bin/ @@ -82,5 +107,6 @@ define Package/sagernet-extra/install $(CP) $(PKG_BUILD_DIR)/release/extra/* $(1)/usr/share/v2ray/ endef +$(eval $(call Download,libcore)) $(eval $(call BuildPackage,sagernet-core)) $(eval $(call BuildPackage,sagernet-extra)) diff --git a/sagernet-core/patches/100-obfs.patch b/sagernet-core/patches/100-obfs.patch new file mode 100644 index 000000000..0fc3cb5fd --- /dev/null +++ b/sagernet-core/patches/100-obfs.patch @@ -0,0 +1,68 @@ +go get github.com/Dreamacro/clash/transport/ssr/protocol +go get github.com/Dreamacro/clash/transport/ssr/obfs +go get github.com/Dreamacro/clash/transport/simple-obfs +--- + +--- a/go.mod ++++ b/go.mod +@@ -3,6 +3,7 @@ module github.com/v2fly/v2ray-core/v5 + go 1.18 + + require ( ++ github.com/Dreamacro/clash v1.10.6 + github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da + github.com/dgryski/go-camellia v0.0.0-20191119043421-69a8a13fb23d + github.com/dgryski/go-idea v0.0.0-20170306091226-d2fb45a411fb +@@ -50,6 +51,8 @@ replace gvisor.dev/gvisor => github.com/ + + //replace github.com/sagernet/sing => ../sing + ++replace github.com/Dreamacro/clash => github.com/sagernet/clash v1.10.7-0.20220610080510-ac56b2a05ded ++ + require ( + github.com/aead/cmac v0.0.0-20160719120800-7af84192f0b1 // indirect + github.com/boljen/go-bitmap v0.0.0-20151001105940-23cd2fb0ce7d // indirect +@@ -81,6 +84,7 @@ require ( + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 // indirect + github.com/secure-io/siv-go v0.0.0-20180922214919-5ff40651e2c4 // indirect ++ github.com/sirupsen/logrus v1.8.1 // indirect + github.com/xtaci/smux v1.5.16 // indirect + go4.org/intern v0.0.0-20220301175310-a089fc204883 // indirect + go4.org/unsafe/assume-no-moving-gc v0.0.0-20211027215541-db492cf91b37 // indirect +--- a/go.sum ++++ b/go.sum +@@ -355,6 +355,8 @@ github.com/rogpeppe/go-internal v1.8.0/g + github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= + github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= + github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= ++github.com/sagernet/clash v1.10.7-0.20220610080510-ac56b2a05ded h1:iw6tWwLTRXgz65wOH8plV20P42q4UN0pgJyc6pQLLDk= ++github.com/sagernet/clash v1.10.7-0.20220610080510-ac56b2a05ded/go.mod h1:qrmVDeYq4Gr8SiGuxVoA4cc4xhq7TNgnLa76AANNYRA= + github.com/sagernet/gvisor v0.0.0-20220402114650-763d12dc953e h1:Y4avBAtZ59OWvLl6zP9sF62jtMEVRPIH78IQctq9aXQ= + github.com/sagernet/gvisor v0.0.0-20220402114650-763d12dc953e/go.mod h1:tWwEcFvJavs154OdjFCw78axNrsDlz4Zh8jvPqwcpGI= + github.com/sagernet/sing v0.0.0-20220614091938-64835a637bdc h1:AdNTzzSw6SCZI71GB+Am7cr+oUDUrBUaOi17FxDtNMw= +@@ -394,6 +396,8 @@ github.com/shurcooL/sanitized_anchor_nam + github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= + github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= + github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= ++github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= ++github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= + github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= + github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= + github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +@@ -451,6 +455,7 @@ go.opentelemetry.io/proto/otlp v0.7.0/go + go.starlark.net v0.0.0-20220328144851-d1966c6b9fcd h1:Uo/x0Ir5vQJ+683GXB9Ug+4fcjsbp7z7Ul8UaZbhsRM= + go.starlark.net v0.0.0-20220328144851-d1966c6b9fcd/go.mod h1:t3mmBBPzAVvK0L0n1drDmrQsJ8FoIx4INCqVMTr/Zo0= + go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= ++go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= + go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= + go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= + go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +@@ -566,6 +571,7 @@ golang.org/x/sys v0.0.0-20190606165138-5 + golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= + golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= + golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= ++golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= + golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= + golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= + golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=