summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorBug Magnet <marco.nikic@mullvad.net>2023-12-11 11:45:16 +0100
committerBug Magnet <marco.nikic@mullvad.net>2023-12-11 11:45:16 +0100
commit6f7893979538c04583cec4fa27c522f53e185861 (patch)
treeae0568fa114d3913357f511ff96aac053fdcba6b
parent6873304ac722cd1c96020a8d4dda4942beebc886 (diff)
parent9057933661879d093aa542dcea2b6e0d1026f041 (diff)
downloadmullvadvpn-6f7893979538c04583cec4fa27c522f53e185861.tar.xz
mullvadvpn-6f7893979538c04583cec4fa27c522f53e185861.zip
Merge branch 'move-transportstrategy-into-mullvadtransport-ios-28'
-rw-r--r--Cargo.toml2
-rw-r--r--ios/MullvadREST/ApiHandlers/AddressCache.swift (renamed from ios/MullvadREST/AddressCache.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/HTTP.swift (renamed from ios/MullvadREST/HTTP.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTAPIProxy.swift (renamed from ios/MullvadREST/RESTAPIProxy.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTAccessTokenManager.swift (renamed from ios/MullvadREST/RESTAccessTokenManager.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTAccountsProxy.swift (renamed from ios/MullvadREST/RESTAccountsProxy.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTAuthenticationProxy.swift (renamed from ios/MullvadREST/RESTAuthenticationProxy.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTAuthorization.swift (renamed from ios/MullvadREST/RESTAuthorization.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTCoding.swift (renamed from ios/MullvadREST/RESTCoding.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTDefaults.swift (renamed from ios/MullvadREST/RESTDefaults.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTDevicesProxy.swift (renamed from ios/MullvadREST/RESTDevicesProxy.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTError.swift (renamed from ios/MullvadREST/RESTError.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTNetworkOperation.swift (renamed from ios/MullvadREST/RESTNetworkOperation.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTProxy.swift (renamed from ios/MullvadREST/RESTProxy.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTProxyFactory.swift (renamed from ios/MullvadREST/RESTProxyFactory.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTRequestExecutor.swift (renamed from ios/MullvadREST/RESTRequestExecutor.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTRequestFactory.swift (renamed from ios/MullvadREST/RESTRequestFactory.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTRequestHandler.swift (renamed from ios/MullvadREST/RESTRequestHandler.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTResponseHandler.swift (renamed from ios/MullvadREST/RESTResponseHandler.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTTaskIdentifier.swift (renamed from ios/MullvadREST/RESTTaskIdentifier.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/RESTURLSession.swift (renamed from ios/MullvadREST/RESTURLSession.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/SSLPinningURLSessionDelegate.swift (renamed from ios/MullvadREST/SSLPinningURLSessionDelegate.swift)0
-rw-r--r--ios/MullvadREST/ApiHandlers/ServerRelaysResponse.swift (renamed from ios/MullvadREST/ServerRelaysResponse.swift)0
-rw-r--r--ios/MullvadREST/Assets/relays.json1
-rw-r--r--ios/MullvadREST/Relay/CachedRelays.swift (renamed from ios/RelayCache/CachedRelays.swift)1
-rw-r--r--ios/MullvadREST/Relay/Haversine.swift (renamed from ios/RelaySelector/Haversine.swift)0
-rw-r--r--ios/MullvadREST/Relay/Midpoint.swift (renamed from ios/RelaySelector/Midpoint.swift)0
-rw-r--r--ios/MullvadREST/Relay/RelayCache.swift (renamed from ios/RelayCache/RelayCache.swift)1
-rw-r--r--ios/MullvadREST/Relay/RelaySelector.swift (renamed from ios/RelaySelector/RelaySelector.swift)1
-rw-r--r--ios/MullvadREST/RetryStrategy/ExponentialBackoff.swift (renamed from ios/MullvadREST/ExponentialBackoff.swift)19
-rw-r--r--ios/MullvadREST/RetryStrategy/Jittered.swift29
-rw-r--r--ios/MullvadREST/RetryStrategy/RetryStrategy.swift (renamed from ios/MullvadREST/RESTRetryStrategy.swift)2
-rw-r--r--ios/MullvadREST/Transport/Direct/URLSessionTransport.swift (renamed from ios/MullvadTransport/URLSessionTransport.swift)6
-rw-r--r--ios/MullvadREST/Transport/RESTTransport.swift (renamed from ios/MullvadREST/RESTTransport.swift)0
-rw-r--r--ios/MullvadREST/Transport/RESTTransportProvider.swift (renamed from ios/MullvadREST/RESTTransportProvider.swift)0
-rw-r--r--ios/MullvadREST/Transport/Shadowsocks/ShadowSocksProxy.swift (renamed from ios/MullvadTransport/ShadowSocksProxy.swift)0
-rw-r--r--ios/MullvadREST/Transport/Shadowsocks/ShadowsocksConfiguration.swift (renamed from ios/MullvadTransport/ShadowsocksConfiguration.swift)0
-rw-r--r--ios/MullvadREST/Transport/Shadowsocks/ShadowsocksConfigurationCache.swift (renamed from ios/MullvadTransport/ShadowsocksConfigurationCache.swift)2
-rw-r--r--ios/MullvadREST/Transport/Shadowsocks/ShadowsocksTransport.swift (renamed from ios/MullvadTransport/URLSessionShadowsocksTransport.swift)13
-rw-r--r--ios/MullvadREST/Transport/Shadowsocks/module.private.modulemap (renamed from ios/MullvadTransport/module.private.modulemap)0
-rw-r--r--ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/.gitignore (renamed from ios/MullvadTransport/shadowsocks-proxy/.gitignore)0
-rw-r--r--ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/Cargo.toml (renamed from ios/MullvadTransport/shadowsocks-proxy/Cargo.toml)0
-rw-r--r--ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/build.rs (renamed from ios/MullvadTransport/shadowsocks-proxy/build.rs)0
-rw-r--r--ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/include/shadowsocks.h (renamed from ios/MullvadTransport/shadowsocks-proxy/include/shadowsocks.h)0
-rw-r--r--ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/bin/run.rs (renamed from ios/MullvadTransport/shadowsocks-proxy/src/bin/run.rs)0
-rw-r--r--ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/bin/run_unsafe.rs (renamed from ios/MullvadTransport/shadowsocks-proxy/src/bin/run_unsafe.rs)0
-rw-r--r--ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/ffi.rs (renamed from ios/MullvadTransport/shadowsocks-proxy/src/ffi.rs)0
-rw-r--r--ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/lib.rs (renamed from ios/MullvadTransport/shadowsocks-proxy/src/lib.rs)0
-rw-r--r--ios/MullvadREST/Transport/Shadowsocks/shadowsocks.h36
-rw-r--r--ios/MullvadREST/Transport/TransportProvider.swift (renamed from ios/MullvadTransport/TransportProvider.swift)8
-rw-r--r--ios/MullvadREST/Transport/TransportStrategy.swift (renamed from ios/MullvadREST/RESTTransportStrategy.swift)2
-rw-r--r--ios/MullvadREST/URLSessionTransport.swift89
-rw-r--r--ios/MullvadTransport/Info.plist5
-rw-r--r--ios/MullvadTransport/MullvadTransport.h19
-rw-r--r--ios/MullvadVPN.xcodeproj/project.pbxproj869
-rw-r--r--ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadTransport.xcscheme74
-rw-r--r--ios/MullvadVPN/AppDelegate.swift2
-rw-r--r--ios/MullvadVPN/Coordinators/ApplicationCoordinator.swift1
-rw-r--r--ios/MullvadVPN/Coordinators/RelayFilterCoordinator.swift2
-rw-r--r--ios/MullvadVPN/Coordinators/SelectLocationCoordinator.swift2
-rw-r--r--ios/MullvadVPN/RelayCacheTracker/RelayCacheTracker.swift1
-rw-r--r--ios/MullvadVPN/RelayCacheTracker/RelayCacheTrackerObserver.swift2
-rw-r--r--ios/MullvadVPN/SceneDelegate.swift1
-rw-r--r--ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift3
-rw-r--r--ios/MullvadVPN/TransportMonitor/PacketTunnelTransport.swift1
-rw-r--r--ios/MullvadVPN/TransportMonitor/TransportMonitor.swift3
-rw-r--r--ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift3
-rw-r--r--ios/MullvadVPN/TunnelManager/Tunnel+Messaging.swift1
-rw-r--r--ios/MullvadVPN/TunnelManager/TunnelManager.swift2
-rw-r--r--ios/MullvadVPN/View controllers/Preferences/PreferencesInteractor.swift2
-rw-r--r--ios/MullvadVPN/View controllers/RelayFilter/RelayFilterDataSource.swift1
-rw-r--r--ios/MullvadVPN/View controllers/RelayFilter/RelayFilterViewController.swift2
-rw-r--r--ios/MullvadVPN/View controllers/SelectLocation/LocationDataSource.swift1
-rw-r--r--ios/MullvadVPN/View controllers/SelectLocation/SelectLocationViewController.swift2
-rw-r--r--ios/MullvadVPN/View controllers/Settings/SettingsInteractorFactory.swift1
-rw-r--r--ios/MullvadVPNTests/CoordinatesTests.swift2
-rw-r--r--ios/MullvadVPNTests/RelayCacheTests.swift2
-rw-r--r--ios/MullvadVPNTests/RelayCacheTracker+Stubs.swift2
-rw-r--r--ios/MullvadVPNTests/RelaySelectorTests.swift1
-rw-r--r--ios/PacketTunnel/PacketTunnelProvider/BlockedStateErrorMapper.swift1
-rw-r--r--ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift2
-rw-r--r--ios/PacketTunnel/PacketTunnelProvider/RelaySelectorWrapper.swift3
-rw-r--r--ios/PacketTunnelCoreTests/AppMessageHandlerTests.swift1
-rw-r--r--ios/PacketTunnelCoreTests/PacketTunnelActorTests.swift2
-rw-r--r--ios/RelayCache/Assets/.gitkeep0
-rw-r--r--ios/RelayCache/RelayCache.h19
-rwxr-xr-xios/relays-prebuild.sh2
87 files changed, 264 insertions, 985 deletions
diff --git a/Cargo.toml b/Cargo.toml
index a94e5514b7..00a797d3c2 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -10,7 +10,7 @@ publish = false
resolver = "2"
members = [
"android/translations-converter",
- "ios/MullvadTransport/shadowsocks-proxy",
+ "ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy",
"ios/TunnelObfuscation/tunnel-obfuscator-proxy",
"mullvad-daemon",
"mullvad-cli",
diff --git a/ios/MullvadREST/AddressCache.swift b/ios/MullvadREST/ApiHandlers/AddressCache.swift
index 8db610fc48..8db610fc48 100644
--- a/ios/MullvadREST/AddressCache.swift
+++ b/ios/MullvadREST/ApiHandlers/AddressCache.swift
diff --git a/ios/MullvadREST/HTTP.swift b/ios/MullvadREST/ApiHandlers/HTTP.swift
index 93074fdbd3..93074fdbd3 100644
--- a/ios/MullvadREST/HTTP.swift
+++ b/ios/MullvadREST/ApiHandlers/HTTP.swift
diff --git a/ios/MullvadREST/RESTAPIProxy.swift b/ios/MullvadREST/ApiHandlers/RESTAPIProxy.swift
index 24d02d36e7..24d02d36e7 100644
--- a/ios/MullvadREST/RESTAPIProxy.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTAPIProxy.swift
diff --git a/ios/MullvadREST/RESTAccessTokenManager.swift b/ios/MullvadREST/ApiHandlers/RESTAccessTokenManager.swift
index d15bd6b9cb..d15bd6b9cb 100644
--- a/ios/MullvadREST/RESTAccessTokenManager.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTAccessTokenManager.swift
diff --git a/ios/MullvadREST/RESTAccountsProxy.swift b/ios/MullvadREST/ApiHandlers/RESTAccountsProxy.swift
index 4088a2abb4..4088a2abb4 100644
--- a/ios/MullvadREST/RESTAccountsProxy.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTAccountsProxy.swift
diff --git a/ios/MullvadREST/RESTAuthenticationProxy.swift b/ios/MullvadREST/ApiHandlers/RESTAuthenticationProxy.swift
index cbcd6fdc07..cbcd6fdc07 100644
--- a/ios/MullvadREST/RESTAuthenticationProxy.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTAuthenticationProxy.swift
diff --git a/ios/MullvadREST/RESTAuthorization.swift b/ios/MullvadREST/ApiHandlers/RESTAuthorization.swift
index 340bd63f5c..340bd63f5c 100644
--- a/ios/MullvadREST/RESTAuthorization.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTAuthorization.swift
diff --git a/ios/MullvadREST/RESTCoding.swift b/ios/MullvadREST/ApiHandlers/RESTCoding.swift
index 0c6996d18c..0c6996d18c 100644
--- a/ios/MullvadREST/RESTCoding.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTCoding.swift
diff --git a/ios/MullvadREST/RESTDefaults.swift b/ios/MullvadREST/ApiHandlers/RESTDefaults.swift
index e9e8c50e13..e9e8c50e13 100644
--- a/ios/MullvadREST/RESTDefaults.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTDefaults.swift
diff --git a/ios/MullvadREST/RESTDevicesProxy.swift b/ios/MullvadREST/ApiHandlers/RESTDevicesProxy.swift
index dd49179c30..dd49179c30 100644
--- a/ios/MullvadREST/RESTDevicesProxy.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTDevicesProxy.swift
diff --git a/ios/MullvadREST/RESTError.swift b/ios/MullvadREST/ApiHandlers/RESTError.swift
index 1fdb255b81..1fdb255b81 100644
--- a/ios/MullvadREST/RESTError.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTError.swift
diff --git a/ios/MullvadREST/RESTNetworkOperation.swift b/ios/MullvadREST/ApiHandlers/RESTNetworkOperation.swift
index 0321c7be79..0321c7be79 100644
--- a/ios/MullvadREST/RESTNetworkOperation.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTNetworkOperation.swift
diff --git a/ios/MullvadREST/RESTProxy.swift b/ios/MullvadREST/ApiHandlers/RESTProxy.swift
index 49d4fc8968..49d4fc8968 100644
--- a/ios/MullvadREST/RESTProxy.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTProxy.swift
diff --git a/ios/MullvadREST/RESTProxyFactory.swift b/ios/MullvadREST/ApiHandlers/RESTProxyFactory.swift
index 43201890cc..43201890cc 100644
--- a/ios/MullvadREST/RESTProxyFactory.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTProxyFactory.swift
diff --git a/ios/MullvadREST/RESTRequestExecutor.swift b/ios/MullvadREST/ApiHandlers/RESTRequestExecutor.swift
index a705d1cda2..a705d1cda2 100644
--- a/ios/MullvadREST/RESTRequestExecutor.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTRequestExecutor.swift
diff --git a/ios/MullvadREST/RESTRequestFactory.swift b/ios/MullvadREST/ApiHandlers/RESTRequestFactory.swift
index f0a3f3334e..f0a3f3334e 100644
--- a/ios/MullvadREST/RESTRequestFactory.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTRequestFactory.swift
diff --git a/ios/MullvadREST/RESTRequestHandler.swift b/ios/MullvadREST/ApiHandlers/RESTRequestHandler.swift
index a40212dcf5..a40212dcf5 100644
--- a/ios/MullvadREST/RESTRequestHandler.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTRequestHandler.swift
diff --git a/ios/MullvadREST/RESTResponseHandler.swift b/ios/MullvadREST/ApiHandlers/RESTResponseHandler.swift
index fd07b639e9..fd07b639e9 100644
--- a/ios/MullvadREST/RESTResponseHandler.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTResponseHandler.swift
diff --git a/ios/MullvadREST/RESTTaskIdentifier.swift b/ios/MullvadREST/ApiHandlers/RESTTaskIdentifier.swift
index f892483567..f892483567 100644
--- a/ios/MullvadREST/RESTTaskIdentifier.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTTaskIdentifier.swift
diff --git a/ios/MullvadREST/RESTURLSession.swift b/ios/MullvadREST/ApiHandlers/RESTURLSession.swift
index 99bafcee3c..99bafcee3c 100644
--- a/ios/MullvadREST/RESTURLSession.swift
+++ b/ios/MullvadREST/ApiHandlers/RESTURLSession.swift
diff --git a/ios/MullvadREST/SSLPinningURLSessionDelegate.swift b/ios/MullvadREST/ApiHandlers/SSLPinningURLSessionDelegate.swift
index 6ab457fd49..6ab457fd49 100644
--- a/ios/MullvadREST/SSLPinningURLSessionDelegate.swift
+++ b/ios/MullvadREST/ApiHandlers/SSLPinningURLSessionDelegate.swift
diff --git a/ios/MullvadREST/ServerRelaysResponse.swift b/ios/MullvadREST/ApiHandlers/ServerRelaysResponse.swift
index 63f0822e63..63f0822e63 100644
--- a/ios/MullvadREST/ServerRelaysResponse.swift
+++ b/ios/MullvadREST/ApiHandlers/ServerRelaysResponse.swift
diff --git a/ios/MullvadREST/Assets/relays.json b/ios/MullvadREST/Assets/relays.json
new file mode 100644
index 0000000000..92fef059b5
--- /dev/null
+++ b/ios/MullvadREST/Assets/relays.json
@@ -0,0 +1 @@
+{"locations":{"au-adl":{"country":"Australia","city":"Adelaide","latitude":-34.92123,"longitude":138.599503},"nl-ams":{"country":"Netherlands","city":"Amsterdam","latitude":52.35,"longitude":4.916667},"us-qas":{"country":"USA","city":"Ashburn, VA","latitude":39.043757,"longitude":-77.487442},"gr-ath":{"country":"Greece","city":"Athens","latitude":37.98381,"longitude":23.727539},"us-atl":{"country":"USA","city":"Atlanta, GA","latitude":33.753746,"longitude":-84.38633},"nz-akl":{"country":"New Zealand","city":"Auckland","latitude":-36.848461,"longitude":174.763336},"rs-beg":{"country":"Serbia","city":"Belgrade","latitude":44.787197,"longitude":20.457273},"de-ber":{"country":"Germany","city":"Berlin","latitude":52.520008,"longitude":13.404954},"co-bog":{"country":"Colombia","city":"Bogota","latitude":4.624335,"longitude":-74.063644},"us-bos":{"country":"USA","city":"Boston, MA","latitude":42.361145,"longitude":-71.057083},"sk-bts":{"country":"Slovakia","city":"Bratislava","latitude":48.148598,"longitude":17.107748},"au-bne":{"country":"Australia","city":"Brisbane","latitude":-27.471,"longitude":153.0234},"be-bru":{"country":"Belgium","city":"Brussels","latitude":50.833333,"longitude":4.333333},"ro-buh":{"country":"Romania","city":"Bucharest","latitude":44.433333,"longitude":26.1},"hu-bud":{"country":"Hungary","city":"Budapest","latitude":47.5,"longitude":19.083333},"ca-yyc":{"country":"Canada","city":"Calgary","latitude":51.037007,"longitude":-114.058315},"us-chi":{"country":"USA","city":"Chicago, IL","latitude":41.881832,"longitude":-87.623177},"dk-cph":{"country":"Denmark","city":"Copenhagen","latitude":55.666667,"longitude":12.583333},"us-dal":{"country":"USA","city":"Dallas, TX","latitude":32.89748,"longitude":-97.040443},"us-den":{"country":"USA","city":"Denver, CO","latitude":39.7392358,"longitude":-104.990251},"us-det":{"country":"USA","city":"Detroit, MI","latitude":42.331389,"longitude":-83.045833},"ie-dub":{"country":"Ireland","city":"Dublin","latitude":53.35014,"longitude":-6.266155},"de-dus":{"country":"Germany","city":"Dusseldorf","latitude":51.233334,"longitude":6.783333},"de-fra":{"country":"Germany","city":"Frankfurt","latitude":50.110924,"longitude":8.682127},"se-got":{"country":"Sweden","city":"Gothenburg","latitude":57.70887,"longitude":11.97456},"fi-hel":{"country":"Finland","city":"Helsinki","latitude":60.192059,"longitude":24.945831},"hk-hkg":{"country":"Hong Kong","city":"Hong Kong","latitude":22.2833333,"longitude":114.15},"us-hou":{"country":"USA","city":"Houston, TX","latitude":29.749907,"longitude":-95.358421},"za-jnb":{"country":"South Africa","city":"Johannesburg","latitude":-26.195246,"longitude":28.034088},"ua-iev":{"country":"Ukraine","city":"Kyiv","latitude":50.4501,"longitude":30.5234},"pt-lis":{"country":"Portugal","city":"Lisbon","latitude":38.736946,"longitude":-9.142685},"gb-lon":{"country":"UK","city":"London","latitude":51.514125,"longitude":-0.093689},"us-lax":{"country":"USA","city":"Los Angeles, CA","latitude":34.052235,"longitude":-118.243683},"es-mad":{"country":"Spain","city":"Madrid","latitude":40.408566,"longitude":-3.69222},"se-mma":{"country":"Sweden","city":"Malmö","latitude":55.607075,"longitude":13.002716},"gb-mnc":{"country":"UK","city":"Manchester","latitude":53.5,"longitude":-2.216667},"fr-mrs":{"country":"France","city":"Marseille","latitude":43.29648,"longitude":5.38107},"au-mel":{"country":"Australia","city":"Melbourne","latitude":-37.815018,"longitude":144.946014},"us-mia":{"country":"USA","city":"Miami, FL","latitude":25.761681,"longitude":-80.191788},"it-mil":{"country":"Italy","city":"Milan","latitude":45.466667,"longitude":9.2},"ca-mtr":{"country":"Canada","city":"Montreal","latitude":45.5053,"longitude":-73.5525},"us-nyc":{"country":"USA","city":"New York, NY","latitude":40.73061,"longitude":-73.935242},"jp-osa":{"country":"Japan","city":"Osaka","latitude":34.672314,"longitude":135.484802},"no-osl":{"country":"Norway","city":"Oslo","latitude":59.916667,"longitude":10.75},"fr-par":{"country":"France","city":"Paris","latitude":48.866667,"longitude":2.333333},"au-per":{"country":"Australia","city":"Perth","latitude":-31.953512,"longitude":115.857048},"us-phx":{"country":"USA","city":"Phoenix, AZ","latitude":33.448376,"longitude":-112.074036},"cz-prg":{"country":"Czech Republic","city":"Prague","latitude":50.083333,"longitude":14.466667},"mx-qro":{"country":"Mexico","city":"Queretaro","latitude":20.5927744,"longitude":-100.3902245},"us-rag":{"country":"USA","city":"Raleigh, NC","latitude":35.787743,"longitude":-78.644257},"lv-rix":{"country":"Latvia","city":"Riga","latitude":56.946285,"longitude":24.105078},"us-slc":{"country":"USA","city":"Salt Lake City, UT","latitude":40.758701,"longitude":-111.876183},"us-sjc":{"country":"USA","city":"San Jose, CA","latitude":37.3382082,"longitude":-121.8863286},"br-sao":{"country":"Brazil","city":"Sao Paulo","latitude":-23.533773,"longitude":-46.62529},"us-sea":{"country":"USA","city":"Seattle, WA","latitude":47.608013,"longitude":-122.335167},"us-uyk":{"country":"USA","city":"Secaucus, NJ","latitude":40.789543,"longitude":-74.0565},"sg-sin":{"country":"Singapore","city":"Singapore","latitude":1.2930556,"longitude":103.8558333},"bg-sof":{"country":"Bulgaria","city":"Sofia","latitude":42.6833333,"longitude":23.3166667},"no-svg":{"country":"Norway","city":"Stavanger","latitude":58.964432,"longitude":5.72625},"se-sto":{"country":"Sweden","city":"Stockholm","latitude":59.3289,"longitude":18.0649},"au-syd":{"country":"Australia","city":"Sydney","latitude":-33.861481,"longitude":151.205475},"ee-tll":{"country":"Estonia","city":"Tallinn","latitude":59.436961,"longitude":24.753575},"il-tlv":{"country":"Israel","city":"Tel Aviv","latitude":32.0852999,"longitude":34.7817676},"al-tia":{"country":"Albania","city":"Tirana","latitude":41.327953,"longitude":19.819025},"jp-tyo":{"country":"Japan","city":"Tokyo","latitude":35.685,"longitude":139.751389},"ca-tor":{"country":"Canada","city":"Toronto","latitude":43.666667,"longitude":-79.416667},"ca-van":{"country":"Canada","city":"Vancouver","latitude":49.25,"longitude":-123.133333},"at-vie":{"country":"Austria","city":"Vienna","latitude":48.210033,"longitude":16.363449},"pl-waw":{"country":"Poland","city":"Warsaw","latitude":52.25,"longitude":21.0},"hr-zag":{"country":"Croatia","city":"Zagreb","latitude":45.821,"longitude":15.973},"ch-zrh":{"country":"Switzerland","city":"Zurich","latitude":47.366667,"longitude":8.55}},"openvpn":{"relays":[{"hostname":"al-tia-ovpn-001","location":"al-tia","active":true,"owned":false,"provider":"iRegister","stboot":true,"ipv4_addr_in":"31.171.154.50","include_in_country":true,"weight":100},{"hostname":"at-vie-ovpn-001","location":"at-vie","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.116.194","include_in_country":true,"weight":100},{"hostname":"at-vie-ovpn-002","location":"at-vie","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.116.226","include_in_country":true,"weight":100},{"hostname":"au-adl-ovpn-301","location":"au-adl","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.214.20.146","include_in_country":true,"weight":100},{"hostname":"au-adl-ovpn-302","location":"au-adl","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.214.20.162","include_in_country":true,"weight":100},{"hostname":"au-bne-ovpn-301","location":"au-bne","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.216.220.50","include_in_country":true,"weight":100},{"hostname":"au-bne-ovpn-302","location":"au-bne","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.216.220.66","include_in_country":true,"weight":100},{"hostname":"au-mel-ovpn-301","location":"au-mel","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.108.229.82","include_in_country":true,"weight":100},{"hostname":"au-mel-ovpn-302","location":"au-mel","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.108.229.98","include_in_country":true,"weight":100},{"hostname":"au-per-ovpn-301","location":"au-per","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.108.231.82","include_in_country":true,"weight":100},{"hostname":"au-per-ovpn-302","location":"au-per","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.108.231.98","include_in_country":true,"weight":100},{"hostname":"au-syd-ovpn-001","location":"au-syd","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.200.130","include_in_country":true,"weight":100},{"hostname":"au-syd-ovpn-002","location":"au-syd","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.200.66","include_in_country":true,"weight":100},{"hostname":"be-bru-ovpn-101","location":"be-bru","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"82.102.19.66","include_in_country":true,"weight":100},{"hostname":"be-bru-ovpn-102","location":"be-bru","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"91.207.57.130","include_in_country":true,"weight":100},{"hostname":"bg-sof-ovpn-001","location":"bg-sof","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.188.66","include_in_country":true,"weight":100},{"hostname":"bg-sof-ovpn-002","location":"bg-sof","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.188.2","include_in_country":true,"weight":100},{"hostname":"br-sao-ovpn-001","location":"br-sao","active":true,"owned":false,"provider":"Qnax","stboot":true,"ipv4_addr_in":"149.78.184.210","include_in_country":true,"weight":100},{"hostname":"ca-mtr-ovpn-001","location":"ca-mtr","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"37.120.237.66","include_in_country":true,"weight":100},{"hostname":"ca-mtr-ovpn-002","location":"ca-mtr","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"45.133.182.194","include_in_country":true,"weight":100},{"hostname":"ca-tor-ovpn-001","location":"ca-tor","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.214.193","include_in_country":true,"weight":100},{"hostname":"ca-tor-ovpn-002","location":"ca-tor","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.214.206","include_in_country":true,"weight":100},{"hostname":"ca-tor-ovpn-101","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.132.34","include_in_country":true,"weight":100},{"hostname":"ca-tor-ovpn-102","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.132.66","include_in_country":true,"weight":100},{"hostname":"ca-van-ovpn-201","location":"ca-van","active":true,"owned":false,"provider":"techfutures","stboot":true,"ipv4_addr_in":"104.193.135.132","include_in_country":false,"weight":100},{"hostname":"ca-van-ovpn-202","location":"ca-van","active":true,"owned":false,"provider":"techfutures","stboot":true,"ipv4_addr_in":"104.193.135.164","include_in_country":false,"weight":100},{"hostname":"ch-zrh-ovpn-001","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.81","include_in_country":true,"weight":1},{"hostname":"ch-zrh-ovpn-002","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.82","include_in_country":true,"weight":1},{"hostname":"ch-zrh-ovpn-003","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.83","include_in_country":true,"weight":1},{"hostname":"ch-zrh-ovpn-004","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.84","include_in_country":true,"weight":1},{"hostname":"ch-zrh-ovpn-201","location":"ch-zrh","active":true,"owned":false,"provider":"PrivateLayer","stboot":true,"ipv4_addr_in":"46.19.140.194","include_in_country":true,"weight":100},{"hostname":"ch-zrh-ovpn-202","location":"ch-zrh","active":true,"owned":false,"provider":"PrivateLayer","stboot":true,"ipv4_addr_in":"81.17.16.66","include_in_country":true,"weight":100},{"hostname":"ch-zrh-ovpn-501","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.134.130","include_in_country":true,"weight":100},{"hostname":"ch-zrh-ovpn-502","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.134.162","include_in_country":true,"weight":100},{"hostname":"cz-prg-ovpn-101","location":"cz-prg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.129.162","include_in_country":true,"weight":100},{"hostname":"cz-prg-ovpn-102","location":"cz-prg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.129.194","include_in_country":true,"weight":100},{"hostname":"de-ber-ovpn-001","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.72","include_in_country":true,"weight":100},{"hostname":"de-ber-ovpn-002","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.73","include_in_country":true,"weight":100},{"hostname":"de-ber-ovpn-003","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.74","include_in_country":true,"weight":100},{"hostname":"de-ber-ovpn-004","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.75","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-001","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.66","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-002","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.67","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-003","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.68","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-004","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.69","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-005","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.70","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-006","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.71","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-007","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.72","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-101","location":"de-fra","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.117.66","include_in_country":true,"weight":100},{"hostname":"de-fra-ovpn-102","location":"de-fra","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.117.98","include_in_country":true,"weight":100},{"hostname":"dk-cph-ovpn-001","location":"dk-cph","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.254.71","include_in_country":true,"weight":100},{"hostname":"dk-cph-ovpn-002","location":"dk-cph","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"45.129.56.81","include_in_country":true,"weight":100},{"hostname":"dk-cph-ovpn-401","location":"dk-cph","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.197.66","include_in_country":true,"weight":100},{"hostname":"dk-cph-ovpn-402","location":"dk-cph","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.197.2","include_in_country":true,"weight":100},{"hostname":"es-mad-ovpn-201","location":"es-mad","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.128.162","include_in_country":true,"weight":100},{"hostname":"es-mad-ovpn-202","location":"es-mad","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.74.98","include_in_country":true,"weight":100},{"hostname":"fi-hel-ovpn-001","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.171","include_in_country":true,"weight":100},{"hostname":"fi-hel-ovpn-002","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.172","include_in_country":true,"weight":100},{"hostname":"fi-hel-ovpn-003","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.173","include_in_country":true,"weight":100},{"hostname":"fi-hel-ovpn-004","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.174","include_in_country":true,"weight":100},{"hostname":"fi-hel-ovpn-005","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.175","include_in_country":true,"weight":100},{"hostname":"fi-hel-ovpn-006","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.176","include_in_country":true,"weight":100},{"hostname":"fi-hel-ovpn-007","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.212.149.201","include_in_country":true,"weight":100},{"hostname":"fi-hel-ovpn-101","location":"fi-hel","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"193.138.7.217","include_in_country":true,"weight":101},{"hostname":"fi-hel-ovpn-102","location":"fi-hel","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"193.138.7.237","include_in_country":true,"weight":100},{"hostname":"fr-par-ovpn-001","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.81","include_in_country":true,"weight":100},{"hostname":"fr-par-ovpn-002","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.82","include_in_country":true,"weight":100},{"hostname":"fr-par-ovpn-003","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.83","include_in_country":true,"weight":100},{"hostname":"fr-par-ovpn-004","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.84","include_in_country":false,"weight":100},{"hostname":"fr-par-ovpn-101","location":"fr-par","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.184.130","include_in_country":true,"weight":100},{"hostname":"fr-par-ovpn-102","location":"fr-par","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.184.194","include_in_country":true,"weight":100},{"hostname":"gb-lon-ovpn-001","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.252.131","include_in_country":true,"weight":100},{"hostname":"gb-lon-ovpn-002","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.252.132","include_in_country":true,"weight":100},{"hostname":"gb-lon-ovpn-003","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.252.133","include_in_country":true,"weight":100},{"hostname":"gb-lon-ovpn-005","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.232.85","include_in_country":true,"weight":100},{"hostname":"gb-lon-ovpn-006","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.232.86","include_in_country":true,"weight":100},{"hostname":"gb-lon-ovpn-008","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.252.138","include_in_country":true,"weight":100},{"hostname":"gb-lon-ovpn-301","location":"gb-lon","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.119.98","include_in_country":true,"weight":10},{"hostname":"gb-lon-ovpn-302","location":"gb-lon","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.119.130","include_in_country":true,"weight":10},{"hostname":"gb-lon-ovpn-303","location":"gb-lon","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.119.162","include_in_country":true,"weight":10},{"hostname":"gb-mnc-ovpn-001","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.132.2","include_in_country":true,"weight":100},{"hostname":"gb-mnc-ovpn-002","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.132.34","include_in_country":true,"weight":100},{"hostname":"gb-mnc-ovpn-003","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.132.66","include_in_country":true,"weight":100},{"hostname":"gb-mnc-ovpn-004","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.132.98","include_in_country":true,"weight":100},{"hostname":"gr-ath-ovpn-101","location":"gr-ath","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.102.246.28","include_in_country":true,"weight":100},{"hostname":"gr-ath-ovpn-102","location":"gr-ath","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.102.246.41","include_in_country":true,"weight":100},{"hostname":"hk-hkg-ovpn-201","location":"hk-hkg","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"103.125.233.33","include_in_country":true,"weight":100},{"hostname":"hk-hkg-ovpn-202","location":"hk-hkg","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"103.125.233.48","include_in_country":true,"weight":100},{"hostname":"hk-hkg-ovpn-301","location":"hk-hkg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.224.130","include_in_country":true,"weight":100},{"hostname":"hk-hkg-ovpn-302","location":"hk-hkg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.224.196","include_in_country":true,"weight":100},{"hostname":"hu-bud-ovpn-101","location":"hu-bud","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.196.66","include_in_country":true,"weight":100},{"hostname":"hu-bud-ovpn-102","location":"hu-bud","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.196.2","include_in_country":true,"weight":100},{"hostname":"ie-dub-ovpn-101","location":"ie-dub","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.189.130","include_in_country":true,"weight":100},{"hostname":"ie-dub-ovpn-102","location":"ie-dub","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.189.194","include_in_country":true,"weight":100},{"hostname":"it-mil-ovpn-201","location":"it-mil","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.225.130","include_in_country":true,"weight":100},{"hostname":"it-mil-ovpn-202","location":"it-mil","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.225.194","include_in_country":true,"weight":100},{"hostname":"jp-tyo-ovpn-201","location":"jp-tyo","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.201.130","include_in_country":true,"weight":100},{"hostname":"jp-tyo-ovpn-202","location":"jp-tyo","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.201.194","include_in_country":true,"weight":100},{"hostname":"lv-rix-ovpn-001","location":"lv-rix","active":true,"owned":false,"provider":"Makonix","stboot":true,"ipv4_addr_in":"31.170.22.2","include_in_country":true,"weight":100},{"hostname":"nl-ams-ovpn-001","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.71","include_in_country":true,"weight":100},{"hostname":"nl-ams-ovpn-002","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.72","include_in_country":true,"weight":100},{"hostname":"nl-ams-ovpn-003","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.73","include_in_country":true,"weight":100},{"hostname":"nl-ams-ovpn-004","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.74","include_in_country":true,"weight":100},{"hostname":"nl-ams-ovpn-005","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.75","include_in_country":true,"weight":100},{"hostname":"nl-ams-ovpn-006","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.76","include_in_country":true,"weight":100},{"hostname":"no-osl-ovpn-001","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"91.90.44.11","include_in_country":false,"weight":100},{"hostname":"no-osl-ovpn-002","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"91.90.44.12","include_in_country":false,"weight":100},{"hostname":"no-osl-ovpn-003","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"91.90.44.13","include_in_country":false,"weight":100},{"hostname":"no-osl-ovpn-004","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"91.90.44.14","include_in_country":false,"weight":100},{"hostname":"no-osl-ovpn-005","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"91.90.44.15","include_in_country":false,"weight":100},{"hostname":"no-osl-ovpn-008","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"91.90.44.18","include_in_country":true,"weight":100},{"hostname":"no-svg-ovpn-001","location":"no-svg","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"194.127.199.114","include_in_country":true,"weight":100},{"hostname":"no-svg-ovpn-002","location":"no-svg","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"194.127.199.145","include_in_country":true,"weight":100},{"hostname":"nz-akl-ovpn-301","location":"nz-akl","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.75.11.82","include_in_country":true,"weight":100},{"hostname":"nz-akl-ovpn-302","location":"nz-akl","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.75.11.98","include_in_country":true,"weight":100},{"hostname":"pl-waw-ovpn-201","location":"pl-waw","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.144.66","include_in_country":true,"weight":100},{"hostname":"pl-waw-ovpn-202","location":"pl-waw","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.144.98","include_in_country":true,"weight":100},{"hostname":"ro-buh-ovpn-001","location":"ro-buh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.124.162","include_in_country":true,"weight":100},{"hostname":"ro-buh-ovpn-002","location":"ro-buh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"37.120.246.130","include_in_country":true,"weight":100},{"hostname":"rs-beg-ovpn-101","location":"rs-beg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.193.194","include_in_country":true,"weight":100},{"hostname":"rs-beg-ovpn-102","location":"rs-beg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.193.130","include_in_country":true,"weight":100},{"hostname":"se-got-ovpn-001","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.131","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-002","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.132","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-003","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.133","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-004","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.134","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-005","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.135","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-006","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.136","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-007","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.137","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-008","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.138","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-009","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.139","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-010","location":"se-got","active":false,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.140","include_in_country":false,"weight":100},{"hostname":"se-got-ovpn-011","location":"se-got","active":false,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.141","include_in_country":false,"weight":100},{"hostname":"se-mma-ovpn-001","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.138.218.131","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-002","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.138.218.132","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-013","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.83","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-014","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.84","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-015","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.85","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-016","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.86","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-017","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.87","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-018","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.88","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-019","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.89","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-020","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.90","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-021","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.91","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-022","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.92","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-023","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.255.93","include_in_country":true,"weight":100},{"hostname":"se-mma-ovpn-102","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"45.83.220.92","include_in_country":true,"weight":100},{"hostname":"se-sto-ovpn-001","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.80","include_in_country":true,"weight":100},{"hostname":"se-sto-ovpn-002","location":"se-sto","active":false,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.81","include_in_country":true,"weight":100},{"hostname":"se-sto-ovpn-003","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.82","include_in_country":true,"weight":100},{"hostname":"se-sto-ovpn-004","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.83","include_in_country":true,"weight":100},{"hostname":"sg-sin-ovpn-101","location":"sg-sin","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.199.66","include_in_country":true,"weight":100},{"hostname":"sg-sin-ovpn-102","location":"sg-sin","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.199.2","include_in_country":true,"weight":100},{"hostname":"us-atl-ovpn-001","location":"us-atl","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.140.156","include_in_country":true,"weight":100},{"hostname":"us-atl-ovpn-002","location":"us-atl","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.140.169","include_in_country":true,"weight":100},{"hostname":"us-atl-ovpn-101","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.226","include_in_country":false,"weight":1},{"hostname":"us-atl-ovpn-102","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.227","include_in_country":false,"weight":1},{"hostname":"us-atl-ovpn-103","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.228","include_in_country":false,"weight":1},{"hostname":"us-atl-ovpn-104","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.229","include_in_country":false,"weight":1},{"hostname":"us-atl-ovpn-105","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.230","include_in_country":false,"weight":1},{"hostname":"us-chi-ovpn-001","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.43.34","include_in_country":false,"weight":100},{"hostname":"us-chi-ovpn-002","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.43.66","include_in_country":false,"weight":100},{"hostname":"us-chi-ovpn-003","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.43.98","include_in_country":false,"weight":100},{"hostname":"us-dal-ovpn-001","location":"us-dal","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.211.194","include_in_country":true,"weight":100},{"hostname":"us-dal-ovpn-002","location":"us-dal","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.177.66","include_in_country":true,"weight":100},{"hostname":"us-dal-ovpn-101","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.3","include_in_country":false,"weight":1},{"hostname":"us-dal-ovpn-102","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.4","include_in_country":false,"weight":1},{"hostname":"us-dal-ovpn-103","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.5","include_in_country":false,"weight":1},{"hostname":"us-dal-ovpn-104","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.6","include_in_country":false,"weight":1},{"hostname":"us-dal-ovpn-105","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.7","include_in_country":false,"weight":1},{"hostname":"us-den-ovpn-001","location":"us-den","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.128.98","include_in_country":true,"weight":100},{"hostname":"us-den-ovpn-002","location":"us-den","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.128.226","include_in_country":true,"weight":100},{"hostname":"us-lax-ovpn-101","location":"us-lax","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.129.162","include_in_country":true,"weight":100},{"hostname":"us-lax-ovpn-102","location":"us-lax","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.129.130","include_in_country":true,"weight":100},{"hostname":"us-lax-ovpn-201","location":"us-lax","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.203.41","include_in_country":true,"weight":100},{"hostname":"us-lax-ovpn-202","location":"us-lax","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.203.54","include_in_country":true,"weight":100},{"hostname":"us-lax-ovpn-401","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.172.66","include_in_country":true,"weight":100},{"hostname":"us-lax-ovpn-402","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.172.130","include_in_country":true,"weight":100},{"hostname":"us-lax-ovpn-403","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.172.194","include_in_country":true,"weight":100},{"hostname":"us-lax-ovpn-404","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.174.2","include_in_country":true,"weight":100},{"hostname":"us-mia-ovpn-101","location":"us-mia","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.187.194","include_in_country":true,"weight":100},{"hostname":"us-mia-ovpn-102","location":"us-mia","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.183.66","include_in_country":true,"weight":100},{"hostname":"us-nyc-ovpn-401","location":"us-nyc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.136.130","include_in_country":true,"weight":25},{"hostname":"us-nyc-ovpn-402","location":"us-nyc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.136.162","include_in_country":true,"weight":25},{"hostname":"us-nyc-ovpn-501","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.168.2","include_in_country":true,"weight":100},{"hostname":"us-nyc-ovpn-502","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.166.2","include_in_country":true,"weight":100},{"hostname":"us-nyc-ovpn-503","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.166.66","include_in_country":true,"weight":100},{"hostname":"us-nyc-ovpn-504","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.165.66","include_in_country":true,"weight":100},{"hostname":"us-nyc-ovpn-601","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.171.194","include_in_country":true,"weight":100},{"hostname":"us-nyc-ovpn-602","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.185.130","include_in_country":true,"weight":100},{"hostname":"us-nyc-ovpn-603","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.185.66","include_in_country":true,"weight":100},{"hostname":"us-nyc-ovpn-604","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.168.194","include_in_country":true,"weight":100},{"hostname":"us-phx-ovpn-101","location":"us-phx","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.133.34","include_in_country":true,"weight":5},{"hostname":"us-phx-ovpn-102","location":"us-phx","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.133.66","include_in_country":true,"weight":5},{"hostname":"us-qas-ovpn-001","location":"us-qas","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.135.162","include_in_country":true,"weight":100},{"hostname":"us-qas-ovpn-002","location":"us-qas","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.135.194","include_in_country":true,"weight":100},{"hostname":"us-qas-ovpn-101","location":"us-qas","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"185.156.46.169","include_in_country":true,"weight":100},{"hostname":"us-qas-ovpn-102","location":"us-qas","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"185.156.46.182","include_in_country":true,"weight":100},{"hostname":"us-rag-ovpn-101","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.34","include_in_country":true,"weight":4},{"hostname":"us-rag-ovpn-102","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.50","include_in_country":true,"weight":4},{"hostname":"us-rag-ovpn-103","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.66","include_in_country":true,"weight":5},{"hostname":"us-sea-ovpn-101","location":"us-sea","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.131.34","include_in_country":true,"weight":4},{"hostname":"us-sea-ovpn-102","location":"us-sea","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.131.66","include_in_country":true,"weight":4},{"hostname":"us-sjc-ovpn-001","location":"us-sjc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.134.34","include_in_country":false,"weight":50},{"hostname":"us-sjc-ovpn-002","location":"us-sjc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.134.66","include_in_country":false,"weight":50},{"hostname":"us-slc-ovpn-101","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.132","include_in_country":false,"weight":1},{"hostname":"us-slc-ovpn-102","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.133","include_in_country":false,"weight":1},{"hostname":"us-slc-ovpn-103","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.134","include_in_country":false,"weight":1},{"hostname":"us-slc-ovpn-104","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.135","include_in_country":false,"weight":1},{"hostname":"us-slc-ovpn-105","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.136","include_in_country":false,"weight":1},{"hostname":"us-slc-ovpn-106","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.137","include_in_country":false,"weight":1}],"ports":[{"port":1194,"protocol":"udp"},{"port":1195,"protocol":"udp"},{"port":1196,"protocol":"udp"},{"port":1197,"protocol":"udp"},{"port":1300,"protocol":"udp"},{"port":1301,"protocol":"udp"},{"port":1302,"protocol":"udp"},{"port":443,"protocol":"tcp"},{"port":80,"protocol":"tcp"}]},"wireguard":{"relays":[{"hostname":"al-tia-wg-001","location":"al-tia","active":true,"owned":false,"provider":"iRegister","stboot":true,"ipv4_addr_in":"31.171.153.66","include_in_country":true,"weight":100,"public_key":"bPfJDdgBXlY4w3ACs68zOMMhLUbbzktCKnLOFHqbxl4=","ipv6_addr_in":"2a04:27c0:0:3::f001","same_ip":true},{"hostname":"at-vie-wg-001","location":"at-vie","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.116.98","include_in_country":true,"weight":100,"public_key":"TNrdH73p6h2EfeXxUiLOCOWHcjmjoslLxZptZpIPQXU=","ipv6_addr_in":"2001:ac8:29:84::a01f","same_ip":true},{"hostname":"at-vie-wg-002","location":"at-vie","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.116.130","include_in_country":true,"weight":100,"public_key":"ehXBc726YX1N6Dm7fDAVMG5cIaYAFqCA4Lbpl4VWcWE=","ipv6_addr_in":"2001:ac8:29:85::a02f","same_ip":true},{"hostname":"at-vie-wg-003","location":"at-vie","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.116.162","include_in_country":true,"weight":100,"public_key":"ddllelPu2ndjSX4lHhd/kdCStaSJOQixs9z551qN6B8=","ipv6_addr_in":"2001:ac8:29:86::a03f","same_ip":true},{"hostname":"au-adl-wg-301","location":"au-adl","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.214.20.50","include_in_country":true,"weight":100,"public_key":"rm2hpBiN91c7reV+cYKlw7QNkYtME/+js7IMyYBB2Aw=","ipv6_addr_in":"2404:f780:0:deb::c1f","same_ip":true},{"hostname":"au-adl-wg-302","location":"au-adl","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.214.20.130","include_in_country":true,"weight":100,"public_key":"e4jouH8n4e8oyi/Z7d6lJLd6975hlPZmnynJeoU+nWM=","ipv6_addr_in":"2404:f780:0:dec::c2f","same_ip":true},{"hostname":"au-bne-wg-301","location":"au-bne","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.216.220.18","include_in_country":true,"weight":100,"public_key":"1H/gj8SVNebAIEGlvMeUVC5Rnf274dfVKbyE+v5G8HA=","ipv6_addr_in":"2404:f780:4:deb::f001","same_ip":true},{"hostname":"au-bne-wg-302","location":"au-bne","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.216.220.34","include_in_country":true,"weight":100,"public_key":"z+JG0QA4uNd/wRTpjCqn9rDpQsHKhf493omqQ5rqYAc=","ipv6_addr_in":"2404:f780:4:dec::a02f","same_ip":true},{"hostname":"au-mel-wg-301","location":"au-mel","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.108.229.50","include_in_country":true,"weight":100,"public_key":"jUMZWFOgoFGhZjBAavE6jW8VgnnNpL4KUiYFYjc1fl8=","ipv6_addr_in":"2406:d501:f:deb::a01f","same_ip":true},{"hostname":"au-mel-wg-302","location":"au-mel","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.108.229.66","include_in_country":true,"weight":100,"public_key":"npTb63jWEaJToBfn0B1iVNbnLXEwwlus5SsolsvUhgU=","ipv6_addr_in":"2406:d501:f:dec::a02f","same_ip":true},{"hostname":"au-per-wg-301","location":"au-per","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.108.231.50","include_in_country":true,"weight":100,"public_key":"hQXsNk/9R2We0pzP1S9J3oNErEu2CyENlwTdmDUYFhg=","ipv6_addr_in":"2404:f780:8:deb::a01f","same_ip":true},{"hostname":"au-per-wg-302","location":"au-per","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.108.231.66","include_in_country":true,"weight":100,"public_key":"t3Ly8bBdF2gMHzT3d529bVLDw8Jd2/FFG9GXoBEx01g=","ipv6_addr_in":"2404:f780:8:dec::f001","same_ip":true},{"hostname":"au-syd-wg-001","location":"au-syd","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.200.2","include_in_country":true,"weight":100,"public_key":"4JpfHBvthTFOhCK0f5HAbzLXAVcB97uAkuLx7E8kqW0=","ipv6_addr_in":"2001:ac8:84:5::f001","same_ip":true},{"hostname":"au-syd-wg-002","location":"au-syd","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.141.194","include_in_country":true,"weight":100,"public_key":"lUeDAOy+iAhZDuz5+6zh0Co8wZcs3ahdu2jfqQoDW3E=","ipv6_addr_in":"2001:ac8:84:6::2f","same_ip":true},{"hostname":"au-syd-wg-003","location":"au-syd","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.200.194","include_in_country":true,"weight":100,"public_key":"LXuRwa9JRTt2/UtldklKGlj/IVLORITqgET4II4DRkU=","ipv6_addr_in":"2001:ac8:84:4::3f","same_ip":true},{"hostname":"be-bru-wg-101","location":"be-bru","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"91.90.123.2","include_in_country":true,"weight":100,"public_key":"GE2WP6hmwVggSvGVWLgq2L10T3WM2VspnUptK5F4B0U=","ipv6_addr_in":"2001:ac8:27:88::a01f","same_ip":true},{"hostname":"be-bru-wg-102","location":"be-bru","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"194.110.115.34","include_in_country":true,"weight":100,"public_key":"IY+FKw487MEWqMGNyyrT4PnTrJxce8oiGNHT0zifam8=","ipv6_addr_in":"2001:ac8:27:89::a02f","same_ip":true},{"hostname":"be-bru-wg-103","location":"be-bru","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"194.110.115.2","include_in_country":true,"weight":100,"public_key":"b5A1ela+BVI+AbNXz7SWekZHvdWWpt3rqUKTJj0SqCU=","ipv6_addr_in":"2001:ac8:27:92::a03f","same_ip":true},{"hostname":"bg-sof-wg-001","location":"bg-sof","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.188.130","include_in_country":true,"weight":100,"public_key":"J8KysHmHZWqtrVKKOppneDXSks/PDsB1XTlRHpwiABA=","ipv6_addr_in":"2001:ac8:30:56::f001","same_ip":true},{"hostname":"bg-sof-wg-002","location":"bg-sof","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.188.194","include_in_country":true,"weight":100,"public_key":"dg+Fw7GnKvDPBxFpnj1KPoNIu1GakuVoDJjKRni+pRU=","ipv6_addr_in":"2001:ac8:30:57::f001","same_ip":true},{"hostname":"br-sao-wg-001","location":"br-sao","active":true,"owned":false,"provider":"Qnax","stboot":true,"ipv4_addr_in":"149.78.184.194","include_in_country":true,"weight":30,"public_key":"xUDPh13sY127m+7d05SOQAzzNCyufTjaGwCXkWsIjkw=","ipv6_addr_in":"2804:5364:7000:40::f001","same_ip":true},{"hostname":"br-sao-wg-201","location":"br-sao","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.198.66","include_in_country":true,"weight":100,"public_key":"8c9M6w1BQbgMVr/Zgrj4GwSdU6q3qfQfWs17kMLC9y4=","ipv6_addr_in":"2a02:6ea0:d00e:1::a01f","same_ip":true},{"hostname":"br-sao-wg-202","location":"br-sao","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.198.79","include_in_country":true,"weight":100,"public_key":"jWURoz8SLBUlRTQnAFTA/LDZUTpvlO0ghiVWH7MgaHQ=","ipv6_addr_in":"2a02:6ea0:d00e:2::a02f","same_ip":true},{"hostname":"ca-mtr-wg-001","location":"ca-mtr","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.198.66","include_in_country":true,"weight":100,"public_key":"TUCaQc26/R6AGpkDUr8A8ytUs/e5+UVlIVujbuBwlzI=","ipv6_addr_in":"2a0d:5600:9:c::f001","same_ip":true},{"hostname":"ca-mtr-wg-002","location":"ca-mtr","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.198.130","include_in_country":true,"weight":100,"public_key":"7X6zOgtJfJAK8w8C3z+hekcS9Yf3qK3Bp4yx56lqxBQ=","ipv6_addr_in":"2a0d:5600:9:d::f001","same_ip":true},{"hostname":"ca-mtr-wg-003","location":"ca-mtr","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.198.194","include_in_country":true,"weight":100,"public_key":"57Zu2qPzRScZWsoC2NhXgz0FiC0HiKkbEa559sbxB3k=","ipv6_addr_in":"2a0d:5600:9:e::a02f","same_ip":true},{"hostname":"ca-mtr-wg-004","location":"ca-mtr","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"188.241.176.194","include_in_country":true,"weight":100,"public_key":"Cc5swfQ9f2tAgLduuIqC3bLbwDVoOFkkETghsE6/twA=","ipv6_addr_in":"2a0d:5600:9:16::f001","same_ip":true},{"hostname":"ca-tor-wg-001","location":"ca-tor","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.214.2","include_in_country":true,"weight":100,"public_key":"HjcUGVDXWdrRkaKNpc/8494RM5eICO6DPyrhCtTv9Ws=","ipv6_addr_in":"2a02:6ea0:de08:1::f001","same_ip":true},{"hostname":"ca-tor-wg-002","location":"ca-tor","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.214.15","include_in_country":true,"weight":100,"public_key":"iqZSgVlU9H67x/uYE5xsnzLCDXf7FL9iMfyKfl6WsV8=","ipv6_addr_in":"2a02:6ea0:de08:2::a29f","same_ip":true},{"hostname":"ca-tor-wg-101","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.140.130","include_in_country":true,"weight":100,"public_key":"hfvZctxTQukC6lMJ4liGTg1JECT4XqEKpTNPk84k2As=","ipv6_addr_in":"2607:9000:6000:18::a01f","same_ip":true},{"hostname":"ca-tor-wg-102","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.132.98","include_in_country":true,"weight":100,"public_key":"iGwKJTbm/aL4kJXwcJkO0JYPEEGGDcYBrRTG7CHIQx0=","ipv6_addr_in":"2607:9000:6000:14::a02f","same_ip":true},{"hostname":"ca-tor-wg-103","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.132.226","include_in_country":true,"weight":100,"public_key":"MbusadbeACMR5bv+PPjhldb5CgwjlCbthnTJNrOJnhI=","ipv6_addr_in":"2607:9000:6000:17::a03f","same_ip":true},{"hostname":"ca-tor-wg-104","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.132.130","include_in_country":true,"weight":100,"public_key":"y9JT2B69QiWkbEAiXGq5yhtAvg8YNXNkjhHcUiBCiko=","ipv6_addr_in":"2607:9000:6000:15::a04f","same_ip":true},{"hostname":"ca-tor-wg-105","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.140.162","include_in_country":true,"weight":100,"public_key":"XE+hufytSkX14TjskwmYL4HL4mbPf+Vd5Jfgwf/5JHc=","ipv6_addr_in":"2607:9000:6000:19::a05f","same_ip":true},{"hostname":"ca-tor-wg-106","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.132.162","include_in_country":true,"weight":100,"public_key":"ptnLZbreIzTZrSyPD0XhOAAmN194hcPSG5TI5TTiL08=","ipv6_addr_in":"2607:9000:6000:16::a26f","same_ip":true},{"hostname":"ca-tor-wg-107","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.140.194","include_in_country":true,"weight":100,"public_key":"jVgDxCstCo0NRZ/dB9fpQiu+dfYK2v3HOa4B6MkLaQA=","ipv6_addr_in":"2607:9000:6000:20::a07f","same_ip":true},{"hostname":"ca-van-wg-201","location":"ca-van","active":true,"owned":false,"provider":"techfutures","stboot":true,"ipv4_addr_in":"104.193.135.196","include_in_country":true,"weight":100,"public_key":"hYbb2NQKB0g2RefngdHl3bfaLImUuzeVIv2i1VCVIlQ=","ipv6_addr_in":"2606:9580:103:e::f001","same_ip":true},{"hostname":"ca-van-wg-202","location":"ca-van","active":true,"owned":false,"provider":"techfutures","stboot":true,"ipv4_addr_in":"104.193.135.100","include_in_country":true,"weight":100,"public_key":"wGqcNxXH7A3bSptHZo7Dfmymy/Y30Ea/Zd47UkyEbzo=","ipv6_addr_in":"2606:9580:103:f::f001","same_ip":true},{"hostname":"ca-yyc-wg-201","location":"ca-yyc","active":true,"owned":false,"provider":"techfutures","stboot":true,"ipv4_addr_in":"38.240.225.36","include_in_country":true,"weight":100,"public_key":"L4RcVwk0cJJp2u8O9+86sdyUpxfYnr+ME57Ex0RY1Wo=","ipv6_addr_in":"2606:9580:438:32::b01f","same_ip":true},{"hostname":"ca-yyc-wg-202","location":"ca-yyc","active":true,"owned":false,"provider":"techfutures","stboot":true,"ipv4_addr_in":"38.240.225.68","include_in_country":true,"weight":100,"public_key":"u9J/fzrSqM2aEFjTs91KEKgBsaQ/I/4XkIP1Z/zYkXA=","ipv6_addr_in":"2606:9580:438:64::b02f","same_ip":true},{"hostname":"ch-zrh-wg-001","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.66","include_in_country":true,"weight":1,"public_key":"/iivwlyqWqxQ0BVWmJRhcXIFdJeo0WbHQ/hZwuXaN3g=","ipv6_addr_in":"2a03:1b20:a:f011::f001","same_ip":true},{"hostname":"ch-zrh-wg-002","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.67","include_in_country":true,"weight":1,"public_key":"qcvI02LwBnTb7aFrOyZSWvg4kb7zNW9/+rS6alnWyFE=","ipv6_addr_in":"2a03:1b20:a:f011::f101","same_ip":true},{"hostname":"ch-zrh-wg-003","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.68","include_in_country":true,"weight":1,"public_key":"5Ms10UxGjCSzwImTrvEjcygsWY8AfMIdYyRvgFuTqH8=","ipv6_addr_in":"2a03:1b20:a:f011::f201","same_ip":true},{"hostname":"ch-zrh-wg-004","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.69","include_in_country":true,"weight":1,"public_key":"C3jAgPirUZG6sNYe4VuAgDEYunENUyG34X42y+SBngQ=","ipv6_addr_in":"2a03:1b20:a:f011::f301","same_ip":true},{"hostname":"ch-zrh-wg-005","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.70","include_in_country":true,"weight":1,"public_key":"dV/aHhwG0fmp0XuvSvrdWjCtdyhPDDFiE/nuv/1xnRM=","ipv6_addr_in":"2a03:1b20:a:f011::f401","same_ip":true},{"hostname":"ch-zrh-wg-201","location":"ch-zrh","active":true,"owned":false,"provider":"PrivateLayer","stboot":true,"ipv4_addr_in":"179.43.189.66","include_in_country":true,"weight":100,"public_key":"66NPINP4+1AlojLP0J6O9GxdloiegNnGMV4Yit9Kzg0=","ipv6_addr_in":"2a02:29b8:dc01:1832::a1f","same_ip":true},{"hostname":"ch-zrh-wg-202","location":"ch-zrh","active":true,"owned":false,"provider":"PrivateLayer","stboot":true,"ipv4_addr_in":"46.19.136.226","include_in_country":true,"weight":100,"public_key":"gSLSfY2zNFRczxHndeda258z+ayMvd7DqTlKYlKWJUo=","ipv6_addr_in":"2a02:29b8:dc01:1831::f002","same_ip":true},{"hostname":"ch-zrh-wg-401","location":"ch-zrh","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.6.194","include_in_country":true,"weight":80,"public_key":"45ud3I5O6GmPXTrMJiqkiPMI/ubucDqzGaiq3CHJXk8=","ipv6_addr_in":"2a02:6ea0:d406:1::a18f","same_ip":true},{"hostname":"ch-zrh-wg-402","location":"ch-zrh","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.6.207","include_in_country":true,"weight":80,"public_key":"7VCMEE+Oljm/qKfQJSUCOYPtRSwdOnuPyqo5Vob+GRY=","ipv6_addr_in":"2a02:6ea0:d406:2::a19f","same_ip":true},{"hostname":"ch-zrh-wg-403","location":"ch-zrh","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.6.220","include_in_country":true,"weight":80,"public_key":"Jmhds6oPu6/j94hjllJCIaKLDyWu6V+ZNRrVVFhWJkI=","ipv6_addr_in":"2a02:6ea0:d406:3::a20f","same_ip":true},{"hostname":"ch-zrh-wg-404","location":"ch-zrh","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.6.233","include_in_country":true,"weight":80,"public_key":"zfNQqDyPmSUY8+20wxACe/wpk4Q5jpZm5iBqjXj2hk8=","ipv6_addr_in":"2a02:6ea0:d406:4::a21f","same_ip":true},{"hostname":"ch-zrh-wg-501","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.134.98","include_in_country":true,"weight":100,"public_key":"HQzvIK88XSsRujBlwoYvvZ7CMKwiYuOqLXyuckkTPHg=","ipv6_addr_in":"2001:ac8:28:a7::a36f","same_ip":true},{"hostname":"ch-zrh-wg-502","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.126.162","include_in_country":true,"weight":100,"public_key":"TOA/MQWS6TzJVEa//GPyaET5d52VpHO2isS4786GGwU=","ipv6_addr_in":"2001:ac8:28:a1::f001","same_ip":true},{"hostname":"ch-zrh-wg-503","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.126.194","include_in_country":true,"weight":100,"public_key":"ApOUMLFcpTpj/sDAMub0SvASFdsSWtsy+vvw/nWvEmY=","ipv6_addr_in":"2001:ac8:28:a2::f001","same_ip":true},{"hostname":"ch-zrh-wg-504","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.126.226","include_in_country":true,"weight":100,"public_key":"I5XiRYHPmxnmGtPJ90Yio6QXL441C/+kYV6UH6wU+jk=","ipv6_addr_in":"2001:ac8:28:a3::f001","same_ip":true},{"hostname":"ch-zrh-wg-505","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.134.2","include_in_country":true,"weight":100,"public_key":"dc16Gcid7jLcHRD7uHma1myX3vWhEy/bZIBtqZw0B2I=","ipv6_addr_in":"2001:ac8:28:a4::a33f","same_ip":true},{"hostname":"ch-zrh-wg-506","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.134.34","include_in_country":true,"weight":100,"public_key":"7xVJLzW0nfmACr1VMc+/SiSMFh0j0EI3DrU/8Fnj1zM=","ipv6_addr_in":"2001:ac8:28:a5::a34f","same_ip":true},{"hostname":"ch-zrh-wg-507","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.134.66","include_in_country":true,"weight":100,"public_key":"RNTpvmWTyjNf8w9qdP+5XlFnyAk5TrVvT+CRa8a0zys=","ipv6_addr_in":"2001:ac8:28:a6::a35f","same_ip":true},{"hostname":"co-bog-wg-001","location":"co-bog","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"154.47.16.34","include_in_country":true,"weight":100,"public_key":"iaMa84nCHK+v4TnQH4h2rxkqwwxemORXM12VbJDRZSU=","ipv6_addr_in":"2a02:6ea0:f101:1::f001","same_ip":true},{"hostname":"co-bog-wg-002","location":"co-bog","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"154.47.16.47","include_in_country":true,"weight":100,"public_key":"IZDwbG9C/NrOOGVUrn+fDaPr8ZwD/yhvST7XWGk1ln8=","ipv6_addr_in":"2a02:6ea0:f101:2::f001","same_ip":true},{"hostname":"cz-prg-wg-101","location":"cz-prg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.129.98","include_in_country":true,"weight":100,"public_key":"wLBxTaISMJ++vUht4hlAOUog9fhZxDql16TaYWaboDc=","ipv6_addr_in":"2001:ac8:33:c::a01f","same_ip":true},{"hostname":"cz-prg-wg-102","location":"cz-prg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.129.130","include_in_country":true,"weight":100,"public_key":"cRCJ0vULwKRbTfzuo9W+fIt0fJGQE7DLvojIiURIpiI=","ipv6_addr_in":"2001:ac8:33:d::a02f","same_ip":true},{"hostname":"cz-prg-wg-201","location":"cz-prg","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.209.162","include_in_country":true,"weight":100,"public_key":"5FZW+fNA2iVBSY99HFl+KjGc9AFVNE+UFAedLNhu8lc=","ipv6_addr_in":"2a02:6ea0:c201:1::f001","same_ip":true},{"hostname":"cz-prg-wg-202","location":"cz-prg","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.209.175","include_in_country":true,"weight":100,"public_key":"ReGrGPKDHri64D7qeXmgcLzjsTJ0B/yM7eekFz1P/34=","ipv6_addr_in":"2a02:6ea0:c201:1::f101","same_ip":true},{"hostname":"de-ber-wg-001","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.66","include_in_country":true,"weight":100,"public_key":"0qSP0VxoIhEhRK+fAHVvmfRdjPs2DmmpOCNLFP/7cGw=","ipv6_addr_in":"2a03:1b20:b:f011::a01f","same_ip":true},{"hostname":"de-ber-wg-002","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.67","include_in_country":true,"weight":100,"public_key":"8ov1Ws0ut3ixWDh9Chp7/WLVn9qC6/WVHtcBcuWBlgo=","ipv6_addr_in":"2a03:1b20:b:f011::a02f","same_ip":true},{"hostname":"de-ber-wg-003","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.68","include_in_country":true,"weight":100,"public_key":"USrMatdHiCL5AKdVMpHuYgWuMiK/GHPwRB3Xx00FhU0=","ipv6_addr_in":"2a03:1b20:b:f011::a03f","same_ip":true},{"hostname":"de-ber-wg-004","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.69","include_in_country":true,"weight":100,"public_key":"6PchzRRxzeeHdNLyn3Nz0gmN7pUyjoZMpKmKzJRL4GM=","ipv6_addr_in":"2a03:1b20:b:f011::a04f","same_ip":true},{"hostname":"de-ber-wg-005","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.70","include_in_country":true,"weight":100,"public_key":"I4Y7e8LrtBC/7DLpUgRd5k+IZk+whOFVAZgbSivoiBI=","ipv6_addr_in":"2a03:1b20:b:f011::a05f","same_ip":true},{"hostname":"de-ber-wg-006","location":"de-ber","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.248.71","include_in_country":true,"weight":100,"public_key":"eprzkkkSbXCANngQDo305DIAvkKAnZaN71IpTNaOoTk=","ipv6_addr_in":"2a03:1b20:b:f011::a06f","same_ip":true},{"hostname":"de-dus-wg-001","location":"de-dus","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"185.254.75.3","include_in_country":true,"weight":300,"public_key":"ku1NYeOAGbY65YL/JKZhrqVzDJKXQiVj9USXbfkOBA0=","ipv6_addr_in":"2a03:d9c0:3000::a20f","same_ip":true},{"hostname":"de-dus-wg-002","location":"de-dus","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"185.254.75.4","include_in_country":true,"weight":300,"public_key":"TPAIPTgu9jIitgX1Bz5xMCZJ9pRRZTdtZEOIxArO0Hc=","ipv6_addr_in":"2a03:d9c0:3000::a21f","same_ip":true},{"hostname":"de-dus-wg-003","location":"de-dus","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"185.254.75.5","include_in_country":true,"weight":300,"public_key":"XgSe9UwEV4JJNPPzFFOVYS6scMTL4DeNlwqBl32lDw0=","ipv6_addr_in":"2a03:d9c0:3000::a22f","same_ip":true},{"hostname":"de-fra-wg-001","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.73","include_in_country":true,"weight":100,"public_key":"HQHCrq4J6bSpdW1fI5hR/bvcrYa6HgGgwaa5ZY749ik=","ipv6_addr_in":"2a03:1b20:6:f011::f001","same_ip":true},{"hostname":"de-fra-wg-002","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.74","include_in_country":true,"weight":100,"public_key":"s1c/NsfnqnwQSxao70DY4Co69AFT9e0h88IFuMD5mjs=","ipv6_addr_in":"2a03:1b20:6:f011::f101","same_ip":true},{"hostname":"de-fra-wg-003","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.209.196.73","include_in_country":true,"weight":100,"public_key":"vVQKs2TeTbdAvl3sH16UWLSESncXAj0oBaNuFIUkLVk=","ipv6_addr_in":"2a03:1b20:6:f011::f201","same_ip":true},{"hostname":"de-fra-wg-004","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.209.196.74","include_in_country":true,"weight":100,"public_key":"tzYLWgBdwrbbBCXYHRSoYIho4dHtrm+8bdONU1I8xzc=","ipv6_addr_in":"2a03:1b20:6:f011::f301","same_ip":true},{"hostname":"de-fra-wg-005","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.209.196.75","include_in_country":true,"weight":100,"public_key":"tpobOO6t18CzHjOg0S3RlZJMxd2tz4+BnRYS7NrjTnM=","ipv6_addr_in":"2a03:1b20:6:f011::f401","same_ip":true},{"hostname":"de-fra-wg-006","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.209.196.76","include_in_country":true,"weight":100,"public_key":"nAF0wrLG2+avwQfqxnXhBGPUBCvc3QCqWKH4nK5PfEU=","ipv6_addr_in":"2a03:1b20:6:f011::f501","same_ip":true},{"hostname":"de-fra-wg-007","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.209.196.77","include_in_country":true,"weight":100,"public_key":"mTmrSuXmTnIC9l2Ur3/QgodGrVEhhIE3pRwOHZpiYys=","ipv6_addr_in":"2a03:1b20:6:f011::f601","same_ip":true},{"hostname":"de-fra-wg-008","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.209.196.78","include_in_country":true,"weight":100,"public_key":"TOS3U/dJPzPnk/qsAx6gHxRVIC2wI5l+tAWaJY2mXzY=","ipv6_addr_in":"2a03:1b20:6:f011::f701","same_ip":true},{"hostname":"de-fra-wg-101","location":"de-fra","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.117.162","include_in_country":true,"weight":100,"public_key":"Voioje9Gfb7aTiK2/H6VyHFK1AFap1glIX0Z1EX2mRQ=","ipv6_addr_in":"2001:ac8:20:274::a99f","same_ip":true},{"hostname":"de-fra-wg-102","location":"de-fra","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.117.194","include_in_country":true,"weight":100,"public_key":"ydXFN45/kROELJrF6id+uIrnS5DvTKSCkZDjfL9De2Q=","ipv6_addr_in":"2001:ac8:20:275::f001","same_ip":true},{"hostname":"de-fra-wg-103","location":"de-fra","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.117.226","include_in_country":true,"weight":100,"public_key":"KkShcqgwbkX2A9n1hhST6qu+m3ldxdJ2Lx8Eiw6mdXw=","ipv6_addr_in":"2001:ac8:20:276::f001","same_ip":true},{"hostname":"de-fra-wg-104","location":"de-fra","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.107.194","include_in_country":true,"weight":100,"public_key":"uKTC5oP/zfn6SSjayiXDDR9L82X0tGYJd5LVn5kzyCc=","ipv6_addr_in":"2001:ac8:20:277::f001","same_ip":true},{"hostname":"de-fra-wg-105","location":"de-fra","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.117.2","include_in_country":true,"weight":100,"public_key":"Sttn2cr14dvIcCrE8qdlRGHXriqvTyvQWC7dzujH/iM=","ipv6_addr_in":"2001:ac8:20:269::f001","same_ip":true},{"hostname":"de-fra-wg-106","location":"de-fra","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.117.34","include_in_country":true,"weight":100,"public_key":"9ldhvN7r4xGZkGehbsNfYb5tpyTJ5KBb5B3TbxCwklw=","ipv6_addr_in":"2001:ac8:20:270::f001","same_ip":true},{"hostname":"de-fra-wg-301","location":"de-fra","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"194.36.25.3","include_in_country":true,"weight":300,"public_key":"dNKRyh2MkJGZdg9jyUJtf9w5GHjX3+/fYatg+xi9TUM=","ipv6_addr_in":"2a07:fe00:1::a23f","same_ip":true},{"hostname":"de-fra-wg-302","location":"de-fra","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"194.36.25.18","include_in_country":true,"weight":300,"public_key":"A3DbIgPycEJhJ1fQ4zzcajLOKTZsJMeawjdPQiWav20=","ipv6_addr_in":"2a07:fe00:1::a24f","same_ip":true},{"hostname":"de-fra-wg-303","location":"de-fra","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"194.36.25.33","include_in_country":true,"weight":300,"public_key":"2P+9SjwVCEnMDnBiYfZtQLq9p2S2TFhCM0xJBoevYk4=","ipv6_addr_in":"2a07:fe00:1::a25f","same_ip":true},{"hostname":"de-fra-wg-304","location":"de-fra","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"194.36.25.48","include_in_country":true,"weight":300,"public_key":"VgNcwWy8MRhfEZY+XSisDM1ykX+uXlHQScOLqqGMLkc=","ipv6_addr_in":"2a07:fe00:1::a26f","same_ip":true},{"hostname":"de-fra-wg-401","location":"de-fra","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.201.2","include_in_country":true,"weight":300,"public_key":"AbM8fnQWmmX6Nv0Tz68LigPbGkamJgNjxgzPfENOdXU=","ipv6_addr_in":"2a02:6ea0:c762:1::a35f","same_ip":true},{"hostname":"de-fra-wg-402","location":"de-fra","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.201.15","include_in_country":true,"weight":300,"public_key":"6/PBbPtoeWpJA+HZc9Iqg/PPQWD7mGVvZdwQlr1vtRk=","ipv6_addr_in":"2a02:6ea0:c762:2::a36f","same_ip":true},{"hostname":"de-fra-wg-403","location":"de-fra","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.201.28","include_in_country":true,"weight":300,"public_key":"HWzSNMbQOQafkVp68B7aLRirhNJ6x5Wjw8/y7oUuHW0=","ipv6_addr_in":"2a02:6ea0:c762:3::a37f","same_ip":true},{"hostname":"dk-cph-wg-001","location":"dk-cph","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"45.129.56.67","include_in_country":true,"weight":100,"public_key":"egl+0TkpFU39F5O6r6+hIBMPQLOa8/t5CymOZV6CC3Y=","ipv6_addr_in":"2a03:1b20:8:f011::f001","same_ip":true},{"hostname":"dk-cph-wg-002","location":"dk-cph","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"45.129.56.68","include_in_country":true,"weight":100,"public_key":"R5LUBgM/1UjeAR4lt+L/yA30Gee6/VqVZ9eAB3ZTajs=","ipv6_addr_in":"2a03:1b20:8:f011::f101","same_ip":true},{"hostname":"dk-cph-wg-401","location":"dk-cph","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.197.194","include_in_country":true,"weight":100,"public_key":"Jjml2TSqKlgzW6UzPiJszaun743QYpyl5jQk8UOQYg0=","ipv6_addr_in":"2001:ac8:37:97::f001","same_ip":true},{"hostname":"dk-cph-wg-402","location":"dk-cph","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.197.130","include_in_country":true,"weight":100,"public_key":"ML0NcFPqy+x+ZJg7y9vfh77hXAOtgueIqp1j+CJVrXM=","ipv6_addr_in":"2001:ac8:37:96::f001","same_ip":true},{"hostname":"ee-tll-wg-001","location":"ee-tll","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"194.127.167.67","include_in_country":true,"weight":100,"public_key":"bdq37KtfoG1Tm7yQcfitdRyGeZOn/c7PwLN+LgG/6nA=","ipv6_addr_in":"2a07:d880:2::a01f","same_ip":true},{"hostname":"ee-tll-wg-002","location":"ee-tll","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"194.127.167.87","include_in_country":true,"weight":100,"public_key":"vqGmmcERr/PAKDzy6Dxax8g4150rC93kmKYabZuAzws=","ipv6_addr_in":"2a07:d880:2::a02f","same_ip":true},{"hostname":"ee-tll-wg-003","location":"ee-tll","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"194.127.167.107","include_in_country":true,"weight":100,"public_key":"+8dUgpD7YA4wMPnRQkO7EI7AeYd30QPMKh/hOaaGIXY=","ipv6_addr_in":"2a07:d880:2::a03f","same_ip":true},{"hostname":"es-mad-wg-101","location":"es-mad","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.213.194","include_in_country":true,"weight":50,"public_key":"oPpPeyiQhUYqtOxwR387dmFfII8OK5LX2RPyns1rx2U=","ipv6_addr_in":"2a02:6ea0:c318:1::a06f","same_ip":true},{"hostname":"es-mad-wg-102","location":"es-mad","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.213.207","include_in_country":true,"weight":50,"public_key":"1Wo/cQeVHX2q9k95nxN+48lgkGLsPQ+uesRb/9XdY1Y=","ipv6_addr_in":"2a02:6ea0:c318:2::a07f","same_ip":true},{"hostname":"es-mad-wg-201","location":"es-mad","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.128.194","include_in_country":true,"weight":100,"public_key":"LyO4Xs1eV8JwFr63a1FRnKboQn2Tu/oeMzHhbr7Y6GU=","ipv6_addr_in":"2001:ac8:23:85::a01f","same_ip":true},{"hostname":"es-mad-wg-202","location":"es-mad","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.128.226","include_in_country":true,"weight":100,"public_key":"iehXacO91FbBqni2IFxedEYPlW2Wvvt9GtRPPPMo9zc=","ipv6_addr_in":"2001:ac8:23:86::a02f","same_ip":true},{"hostname":"fi-hel-wg-001","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.203","include_in_country":true,"weight":100,"public_key":"veLqpZazR9j/Ol2G8TfrO32yEhc1i543MCN8rpy1FBA=","ipv6_addr_in":"2a0c:f040:0:2790::a01f","same_ip":true},{"hostname":"fi-hel-wg-002","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.211","include_in_country":true,"weight":100,"public_key":"8BbP3GS01dGkN5ENk1Rgedxfd80friyVOABrdMgD3EY=","ipv6_addr_in":"2a0c:f040:0:2790::a02f","same_ip":true},{"hostname":"fi-hel-wg-003","location":"fi-hel","active":true,"owned":true,"provider":"Creanova","stboot":true,"ipv4_addr_in":"185.204.1.219","include_in_country":true,"weight":100,"public_key":"FKodo9V6BehkNphL+neI0g4/G/cjbZyYhoptSWf3Si4=","ipv6_addr_in":"2a0c:f040:0:2790::a03f","same_ip":true},{"hostname":"fi-hel-wg-101","location":"fi-hel","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"193.138.7.137","include_in_country":true,"weight":100,"public_key":"2S3G7Sm9DVG6+uJtlDu4N6ed5V97sTbA5dCSkUelWyk=","ipv6_addr_in":"2a02:ed04:3581:1::f001","same_ip":true},{"hostname":"fi-hel-wg-102","location":"fi-hel","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"193.138.7.157","include_in_country":true,"weight":100,"public_key":"xeHVhXxyyFqUEE+nsu5Tzd/t9en+++4fVFcSFngpcAU=","ipv6_addr_in":"2a02:ed04:3581:2::f001","same_ip":true},{"hostname":"fi-hel-wg-103","location":"fi-hel","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"193.138.7.177","include_in_country":true,"weight":100,"public_key":"Mlvu14bSD6jb7ajH/CiJ/IO8W+spB8H6VmdGkFGOcUQ=","ipv6_addr_in":"2a02:ed04:3581:3::f001","same_ip":true},{"hostname":"fi-hel-wg-104","location":"fi-hel","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"193.138.7.197","include_in_country":true,"weight":100,"public_key":"keRQGHUbYP2qgDTbYqOsI9byfNb0LOpTZ/KdC67cJiA=","ipv6_addr_in":"2a02:ed04:3581:4::f001","same_ip":true},{"hostname":"fr-mrs-wg-001","location":"fr-mrs","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.15.162","include_in_country":true,"weight":300,"public_key":"MOk2OTDEaFFN4vsCAgf+qQi6IlY99nCeDEzpXyo65wg=","ipv6_addr_in":"2a02:6ea0:dc05::a15f","same_ip":true},{"hostname":"fr-mrs-wg-002","location":"fr-mrs","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.15.146","include_in_country":true,"weight":300,"public_key":"Z0LEgZIPhNj0+/VWknU3roHlVI3qqAfoV6th9NSC0F0=","ipv6_addr_in":"2a02:6ea0:dc06::a16f","same_ip":true},{"hostname":"fr-par-wg-001","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.66","include_in_country":true,"weight":100,"public_key":"ov323GyDOEHLT0sNRUUPYiE3BkvFDjpmi1a4fzv49hE=","ipv6_addr_in":"2a03:1b20:9:f011::a01f","same_ip":true},{"hostname":"fr-par-wg-002","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.67","include_in_country":true,"weight":100,"public_key":"R5Ve+PJD24QjNXi2Dim7szwCiOLnv+6hg+WyTudAYmE=","ipv6_addr_in":"2a03:1b20:9:f011::f101","same_ip":true},{"hostname":"fr-par-wg-003","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.68","include_in_country":true,"weight":100,"public_key":"w4r/o6VImF7l0/De3JpOGnpzjAFv9wcCu8Rop5eZkWc=","ipv6_addr_in":"2a03:1b20:9:f011::f201","same_ip":true},{"hostname":"fr-par-wg-004","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.69","include_in_country":true,"weight":100,"public_key":"E/KjR7nlFouuRXh1pwGDr7iK2TAZ6c4K0LjjmA1A2Tc=","ipv6_addr_in":"2a03:1b20:9:f011::f301","same_ip":true},{"hostname":"fr-par-wg-005","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.70","include_in_country":true,"weight":100,"public_key":"cmqtSjWUa4/0bENQDKxdr0vQqf4nFVDodarHm0Pc0hY=","ipv6_addr_in":"2a03:1b20:9:f011::f401","same_ip":true},{"hostname":"fr-par-wg-101","location":"fr-par","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.184.2","include_in_country":true,"weight":100,"public_key":"e2uj1eu/ZuTPqfY+9ULa6KFPRGLkSWCaooXBg9u9igA=","ipv6_addr_in":"2001:ac8:25:3a::f001","same_ip":true},{"hostname":"fr-par-wg-102","location":"fr-par","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.184.66","include_in_country":true,"weight":100,"public_key":"TR0Gedkbp2mRRXKZ7VB7qaAvJHuQlwaaLFc4fxb4q2M=","ipv6_addr_in":"2001:ac8:25:3b::f001","same_ip":true},{"hostname":"gb-lon-wg-001","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.252.130","include_in_country":true,"weight":100,"public_key":"IJJe0TQtuQOyemL4IZn6oHEsMKSPqOuLfD5HoAWEPTY=","ipv6_addr_in":"2a03:1b20:7:f011::a01f","same_ip":true},{"hostname":"gb-lon-wg-002","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.252.222","include_in_country":true,"weight":100,"public_key":"J57ba81Q8bigy9RXBXvl0DgABTrbl81nb37GuX50gnY=","ipv6_addr_in":"2a03:1b20:7:f011::a02f","same_ip":true},{"hostname":"gb-lon-wg-003","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.232.66","include_in_country":true,"weight":100,"public_key":"VZwE8hrpNzg6SMwn9LtEqonXzSWd5dkFk62PrNWFW3Y=","ipv6_addr_in":"2a03:1b20:7:f011::a11f","same_ip":true},{"hostname":"gb-lon-wg-004","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.232.67","include_in_country":true,"weight":100,"public_key":"PLpO9ikFX1garSFaeUpo7XVSMrILrTB8D9ZwQt6Zgwk=","ipv6_addr_in":"2a03:1b20:7:f011::a12f","same_ip":true},{"hostname":"gb-lon-wg-005","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.232.68","include_in_country":true,"weight":100,"public_key":"bG6WulLmMK408n719B8nQJNuTRyRA3Qjm7bsm9d6v2M=","ipv6_addr_in":"2a03:1b20:7:f011::a13f","same_ip":true},{"hostname":"gb-lon-wg-006","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.232.69","include_in_country":true,"weight":100,"public_key":"INRhM0h4T1hi9j28pcC+vRv47bp7DIsNKtagaFZFSBI=","ipv6_addr_in":"2a03:1b20:7:f011::a14f","same_ip":true},{"hostname":"gb-lon-wg-007","location":"gb-lon","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.232.70","include_in_country":true,"weight":100,"public_key":"MVqe9e9aDwfFuvEhEn4Wd/zWV3cmiCX9fZMWetz+23A=","ipv6_addr_in":"2a03:1b20:7:f011::a15f","same_ip":true},{"hostname":"gb-lon-wg-201","location":"gb-lon","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"185.248.85.3","include_in_country":true,"weight":50,"public_key":"b71Y8V/vVwNRGkL4d1zvApDVL18u7m31dN+x+i5OJVs=","ipv6_addr_in":"2a0b:89c1:3::a33f","same_ip":true},{"hostname":"gb-lon-wg-202","location":"gb-lon","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"185.248.85.18","include_in_country":true,"weight":50,"public_key":"+iQWuT3wb2DCy1u2eUKovhJTCB4aUdJUnpxGtONDIVE=","ipv6_addr_in":"2a0b:89c1:3::a34f","same_ip":true},{"hostname":"gb-lon-wg-203","location":"gb-lon","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"185.248.85.33","include_in_country":true,"weight":50,"public_key":"G7XDQqevQOw1SVL7Iarn9PM+RvmI6H/CfkmahBYEG0g=","ipv6_addr_in":"2a0b:89c1:3::a35f","same_ip":true},{"hostname":"gb-lon-wg-204","location":"gb-lon","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"185.248.85.48","include_in_country":true,"weight":50,"public_key":"tJVHqpfkV2Xgmd4YK60aoErSt6PmJKJjkggHNDfWwiU=","ipv6_addr_in":"2a0b:89c1:3::a36f","same_ip":true},{"hostname":"gb-lon-wg-301","location":"gb-lon","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.119.66","include_in_country":false,"weight":1,"public_key":"Gn9WbiHw83r8BI+v/Usx3mSR+TpMAWLFFz0r9Lfy7XQ=","ipv6_addr_in":"2001:ac8:31:f007::a39f","same_ip":true},{"hostname":"gb-lon-wg-302","location":"gb-lon","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.119.2","include_in_country":false,"weight":1,"public_key":"s0i/bDeQ3xfMsLSrg6bILWunyytJNHVgIJlfflA8jFI=","ipv6_addr_in":"2001:ac8:31:f005::a37f","same_ip":true},{"hostname":"gb-lon-wg-303","location":"gb-lon","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.119.34","include_in_country":false,"weight":1,"public_key":"ZcDVPTugbxo0rTvDKNnexzJ2qNrh3c/wFRtM2Pfl6jM=","ipv6_addr_in":"2001:ac8:31:f006::a38f","same_ip":true},{"hostname":"gb-mnc-wg-001","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.133.98","include_in_country":true,"weight":100,"public_key":"Q2khJLbTSFxmppPGHgq2HdxMQx7CczPZCgVpYZMoNnM=","ipv6_addr_in":"2001:ac8:8b:2d::a47f","same_ip":true},{"hostname":"gb-mnc-wg-002","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.132.130","include_in_country":true,"weight":100,"public_key":"SkERuKByX8fynFxSFAJVjUFJAeu9b/dfW2FynTM7XAk=","ipv6_addr_in":"2001:ac8:8b:26::f001","same_ip":true},{"hostname":"gb-mnc-wg-003","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.132.162","include_in_country":true,"weight":100,"public_key":"c+RjxBk+wZCv0s4jffQesHdInakRVR3oV0IhpVo0WRY=","ipv6_addr_in":"2001:ac8:8b:27::f001","same_ip":true},{"hostname":"gb-mnc-wg-004","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.132.194","include_in_country":true,"weight":100,"public_key":"DiMqK85O8U1T65HdVgOGh9uI63I3by9Dt6Shik2xbyM=","ipv6_addr_in":"2001:ac8:8b:28::f001","same_ip":true},{"hostname":"gb-mnc-wg-005","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.132.226","include_in_country":true,"weight":100,"public_key":"kbVlSaqHQSpnewQn1X0j5R+WKiSW2e2Gq+I4XZj3Bjk=","ipv6_addr_in":"2001:ac8:8b:29::f001","same_ip":true},{"hostname":"gb-mnc-wg-006","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.133.2","include_in_country":true,"weight":100,"public_key":"zKOZzAitVBxfdxtXgGIyk7zmTtoHrVts7RQGrtsRIxo=","ipv6_addr_in":"2001:ac8:8b:2a::f001","same_ip":true},{"hostname":"gb-mnc-wg-007","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.133.34","include_in_country":true,"weight":100,"public_key":"ANaRAtjxqpPgp7r9VjTDfnBMis+MzSgCXc7TZMa0Vno=","ipv6_addr_in":"2001:ac8:8b:2b::f001","same_ip":true},{"hostname":"gb-mnc-wg-008","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.133.66","include_in_country":true,"weight":100,"public_key":"2bciRobW0TPtjrZ2teilr+7PjyiBMUGfixvAKOE52Xo=","ipv6_addr_in":"2001:ac8:8b:2c::f001","same_ip":true},{"hostname":"gr-ath-wg-101","location":"gr-ath","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.102.246.2","include_in_country":true,"weight":100,"public_key":"li+thkAD7s6IZDgUoiKw4YSjM/U1q203PuthMzIJIU0=","ipv6_addr_in":"2a02:6ea0:f501:2::f001","same_ip":true},{"hostname":"gr-ath-wg-102","location":"gr-ath","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.102.246.15","include_in_country":true,"weight":100,"public_key":"OL0gbjlNt1s26CDQjRP9wgMZbgYff7/xyUI8ypOn01s=","ipv6_addr_in":"2a02:6ea0:f501:3::f001","same_ip":true},{"hostname":"hk-hkg-wg-201","location":"hk-hkg","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"103.125.233.18","include_in_country":true,"weight":100,"public_key":"Oxh13dmwY6nNUa5rVHr7sLiFOj0fjzsaAUAUV87/nGs=","ipv6_addr_in":"2403:2c81:1000::a06f","same_ip":true},{"hostname":"hk-hkg-wg-202","location":"hk-hkg","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"103.125.233.3","include_in_country":true,"weight":100,"public_key":"zmhMPHfkgo+uQxP+l919Gw7cj5NTatg9nMU37eEUWis=","ipv6_addr_in":"2403:2c81:1000::a05f","same_ip":true},{"hostname":"hk-hkg-wg-301","location":"hk-hkg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.224.2","include_in_country":true,"weight":100,"public_key":"qbvU06SBHXnqMnpb49rnE0yC4AOWQcWl2bEScu18dh8=","ipv6_addr_in":"2001:ac8:a:f::f001","same_ip":true},{"hostname":"hk-hkg-wg-302","location":"hk-hkg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.224.66","include_in_country":true,"weight":100,"public_key":"7FADgmd9KyAVs3eFJE/ob9tV3E6m/klONEEIOfCoPTU=","ipv6_addr_in":"2001:ac8:a:19::f001","same_ip":true},{"hostname":"hr-zag-wg-001","location":"hr-zag","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"154.47.29.2","include_in_country":true,"weight":100,"public_key":"PJvsgLogdAgZiVSxwTDyk9ri02mLZGuElklHShIjDGM=","ipv6_addr_in":"2a02:6ea0:f401:1::a01f","same_ip":true},{"hostname":"hr-zag-wg-002","location":"hr-zag","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"154.47.29.15","include_in_country":true,"weight":100,"public_key":"V0iDOyLSj870sjGGenDvAWqJudlPKDc212cQN85snEo=","ipv6_addr_in":"2a02:6ea0:f401:2::a01f","same_ip":true},{"hostname":"hu-bud-wg-101","location":"hu-bud","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.196.194","include_in_country":true,"weight":100,"public_key":"u+h0GmQJ8UBaMTi2BP9Ls6UUszcGC51y6vTmNr/y+AU=","ipv6_addr_in":"2001:ac8:26:55::f001","same_ip":true},{"hostname":"hu-bud-wg-102","location":"hu-bud","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.196.130","include_in_country":true,"weight":100,"public_key":"iEWLm2F4xV013ZETeZcT1dyUd5O+JnyndHso8RP8txw=","ipv6_addr_in":"2001:ac8:26:54::f001","same_ip":true},{"hostname":"ie-dub-wg-101","location":"ie-dub","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.189.2","include_in_country":true,"weight":100,"public_key":"lHrukA9+vn7Jjzx2Nb/1NQ0WiaiKppEqVxrGT5X1RFQ=","ipv6_addr_in":"2001:ac8:88:84::a01f","same_ip":true},{"hostname":"ie-dub-wg-102","location":"ie-dub","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.189.66","include_in_country":true,"weight":100,"public_key":"8YhrVbViPmYFZ2KJF2pR7d10EaBz8PJbPtoEiAs1IXA=","ipv6_addr_in":"2001:ac8:88:85::f001","same_ip":true},{"hostname":"il-tlv-wg-101","location":"il-tlv","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.227.197","include_in_country":true,"weight":100,"public_key":"XOedjVJaT2IrEDJbzvtZeL4hP5uPRHzFxvD1cwVwUFo=","ipv6_addr_in":"2a02:6ea0:3b00:1::a01f","same_ip":true},{"hostname":"il-tlv-wg-102","location":"il-tlv","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.227.210","include_in_country":true,"weight":100,"public_key":"UNeML4rXjvOerAstTNf4gG5B+OfjVzjSQrWE6mrswD0=","ipv6_addr_in":"2a02:6ea0:3b00:2::a02f","same_ip":true},{"hostname":"il-tlv-wg-103","location":"il-tlv","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.227.222","include_in_country":true,"weight":100,"public_key":"11FJ/NY3jaAw1PSYG9w7bxsMxAzlI+1p8/juh1LJPT0=","ipv6_addr_in":"2a02:6ea0:3b00:3::a03f","same_ip":true},{"hostname":"it-mil-wg-001","location":"it-mil","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.211.66","include_in_country":true,"weight":200,"public_key":"Sa9fFFthvihGMO4cPExJ7ZaWSHNYoXmOqZMvJsaxOVk=","ipv6_addr_in":"2a02:6ea0:d509:1::a09f","same_ip":true},{"hostname":"it-mil-wg-002","location":"it-mil","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.211.79","include_in_country":true,"weight":200,"public_key":"RJ7e37UEP6hfyLQM/lJ2K5wcZOJQFhm2VhFaBniH1kg=","ipv6_addr_in":"2a02:6ea0:d509:2::a10f","same_ip":true},{"hostname":"it-mil-wg-003","location":"it-mil","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"178.249.211.92","include_in_country":true,"weight":200,"public_key":"WOyki5Gzoez07X7D3jAhG68hpoiYIWAx1yypVbkQaVY=","ipv6_addr_in":"2a02:6ea0:d509:3::a11f","same_ip":true},{"hostname":"it-mil-wg-201","location":"it-mil","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.225.2","include_in_country":true,"weight":100,"public_key":"XHwDoIVZGoVfUYbfcPiRp1LhaOCDc0A3QrS72i3ztBw=","ipv6_addr_in":"2001:ac8:24:17::f001","same_ip":true},{"hostname":"it-mil-wg-202","location":"it-mil","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.225.66","include_in_country":true,"weight":100,"public_key":"y5raL0QZx2CpOozrL+Knmjj7nnly3JKatFnxynjXpE0=","ipv6_addr_in":"2001:ac8:24:18::f001","same_ip":true},{"hostname":"jp-osa-wg-001","location":"jp-osa","active":false,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"45.8.223.195","include_in_country":true,"weight":100,"public_key":"uhbuY1A7g0yNu0lRhLTi020kYeAx34ED30BA5DQRHFo=","ipv6_addr_in":"2400:ddc0:c000::f001","same_ip":true},{"hostname":"jp-osa-wg-002","location":"jp-osa","active":false,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"45.8.223.210","include_in_country":true,"weight":100,"public_key":"wzGXxsYOraTCPZuRxfXVTNmoWsRkMFLqMqDxI4PutBg=","ipv6_addr_in":"2400:ddc0:c000::a02f","same_ip":true},{"hostname":"jp-osa-wg-003","location":"jp-osa","active":false,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"45.8.223.225","include_in_country":true,"weight":100,"public_key":"Pt18GnBffElW0sqnd6IDRr5r0B/NDezy6NicoPI+fG8=","ipv6_addr_in":"2400:ddc0:c000::f201","same_ip":true},{"hostname":"jp-osa-wg-004","location":"jp-osa","active":false,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"45.8.223.240","include_in_country":true,"weight":100,"public_key":"JpDAtRuR39GLFKoQNiKvpzuJ65jOOLD7h85ekZ3reVc=","ipv6_addr_in":"2400:ddc0:c000::f301","same_ip":true},{"hostname":"jp-tyo-wg-001","location":"jp-tyo","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.21.239","include_in_country":true,"weight":200,"public_key":"AUo2zhQ0wCDy3/jmZgOe4QMncWWqrdME7BbY2UlkgyI=","ipv6_addr_in":"2a02:6ea0:d31c::a15f","same_ip":true},{"hostname":"jp-tyo-wg-002","location":"jp-tyo","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.21.226","include_in_country":true,"weight":200,"public_key":"zdlqydCbeR7sG1y5L8sS65X1oOtRKvfVbAuFgqEGhi4=","ipv6_addr_in":"2a02:6ea0:d31b::a14f","same_ip":true},{"hostname":"jp-tyo-wg-201","location":"jp-tyo","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.138.194","include_in_country":true,"weight":100,"public_key":"0j7u9Vd+EsqFs8XeV/T/ZM7gE+TWgEsYCsqcZUShvzc=","ipv6_addr_in":"2001:ac8:40:11::b01f","same_ip":true},{"hostname":"jp-tyo-wg-202","location":"jp-tyo","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.201.2","include_in_country":true,"weight":100,"public_key":"yLKGIH/eaNUnrOEPRtgvC3PSMTkyAFK/0t8lNjam02k=","ipv6_addr_in":"2001:ac8:40:13::b02f","same_ip":true},{"hostname":"jp-tyo-wg-203","location":"jp-tyo","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.201.66","include_in_country":true,"weight":100,"public_key":"tgTYDEfbDgr35h6hYW01MH76CJrwuBvbQFhyVsazEic=","ipv6_addr_in":"2001:ac8:40:14::b03f","same_ip":true},{"hostname":"lv-rix-wg-001","location":"lv-rix","active":true,"owned":false,"provider":"Makonix","stboot":true,"ipv4_addr_in":"31.170.22.15","include_in_country":true,"weight":100,"public_key":"z0gUPGRwzmOcFLU6b2Z3dCJUJr2/9OvxujUbjFSTB0Q=","ipv6_addr_in":"2a00:c68:0:cbd0::f001","same_ip":true},{"hostname":"mx-qro-wg-001","location":"mx-qro","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.88.22.129","include_in_country":true,"weight":100,"public_key":"yxyntWsANEwxeR0pOPNAcfWY7zEVICZe9G+GxortzEY=","ipv6_addr_in":"2a02:6ea0:f803::f001","same_ip":true},{"hostname":"mx-qro-wg-002","location":"mx-qro","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.88.22.142","include_in_country":true,"weight":100,"public_key":"kGkalo3qvm8MynKdzwW7CGBYXkqRwGhHfYVssgKOWnU=","ipv6_addr_in":"2a02:6ea0:f803:1::f001","same_ip":true},{"hostname":"mx-qro-wg-003","location":"mx-qro","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.88.22.155","include_in_country":true,"weight":100,"public_key":"hRamkTwXw0usPFDorPl2vf1qP8chczEBcqeV5bA1QDA=","ipv6_addr_in":"2a02:6ea0:f803:2::f001","same_ip":true},{"hostname":"mx-qro-wg-004","location":"mx-qro","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.88.22.168","include_in_country":true,"weight":100,"public_key":"Q3yqhnYHK/bFjrd6yqti8gSV1gzOwvnl5N5tXuUxMyk=","ipv6_addr_in":"2a02:6ea0:f803:3::f001","same_ip":true},{"hostname":"nl-ams-wg-001","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.249.66","include_in_country":true,"weight":100,"public_key":"UrQiI9ISdPPzd4ARw1NHOPKKvKvxUhjwRjaI0JpJFgM=","ipv6_addr_in":"2a03:1b20:3:f011::f001","same_ip":true},{"hostname":"nl-ams-wg-002","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.82","include_in_country":true,"weight":100,"public_key":"DVui+5aifNFRIVDjH3v2y+dQ+uwI+HFZOd21ajbEpBo=","ipv6_addr_in":"2a03:1b20:3:f011::a02f","same_ip":true},{"hostname":"nl-ams-wg-003","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.83","include_in_country":true,"weight":100,"public_key":"if4HpJZbN7jft5E9R9wAoTcggIu6eZhgYDvqxnwrXic=","ipv6_addr_in":"2a03:1b20:3:f011::f201","same_ip":true},{"hostname":"nl-ams-wg-004","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.249.69","include_in_country":true,"weight":100,"public_key":"hnRyse6QxPPcZOoSwRsHUtK1W+APWXnIoaDTmH6JsHQ=","ipv6_addr_in":"2a03:1b20:3:f011::f301","same_ip":true},{"hostname":"nl-ams-wg-005","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.249.70","include_in_country":true,"weight":100,"public_key":"33BoONMGCm2vknq2eq72eozRsHmHQY6ZHEEZ4851TkY=","ipv6_addr_in":"2a03:1b20:3:f011::f401","same_ip":true},{"hostname":"nl-ams-wg-006","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.86","include_in_country":true,"weight":100,"public_key":"xpZ3ZDEukbqKQvdHwaqKMUhsYhcYD3uLPUh1ACsVr1s=","ipv6_addr_in":"2a03:1b20:3:f011::f501","same_ip":true},{"hostname":"nl-ams-wg-101","location":"nl-ams","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"92.60.40.194","include_in_country":true,"weight":400,"public_key":"m9w2Fr0rcN6R1a9HYrGnUTU176rTZIq2pcsovPd9sms=","ipv6_addr_in":"2a0c:59c0:18::a20f","same_ip":true},{"hostname":"nl-ams-wg-102","location":"nl-ams","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"92.60.40.209","include_in_country":true,"weight":400,"public_key":"uUYbYGKoA6UBh1hfkAz5tAWFv4SmteYC9kWh7/K6Ah0=","ipv6_addr_in":"2a0c:59c0:18::a21f","same_ip":true},{"hostname":"nl-ams-wg-201","location":"nl-ams","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.196.2","include_in_country":true,"weight":400,"public_key":"vt+yTcpxWvH8qiSncd1wSPV/78vt2aE2BBU8ZbG7x1Q=","ipv6_addr_in":"2a02:6ea0:c034:1::a30f","same_ip":true},{"hostname":"nl-ams-wg-202","location":"nl-ams","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.196.15","include_in_country":true,"weight":400,"public_key":"BChJDLOwZu9Q1oH0UcrxcHP6xxHhyRbjrBUsE0e07Vk=","ipv6_addr_in":"2a02:6ea0:c034:2::a31f","same_ip":true},{"hostname":"nl-ams-wg-203","location":"nl-ams","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.196.28","include_in_country":true,"weight":400,"public_key":"M5z8TKjJYpIJ3FXoXy7k58IUaoVro2tWMKSgC5WIqR8=","ipv6_addr_in":"2a02:6ea0:c034:3::a32f","same_ip":true},{"hostname":"no-osl-wg-001","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"176.125.235.71","include_in_country":false,"weight":100,"public_key":"jOUZjMq2PWHDzQxu3jPXktYB7EKeFwBzGZx56cTXXQg=","ipv6_addr_in":"2a02:20c8:4124::a01f","same_ip":true},{"hostname":"no-osl-wg-002","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"176.125.235.72","include_in_country":false,"weight":100,"public_key":"IhhpKphSFWpwja1P4HBctZ367G3Q53EgdeFGZro29Tc=","ipv6_addr_in":"2a02:20c8:4124::a02f","same_ip":true},{"hostname":"no-osl-wg-003","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"176.125.235.73","include_in_country":false,"weight":100,"public_key":"zOBWmQ3BEOZKsYKbj4dC2hQjxCbr3eKa6wGWyEDYbC4=","ipv6_addr_in":"2a02:20c8:4124::a03f","same_ip":true},{"hostname":"no-osl-wg-004","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"176.125.235.74","include_in_country":false,"weight":100,"public_key":"veeEoYS9a2T6K8WMs/MvRCdNJG580XbhnLfbFjp3B0M=","ipv6_addr_in":"2a02:20c8:4124::a04f","same_ip":true},{"hostname":"no-osl-wg-005","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"178.255.149.140","include_in_country":true,"weight":100,"public_key":"ScQu/AqslSPwpXMIEyimrYZWTIdJJXLLeXrijWOF0SE=","ipv6_addr_in":"2a02:20c8:4124::f401","same_ip":true},{"hostname":"no-osl-wg-006","location":"no-osl","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"178.255.149.165","include_in_country":true,"weight":100,"public_key":"LBlNBTuT7gNEZoAuxO0PTVPpaDuYA7nAeCyMpg9Agyo=","ipv6_addr_in":"2a02:20c8:4124::f501","same_ip":true},{"hostname":"no-svg-wg-001","location":"no-svg","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"194.127.199.2","include_in_country":true,"weight":300,"public_key":"kduYoE/b1mA2Pjszx1CzE4Lktsdc2zsUU8Relul2m2U=","ipv6_addr_in":"2a02:20c8:4120::a01f","same_ip":true},{"hostname":"no-svg-wg-002","location":"no-svg","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"194.127.199.31","include_in_country":true,"weight":300,"public_key":"U9fbFesIIr2HotWdkfMpKyOEPk+RYtE2oYn3KoLmkj4=","ipv6_addr_in":"2a02:20c8:4120::a02f","same_ip":true},{"hostname":"no-svg-wg-003","location":"no-svg","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"194.127.199.62","include_in_country":true,"weight":300,"public_key":"btc4mh3n9jVCW6yikw3cOPct0x3B5cDK+kKnvgCV0S0=","ipv6_addr_in":"2a02:20c8:4120::a03f","same_ip":true},{"hostname":"no-svg-wg-004","location":"no-svg","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"194.127.199.93","include_in_country":true,"weight":300,"public_key":"Fu98PLCZw/FTcQqyTy0vzaepkfxuSLAah7wnafGVO1g=","ipv6_addr_in":"2a02:20c8:4120::a04f","same_ip":true},{"hostname":"nz-akl-wg-301","location":"nz-akl","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.75.11.50","include_in_country":true,"weight":100,"public_key":"BOEOP01bcND1a0zvmOxRHPB/ObgjgPIzBJE5wbm7B0M=","ipv6_addr_in":"2404:f780:5:deb::f001","same_ip":true},{"hostname":"nz-akl-wg-302","location":"nz-akl","active":true,"owned":false,"provider":"hostuniversal","stboot":true,"ipv4_addr_in":"103.75.11.66","include_in_country":true,"weight":100,"public_key":"80WGWgFP9q3eU16MuLJISB1fzAu2LM2heschmokVSVU=","ipv6_addr_in":"2404:f780:5:dec::c02f","same_ip":true},{"hostname":"pl-waw-wg-101","location":"pl-waw","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.212.66","include_in_country":true,"weight":100,"public_key":"fO4beJGkKZxosCZz1qunktieuPyzPnEVKVQNhzanjnA=","ipv6_addr_in":"2a02:6ea0:ce08:1::f001","same_ip":true},{"hostname":"pl-waw-wg-102","location":"pl-waw","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.212.79","include_in_country":true,"weight":100,"public_key":"nJEWae9GebEY7yJONXQ1j4gbURV4QULjx388woAlbDs=","ipv6_addr_in":"2a02:6ea0:ce08:2::a06f","same_ip":true},{"hostname":"pl-waw-wg-103","location":"pl-waw","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.212.92","include_in_country":true,"weight":100,"public_key":"07eUtSNhiJ9dQXBmUqFODj0OqhmbKQGbRikIq9f90jM=","ipv6_addr_in":"2a02:6ea0:ce08:3::a07f","same_ip":true},{"hostname":"pl-waw-wg-201","location":"pl-waw","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"45.128.38.226","include_in_country":true,"weight":100,"public_key":"XwFAczY5LdogFwE9soDecXWqywSCDGuRyJhr/0psI00=","ipv6_addr_in":"2a0d:5600:13:67::a01f","same_ip":true},{"hostname":"pl-waw-wg-202","location":"pl-waw","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.144.34","include_in_country":true,"weight":100,"public_key":"nyfOkamv1ryTS62lsmyU96cqI0dtqek84DhyxWgAQGY=","ipv6_addr_in":"2a0d:5600:13:c47::a02f","same_ip":true},{"hostname":"pt-lis-wg-101","location":"pt-lis","active":true,"owned":false,"provider":"ptisp","stboot":true,"ipv4_addr_in":"94.46.24.33","include_in_country":true,"weight":100,"public_key":"xL7uaEPI7KV3aNPELKpGjVxBCq0yiAc376iS/MRDo3Y=","ipv6_addr_in":"2a00:1651:0:4000::a01f","same_ip":true},{"hostname":"pt-lis-wg-102","location":"pt-lis","active":true,"owned":false,"provider":"ptisp","stboot":true,"ipv4_addr_in":"94.46.24.49","include_in_country":true,"weight":100,"public_key":"ZOa0Yjuak3i8PEfYTwB4UoZtVGnN6+U55vaIw7W7hwA=","ipv6_addr_in":"2a00:1651:0:4001::a02f","same_ip":true},{"hostname":"pt-lis-wg-201","location":"pt-lis","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.88.20.206","include_in_country":true,"weight":100,"public_key":"JCAe7D/owe11Ii2rhpIKhGZvP/V1P1cVZwZAjpSRqmc=","ipv6_addr_in":"2a02:6ea0:fb01:1::f001","same_ip":true},{"hostname":"pt-lis-wg-202","location":"pt-lis","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.88.20.193","include_in_country":true,"weight":100,"public_key":"5P4CQYQeSozk/3KQZh/kl7tUMFGgRB60Ttx6x2nh+F8=","ipv6_addr_in":"2a02:6ea0:fb01:2::f002","same_ip":true},{"hostname":"ro-buh-wg-001","location":"ro-buh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.124.130","include_in_country":true,"weight":100,"public_key":"xpKhRTf9JI269S2PujLbrJm1TwIe67HD5CLe+sP4tUU=","ipv6_addr_in":"2a04:9dc0:0:133::a01f","same_ip":true},{"hostname":"ro-buh-wg-002","location":"ro-buh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.124.194","include_in_country":true,"weight":100,"public_key":"Ekc3+qU88FuMfkEMyLlgRqDYv+WHJvUsfOMI/C0ydE4=","ipv6_addr_in":"2a04:9dc0:0:135::f001","same_ip":true},{"hostname":"rs-beg-wg-101","location":"rs-beg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.193.2","include_in_country":true,"weight":100,"public_key":"Orrce1127WpljZa+xKbF21zJkJ9wM1M3VJ5GJ/UsIDU=","ipv6_addr_in":"2001:ac8:7d:37::a01f","same_ip":true},{"hostname":"rs-beg-wg-102","location":"rs-beg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.193.66","include_in_country":true,"weight":100,"public_key":"35lawt+YUx10ELTFhZhg4/xzXRmjxCl/j1O4RK5d60M=","ipv6_addr_in":"2001:ac8:7d:38::a02f","same_ip":true},{"hostname":"se-got-wg-001","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.66","include_in_country":true,"weight":100,"public_key":"5JMPeO7gXIbR5CnUa/NPNK4L5GqUnreF0/Bozai4pl4=","ipv6_addr_in":"2a03:1b20:5:f011:31::a03f","same_ip":true},{"hostname":"se-got-wg-002","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.67","include_in_country":true,"weight":100,"public_key":"AtvE5KdPeQtOcE2QyXaPt9eQoBV3GBxzimQ2FIuGQ2U=","ipv6_addr_in":"2a03:1b20:5:f011::a05f","same_ip":true},{"hostname":"se-got-wg-003","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.68","include_in_country":true,"weight":100,"public_key":"BLNHNoGO88LjV/wDBa7CUUwUzPq/fO2UwcGLy56hKy4=","ipv6_addr_in":"2a03:1b20:5:f011::a09f","same_ip":true},{"hostname":"se-got-wg-004","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.69","include_in_country":true,"weight":100,"public_key":"veGD6/aEY6sMfN3Ls7YWPmNgu3AheO7nQqsFT47YSws=","ipv6_addr_in":"2a03:1b20:5:f011::a10f","same_ip":true},{"hostname":"se-got-wg-101","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.70","include_in_country":true,"weight":100,"public_key":"B8UVAeNkAW4NiGHd1lpl933Drh4y7pMqpXJpH0SrGjQ=","ipv6_addr_in":"2a03:1b20:5:f011::aaaf","same_ip":true},{"hostname":"se-mma-wg-001","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.138.218.220","include_in_country":true,"weight":100,"public_key":"Qn1QaXYTJJSmJSMw18CGdnFiVM0/Gj/15OdkxbXCSG0=","ipv6_addr_in":"2a03:1b20:1:f410::a01f","same_ip":true},{"hostname":"se-mma-wg-002","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.138.218.80","include_in_country":true,"weight":100,"public_key":"5y66WShsFXqM5K7/4CPEGCWfk7PQyNhVBT2ILjbGm2I=","ipv6_addr_in":"2a03:1b20:1:f410::a15f","same_ip":true},{"hostname":"se-mma-wg-003","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.138.218.83","include_in_country":true,"weight":100,"public_key":"fZFAcd8vqWOBpRqlXifsjzGf16gMTg2GuwKyZtkG6UU=","ipv6_addr_in":"2a03:1b20:1:f410::a18f","same_ip":true},{"hostname":"se-mma-wg-004","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.138.218.130","include_in_country":true,"weight":100,"public_key":"m4jnogFbACz7LByjo++8z5+1WV0BuR1T7E1OWA+n8h0=","ipv6_addr_in":"2a03:1b20:1:f410:40::a04f","same_ip":true},{"hostname":"se-mma-wg-005","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.138.218.82","include_in_country":true,"weight":100,"public_key":"qnJrQEf2JiDHMnMWFFxWz8I9NREockylVgYVE95s72s=","ipv6_addr_in":"2a03:1b20:1:f410::a17f","same_ip":true},{"hostname":"se-mma-wg-101","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"45.83.220.68","include_in_country":true,"weight":100,"public_key":"7ncbaCb+9za3jnXlR95I6dJBkwL1ABB5i4ndFUesYxE=","ipv6_addr_in":"2a03:1b20:1:e011::a21f","same_ip":true},{"hostname":"se-mma-wg-102","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"45.83.220.69","include_in_country":true,"weight":100,"public_key":"cwglRdgLQ4gMG36TIYlc5OIemLNrYs4UM1KTc8mnzxk=","ipv6_addr_in":"2a03:1b20:1:e011::a22f","same_ip":true},{"hostname":"se-mma-wg-103","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"45.83.220.70","include_in_country":true,"weight":100,"public_key":"XscA5gebj51nmhAr6o+aUCnMHWGjbS1Gvvd0tuLRiFE=","ipv6_addr_in":"2a03:1b20:1:e011::a23f","same_ip":true},{"hostname":"se-sto-wg-001","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.233.76","include_in_country":true,"weight":100,"public_key":"MkP/Jytkg51/Y/EostONjIN6YaFRpsAYiNKMX27/CAY=","ipv6_addr_in":"2a03:1b20:4:f011::999f","same_ip":true},{"hostname":"se-sto-wg-002","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.67","include_in_country":true,"weight":100,"public_key":"q2ZZPfumPaRVl4DJfzNdQF/GHfe6BYAzQ2GZZHb6rmI=","ipv6_addr_in":"2a03:1b20:4:f011::a02f","same_ip":true},{"hostname":"se-sto-wg-003","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.68","include_in_country":true,"weight":100,"public_key":"qZbwfoY4LHhDPzUROFbG+LqOjB0+Odwjg/Nv3kGolWc=","ipv6_addr_in":"2a03:1b20:4:f011::f201","same_ip":true},{"hostname":"se-sto-wg-004","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.69","include_in_country":true,"weight":100,"public_key":"94qIvXgF0OXZ4IcquoS7AO57OV6JswUFgdONgGiq+jo=","ipv6_addr_in":"2a03:1b20:4:f011::f301","same_ip":true},{"hostname":"se-sto-wg-005","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.72","include_in_country":true,"weight":100,"public_key":"5rVa0M13oMNobMY7ToAMU1L/Mox7AYACvV+nfsE7zF0=","ipv6_addr_in":"2a03:1b20:4:f011::f401","same_ip":true},{"hostname":"se-sto-wg-006","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.73","include_in_country":true,"weight":100,"public_key":"5WNG/KKCtgF4+49e/4iqvHVY/i+6dzUmVKXcJj7zi3I=","ipv6_addr_in":"2a03:1b20:4:f011::f501","same_ip":true},{"hostname":"se-sto-wg-008","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.71","include_in_country":true,"weight":100,"public_key":"4nOXEaCDYBV//nsVXk7MrnHpxLV9MbGjt+IGQY//p3k=","ipv6_addr_in":"2a03:1b20:4:f011::f701","same_ip":true},{"hostname":"se-sto-wg-009","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.233.69","include_in_country":true,"weight":100,"public_key":"t1XlQD7rER0JUPrmh3R5IpxjUP9YOqodJAwfRorNxl4=","ipv6_addr_in":"2a03:1b20:4:f011::a09f","same_ip":true},{"hostname":"se-sto-wg-010","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.233.70","include_in_country":true,"weight":100,"public_key":"zWh5JzqxNhaJ7tMFDRkj9etq6rqRZrUhv156lG6H+Vc=","ipv6_addr_in":"2a03:1b20:4:f011::a10f","same_ip":true},{"hostname":"se-sto-wg-011","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.233.71","include_in_country":true,"weight":100,"public_key":"GqKpm8VwKJQLQEQ0PXbkRueY9hDqiMibr+EpW3n9syk=","ipv6_addr_in":"2a03:1b20:4:f011::a11f","same_ip":true},{"hostname":"se-sto-wg-012","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.233.66","include_in_country":true,"weight":100,"public_key":"1493vtFUbIfSpQKRBki/1d0YgWIQwMV4AQAvGxjCNVM=","ipv6_addr_in":"2a03:1b20:4:f011::fb01","same_ip":true},{"hostname":"se-sto-wg-014","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.195.233.68","include_in_country":true,"weight":100,"public_key":"DYlwUsH63DLjEfKC9yq7P+FoQx99WdKvZGGhXoUZVgk=","ipv6_addr_in":"2a03:1b20:4:f011::fd01","same_ip":true},{"hostname":"sg-sin-wg-001","location":"sg-sin","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.60.2","include_in_country":true,"weight":100,"public_key":"sFHv/qzG7b6ds5pow+oAR3G5Wqp9eFbBD3BmEGBuUWU=","ipv6_addr_in":"2a02:6ea0:d13e:1::a09f","same_ip":true},{"hostname":"sg-sin-wg-002","location":"sg-sin","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.60.15","include_in_country":true,"weight":100,"public_key":"WM5I4IFwQcVysM4fF4NXZtQXNrSkqVWkQxNPPygOiF0=","ipv6_addr_in":"2a02:6ea0:d13e:2::a10f","same_ip":true},{"hostname":"sg-sin-wg-003","location":"sg-sin","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.60.28","include_in_country":true,"weight":100,"public_key":"3HtGdhEXUPKQIDRW49wCUoTK2ZXfq+QfzjfYoldNchg=","ipv6_addr_in":"2a02:6ea0:d13e:3::a11f","same_ip":true},{"hostname":"sg-sin-wg-101","location":"sg-sin","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.199.194","include_in_country":true,"weight":100,"public_key":"KB6ZA1PAixd74c+mO0VBY4j7LaitK8B4L1APbFIQyQ0=","ipv6_addr_in":"2a0d:5600:d:44::a01f","same_ip":true},{"hostname":"sg-sin-wg-102","location":"sg-sin","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.199.130","include_in_country":true,"weight":100,"public_key":"qrhHOwk0ree+LFxW6htvGEfVFuhM2efQ/M+4p0sx/gA=","ipv6_addr_in":"2a0d:5600:d:43::a02f","same_ip":true},{"hostname":"sk-bts-wg-001","location":"sk-bts","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.34.129","include_in_country":true,"weight":100,"public_key":"QEVIaIycN8p5twXCuZeQTEj9utozakw/MU8H6+/whls=","ipv6_addr_in":"2a02:6ea0:2901:1::f001","same_ip":true},{"hostname":"sk-bts-wg-002","location":"sk-bts","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.34.143","include_in_country":true,"weight":100,"public_key":"JeEuObwimNmoVtPn4kpMI1y1UM+IChGVBLtmP3CNNVQ=","ipv6_addr_in":"2a02:6ea0:2901::a02f","same_ip":true},{"hostname":"ua-iev-wg-001","location":"ua-iev","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.102.240.79","include_in_country":true,"weight":100,"public_key":"PO2o3ewguPP24wLy8bbDqx1xuAnTOIVzdzVGVT0d8kU=","ipv6_addr_in":"2a02:6ea0:e109:2::a01f","same_ip":true},{"hostname":"ua-iev-wg-002","location":"ua-iev","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.102.240.66","include_in_country":true,"weight":100,"public_key":"HUj/J8Rxx7QVGh3kJsFgPZoqtm2BQIX03vKJSIyTOSo=","ipv6_addr_in":"2a02:6ea0:e109:1::a02f","same_ip":true},{"hostname":"us-atl-wg-001","location":"us-atl","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.140.130","include_in_country":true,"weight":100,"public_key":"nvyBkaEXHwyPBAm8spGB0TFzf2W5wPAl8EEuJ0t+bzs=","ipv6_addr_in":"2a02:6ea0:c122:1::b79f","same_ip":true},{"hostname":"us-atl-wg-002","location":"us-atl","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.140.143","include_in_country":true,"weight":100,"public_key":"ECeGYeh8CfPJO3v56ucCDdl+PlKcj2bBszUGkT+hVWQ=","ipv6_addr_in":"2a02:6ea0:c122:2::b80f","same_ip":true},{"hostname":"us-atl-wg-101","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.231","include_in_country":false,"weight":1,"public_key":"MNUf9CYsmf72git8MGzui3kplclyPP6xAS6sz3JT2F8=","ipv6_addr_in":"2607:f7a0:1:d::f001","same_ip":true},{"hostname":"us-atl-wg-102","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.232","include_in_country":false,"weight":1,"public_key":"RFHvvrw6/3qnwsH89GMYm7xdJA72MPSpXI+WPk7sNwk=","ipv6_addr_in":"2607:f7a0:1:d::f101","same_ip":true},{"hostname":"us-atl-wg-103","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.233","include_in_country":false,"weight":1,"public_key":"u3X1bahP8G2MNUJ57ImYx5pvADVhI9YmCsWlTULAQnw=","ipv6_addr_in":"2607:f7a0:1:d::f201","same_ip":true},{"hostname":"us-atl-wg-104","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.234","include_in_country":false,"weight":1,"public_key":"bY+7UNjd1zhZ4GSV9YlarYxB7fl5dhKEyJHaJ3iZg3g=","ipv6_addr_in":"2607:f7a0:1:d::b70f","same_ip":true},{"hostname":"us-atl-wg-105","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.235","include_in_country":false,"weight":1,"public_key":"QEz7T4HN99SCFuWRJA3MJL8B7WnmbdVcM2t5CDe0BQw=","ipv6_addr_in":"2607:f7a0:1:d::b71f","same_ip":true},{"hostname":"us-atl-wg-106","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.236","include_in_country":false,"weight":1,"public_key":"s60zDaHwztfLhcrcQXIMhXgTAI1KAUT2osA7k3LSHDE=","ipv6_addr_in":"2607:f7a0:1:d::b72f","same_ip":true},{"hostname":"us-atl-wg-107","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.237","include_in_country":false,"weight":1,"public_key":"IbkH8hULcFgUEt/OBXamWI2IotlbYJMyAcAhSTbtD1o=","ipv6_addr_in":"2607:f7a0:1:d::f601","same_ip":true},{"hostname":"us-atl-wg-108","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.238","include_in_country":false,"weight":1,"public_key":"/38SXpa6r80z/CHrPHDW5uTaXa3Xj0U8hIztCEV4q3I=","ipv6_addr_in":"2607:f7a0:1:d::f701","same_ip":true},{"hostname":"us-atl-wg-109","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.239","include_in_country":false,"weight":1,"public_key":"n2FGxqt/MhTrHKQyoguto+2s6lTPskTwOsCX9jGHzW0=","ipv6_addr_in":"2607:f7a0:1:d::b75f","same_ip":true},{"hostname":"us-atl-wg-110","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.240","include_in_country":false,"weight":1,"public_key":"bjy5pU9WbGfAfnwjI+IajrgYwbbGlTk4xHimTpDQ/HY=","ipv6_addr_in":"2607:f7a0:1:d::f901","same_ip":true},{"hostname":"us-atl-wg-201","location":"us-atl","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"107.150.22.2","include_in_country":false,"weight":100,"public_key":"BbW2Gm4IZEW8CrEIg71jZC9pztA/J4h1PK9lwq57ewE=","ipv6_addr_in":"2607:fcd0:aa80:1304::f001","same_ip":true},{"hostname":"us-atl-wg-202","location":"us-atl","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"104.129.24.98","include_in_country":false,"weight":100,"public_key":"Qnb6TdDA7IkTIISJ40W+6rZA81pb0v4D0jRZRTYNQnQ=","ipv6_addr_in":"2607:fcd0:aa80:1302::f001","same_ip":true},{"hostname":"us-atl-wg-203","location":"us-atl","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"104.129.24.114","include_in_country":false,"weight":100,"public_key":"nZQvI+2ZzDC2titokjWcojbjvn4bxHrhUzg1UK/K0nc=","ipv6_addr_in":"2607:fcd0:aa80:1303::b34f","same_ip":true},{"hostname":"us-atl-wg-204","location":"us-atl","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"104.223.91.18","include_in_country":false,"weight":100,"public_key":"rlZyrKRSLfvjUBpYD2jUkWhdWkB1RnRr+Q4bv9+nvD8=","ipv6_addr_in":"2607:fcd0:aa80:1305::b43f","same_ip":true},{"hostname":"us-bos-wg-001","location":"us-bos","active":true,"owned":false,"provider":"HostRoyale","stboot":true,"ipv4_addr_in":"43.225.189.131","include_in_country":true,"weight":100,"public_key":"CsysTnZ0HvyYRjsKMPx60JIgy777JhD0h9WpbHbV83o=","ipv6_addr_in":"2a06:3040:12:610::a01f","same_ip":true},{"hostname":"us-bos-wg-002","location":"us-bos","active":true,"owned":false,"provider":"HostRoyale","stboot":true,"ipv4_addr_in":"43.225.189.162","include_in_country":true,"weight":100,"public_key":"LLkA2XSBvfUeXgLdMKP+OTQeKhtGB03kKskJEwlzAE8=","ipv6_addr_in":"2a06:3040:12:610::a02f","same_ip":true},{"hostname":"us-bos-wg-101","location":"us-bos","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.40.50.98","include_in_country":true,"weight":100,"public_key":"oxJ2PIqrQOmS0uiyXvnxT64E1uZnjZDWPbP/+APToAE=","ipv6_addr_in":"2a02:6ea0:f901::a01f","same_ip":true},{"hostname":"us-bos-wg-102","location":"us-bos","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"149.40.50.112","include_in_country":true,"weight":100,"public_key":"wcmmadJObux2/62ES+QbIO21BkU7p2I0s6n4WNZZgW0=","ipv6_addr_in":"2a02:6ea0:f901:1::a02f","same_ip":true},{"hostname":"us-chi-wg-001","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.44.2","include_in_country":false,"weight":100,"public_key":"T5aabskeYCd5dn81c3jOKVxGWQSLwpqHSHf6wButSgw=","ipv6_addr_in":"2607:9000:0:56::a01f","same_ip":true},{"hostname":"us-chi-wg-002","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.43.130","include_in_country":false,"weight":100,"public_key":"dr0ORuPoV9TYY6G5cM00cOoO72wfUC7Lmni7+Az9m0Y=","ipv6_addr_in":"2607:9000:0:54::a02f","same_ip":true},{"hostname":"us-chi-wg-003","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.44.34","include_in_country":false,"weight":100,"public_key":"VY5Dos3WeCyI1Jb8Z+KhB4YlEKZmrQeSNcP0WCrzk2I=","ipv6_addr_in":"2607:9000:0:57::a03f","same_ip":true},{"hostname":"us-chi-wg-004","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.43.162","include_in_country":false,"weight":100,"public_key":"Na8m5Z3O6kwtLFPsign+JPlLoFm/Q3eBdIMI08psSzg=","ipv6_addr_in":"2607:9000:0:55::a04f","same_ip":true},{"hostname":"us-chi-wg-005","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.44.66","include_in_country":false,"weight":100,"public_key":"X50kEMmdPc50SYWFaDFNOAMzUYnCZv3rxzw2Y6BqOyk=","ipv6_addr_in":"2607:9000:0:58::a05f","same_ip":true},{"hostname":"us-chi-wg-006","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.44.98","include_in_country":false,"weight":100,"public_key":"01KgzQY+pT7Q+GPUa1ijj0YgdN5owMaK9ViRZO4dIWo=","ipv6_addr_in":"2607:9000:0:59::a06f","same_ip":true},{"hostname":"us-chi-wg-101","location":"us-chi","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"66.63.167.114","include_in_country":false,"weight":50,"public_key":"P1Y04kVMViwZrMhjcX8fDmuVWoKl3xm2Hv/aQOmPWH0=","ipv6_addr_in":"2607:fcd0:bb80:403::b32f","same_ip":true},{"hostname":"us-chi-wg-102","location":"us-chi","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"66.63.167.194","include_in_country":false,"weight":50,"public_key":"6CwMg2aoKNSFFcIsW3R3SY5T6fBYwoRFifl8ZVlw+Vg=","ipv6_addr_in":"2607:fcd0:bb80:402::f001","same_ip":true},{"hostname":"us-chi-wg-104","location":"us-chi","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"66.63.167.146","include_in_country":true,"weight":50,"public_key":"/WirOQ8FNF9tD1+/MYgIAWpjFKiJYhJJ7/w2QmKBrVo=","ipv6_addr_in":"2607:fcd0:bb80:405::f001","same_ip":true},{"hostname":"us-chi-wg-201","location":"us-chi","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"87.249.134.1","include_in_country":true,"weight":100,"public_key":"+Xx2mJnoJ+JS11Z6g8mp6aUZV7p6DAN9ZTAzPaHakhM=","ipv6_addr_in":"2a02:6ea0:c61f::b63f","same_ip":true},{"hostname":"us-chi-wg-202","location":"us-chi","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"87.249.134.14","include_in_country":true,"weight":100,"public_key":"rmN4IM0I0gF7V9503/xnQMOLsu9txl8GTqci9dgUO18=","ipv6_addr_in":"2a02:6ea0:c61f:1::b64f","same_ip":true},{"hostname":"us-chi-wg-203","location":"us-chi","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"87.249.134.27","include_in_country":true,"weight":100,"public_key":"V0ilKm3bVqt0rmJ80sP0zSVK4m6O3nADi88IQAL5kjw=","ipv6_addr_in":"2a02:6ea0:c61f:2::f001","same_ip":true},{"hostname":"us-dal-wg-001","location":"us-dal","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.211.66","include_in_country":true,"weight":100,"public_key":"EAzbWMQXxJGsd8j2brhYerGB3t5cPOXqdIDFspDGSng=","ipv6_addr_in":"2001:ac8:9a:76::1f","same_ip":true},{"hostname":"us-dal-wg-002","location":"us-dal","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.211.2","include_in_country":true,"weight":100,"public_key":"OYG1hxzz3kUGpVeGjx9DcCYreMO3S6tZN17iHUK+zDE=","ipv6_addr_in":"2001:ac8:9a:75::2f","same_ip":true},{"hostname":"us-dal-wg-003","location":"us-dal","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.211.130","include_in_country":true,"weight":100,"public_key":"jn/i/ekJOkkRUdMj2I4ViUKd3d/LAdTQ+ICKmBy1tkM=","ipv6_addr_in":"2001:ac8:9a:78::3f","same_ip":true},{"hostname":"us-dal-wg-101","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.8","include_in_country":true,"weight":1,"public_key":"fZXw+9I+tAxRaiYB1tbPYa9EFulu3TJ10SAZoHrS/0U=","ipv6_addr_in":"2606:2e00:8007:1::a30f","same_ip":true},{"hostname":"us-dal-wg-102","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.9","include_in_country":true,"weight":1,"public_key":"C6fRMWc8NehE1Nsn4VTI5RQ1vkAf+nG+IN+jbC1MgSo=","ipv6_addr_in":"2606:2e00:8007:1::a31f","same_ip":true},{"hostname":"us-dal-wg-103","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.10","include_in_country":true,"weight":1,"public_key":"WqCOcFoOHUS5w/7W+psWusNWNLQAQItMHwgBn+zU3V0=","ipv6_addr_in":"2606:2e00:8007:1::a32f","same_ip":true},{"hostname":"us-dal-wg-104","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.11","include_in_country":true,"weight":1,"public_key":"c3OgLZw8kh5k3lqACXIiShPGr8xcIfdrUs+qRW9zmk4=","ipv6_addr_in":"2606:2e00:8007:1::a33f","same_ip":true},{"hostname":"us-dal-wg-105","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.12","include_in_country":true,"weight":1,"public_key":"REvzY8yCTggZmODs3FOjUc4uqwh4w4PCnNr7BV/7ZFw=","ipv6_addr_in":"2606:2e00:8007:1::a34f","same_ip":true},{"hostname":"us-dal-wg-106","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.13","include_in_country":true,"weight":1,"public_key":"k+h3AKF7Lkw5Z2RaCQ7PJzW1zhHZ127XY2YZgKg4mAQ=","ipv6_addr_in":"2606:2e00:8007:1::a35f","same_ip":true},{"hostname":"us-dal-wg-107","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.14","include_in_country":true,"weight":1,"public_key":"Zmv3KbVF3ZSGvkWrFsNx2qGXpaNg0AC2duEwoAVZrRI=","ipv6_addr_in":"2606:2e00:8007:1::a36f","same_ip":true},{"hostname":"us-dal-wg-108","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.15","include_in_country":true,"weight":1,"public_key":"fYuciekV90AUxyJPw2SLOy0Vo73XFS30jBBGIfhvtn4=","ipv6_addr_in":"2606:2e00:8007:1::a37f","same_ip":true},{"hostname":"us-dal-wg-109","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.16","include_in_country":true,"weight":1,"public_key":"ICC/pGgEuhgJ8SZykkKBeXyqNtjHPwSTOo6xXGgMq20=","ipv6_addr_in":"2606:2e00:8007:1::a38f","same_ip":true},{"hostname":"us-dal-wg-110","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.17","include_in_country":true,"weight":1,"public_key":"USDvnCyWR5ka523xnxy9KG4rnw/3i9mBprjjp0FQ1QE=","ipv6_addr_in":"2606:2e00:8007:1::a39f","same_ip":true},{"hostname":"us-dal-wg-301","location":"us-dal","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"96.44.191.130","include_in_country":false,"weight":1,"public_key":"qWBfuOXxbsSk8Pgi9lqAzpebZtCSKHvwL7ifF5iw3lc=","ipv6_addr_in":"2607:fcd0:da80:1803::b35f","same_ip":true},{"hostname":"us-dal-wg-302","location":"us-dal","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"96.44.191.146","include_in_country":false,"weight":1,"public_key":"8M6a88xIRG1d7pRD1qTJKKJVAYjkX6/ls8D8M1A2Zxo=","ipv6_addr_in":"2607:fcd0:da80:1804::f001","same_ip":true},{"hostname":"us-dal-wg-303","location":"us-dal","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"96.44.189.98","include_in_country":false,"weight":1,"public_key":"9sg8LrGRk5XzHfMeAhgp9IbbqD1NKepHQ5FpBDZWOn0=","ipv6_addr_in":"2607:fcd0:da80:1801::c40f","same_ip":true},{"hostname":"us-dal-wg-401","location":"us-dal","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.200.156","include_in_country":true,"weight":5,"public_key":"xZsnCxFN7pOvx6YlTbi92copdsY5xgekTCp//VUMyhE=","ipv6_addr_in":"2a02:6ea0:d20c:3::b72f","same_ip":true},{"hostname":"us-dal-wg-402","location":"us-dal","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.200.143","include_in_country":true,"weight":100,"public_key":"sPQEji8BhxuM/Za0Q0/9aWYxyACtQF0qRpzaBLumEzo=","ipv6_addr_in":"2a02:6ea0:d20c:2::b71f","same_ip":true},{"hostname":"us-dal-wg-403","location":"us-dal","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.200.130","include_in_country":true,"weight":100,"public_key":"4s9JIhxC/D02tosXYYcgrD+pHI+C7oTAFsXzVisKjRs=","ipv6_addr_in":"2a02:6ea0:d20c:1::f001","same_ip":true},{"hostname":"us-den-wg-001","location":"us-den","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.128.194","include_in_country":true,"weight":100,"public_key":"3clcc9092sgEsFGrUfcCBUzT9tN6uy12t77uTmSLqwc=","ipv6_addr_in":"2607:9000:2000:16::f001","same_ip":true},{"hostname":"us-den-wg-002","location":"us-den","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.128.162","include_in_country":true,"weight":100,"public_key":"jh3kAesaULbfC0h7VHwNPiTrz04vPC0Aa4kwRjy2+2Q=","ipv6_addr_in":"2607:9000:2000:15::f001","same_ip":true},{"hostname":"us-den-wg-003","location":"us-den","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.128.130","include_in_country":true,"weight":100,"public_key":"v7CG+wctmTw9LxuWBp3tGARithgbDU7nZZduSefkqzg=","ipv6_addr_in":"2607:9000:2000:14::a46f","same_ip":true},{"hostname":"us-den-wg-101","location":"us-den","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.210.1","include_in_country":true,"weight":200,"public_key":"74U+9EQrMwVOafgXuSp8eaKG0+p4zjSsDe3J7+ojhx0=","ipv6_addr_in":"2a02:6ea0:d70a::b57f","same_ip":true},{"hostname":"us-den-wg-102","location":"us-den","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.210.14","include_in_country":true,"weight":200,"public_key":"T44stCRbQXFCBCcpdDbZPlNHp2eZEi91ooyk0JDC21E=","ipv6_addr_in":"2a02:6ea0:d70a:1::b58f","same_ip":true},{"hostname":"us-den-wg-103","location":"us-den","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.210.27","include_in_country":true,"weight":200,"public_key":"Az+PGHQ0xFElmRBv+PKZuRnEzKPrPtUpRD3vpxb4si4=","ipv6_addr_in":"2a02:6ea0:d70a:2::b59f","same_ip":true},{"hostname":"us-det-wg-001","location":"us-det","active":true,"owned":false,"provider":"HostRoyale","stboot":true,"ipv4_addr_in":"185.141.119.131","include_in_country":true,"weight":100,"public_key":"+USmlxhnLmlNkDnBbu+rXwjUwa383e0ilYEqPkEkNHA=","ipv6_addr_in":"2a06:3040:11:610::f001","same_ip":true},{"hostname":"us-det-wg-002","location":"us-det","active":true,"owned":false,"provider":"HostRoyale","stboot":true,"ipv4_addr_in":"185.141.119.161","include_in_country":true,"weight":100,"public_key":"cYqP1UqhOYuaj47e4jAbgL55h52L+ALjtML26OtBvFU=","ipv6_addr_in":"2a06:3040:11:610::f101","same_ip":true},{"hostname":"us-hou-wg-001","location":"us-hou","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.221.130","include_in_country":true,"weight":200,"public_key":"NKscQ4mm24nsYWfpL85Cve+BKIExR0JaysldUtVSlzg=","ipv6_addr_in":"2a02:6ea0:e001::f001","same_ip":true},{"hostname":"us-hou-wg-002","location":"us-hou","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.221.143","include_in_country":true,"weight":200,"public_key":"tzSfoiq9ZbCcE5I0Xz9kCrsWksDn0wgvaz9TiHYTmnU=","ipv6_addr_in":"2a02:6ea0:e001:1::f001","same_ip":true},{"hostname":"us-hou-wg-003","location":"us-hou","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.221.156","include_in_country":true,"weight":200,"public_key":"fNSu30TCgbADxNKACx+5qWY6XGJOga4COmTZZE0k0R4=","ipv6_addr_in":"2a02:6ea0:e001:2::b55f","same_ip":true},{"hostname":"us-hou-wg-004","location":"us-hou","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"37.19.221.169","include_in_country":true,"weight":200,"public_key":"NkZMYUEcHykPkAFdm3dE8l2U9P2mt58Dw6j6BWhzaCc=","ipv6_addr_in":"2a02:6ea0:e001:3::b56f","same_ip":true},{"hostname":"us-lax-wg-101","location":"us-lax","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.129.98","include_in_country":true,"weight":6,"public_key":"IDXrg8s0qYFAWcMcXFb6P/EHOESkTyotZCSlerQfyCQ=","ipv6_addr_in":"2607:9000:3000:15::a49f","same_ip":true},{"hostname":"us-lax-wg-102","location":"us-lax","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.129.66","include_in_country":true,"weight":6,"public_key":"Ldwvbs6mOxEbpXLRA3Z/qmEyJo2wVTdQ94+v3UFsbBw=","ipv6_addr_in":"2607:9000:3000:14::a50f","same_ip":true},{"hostname":"us-lax-wg-103","location":"us-lax","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.129.34","include_in_country":true,"weight":6,"public_key":"gabX4D/Yhut0IMl/9jRK+kMoHbkL38qaUm7r/dH5rWg=","ipv6_addr_in":"2607:9000:3000:13::a51f","same_ip":true},{"hostname":"us-lax-wg-201","location":"us-lax","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.203.2","include_in_country":false,"weight":1,"public_key":"xWobY7DWTL+vL1yD4NWwbQ3V4e8qz10Yz+EFdkIjq0Y=","ipv6_addr_in":"2a02:6ea0:c859:1::a01f","same_ip":true},{"hostname":"us-lax-wg-202","location":"us-lax","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.203.15","include_in_country":false,"weight":1,"public_key":"SDnciTlujuy2APFTkhzfq5X+LDi+lhfU38wI2HBCxxs=","ipv6_addr_in":"2a02:6ea0:c859:2::a02f","same_ip":true},{"hostname":"us-lax-wg-203","location":"us-lax","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"169.150.203.28","include_in_country":false,"weight":1,"public_key":"W6/Yamxmfx3geWTwwtBbJe/J8UdEzOfa6M+cEpNPIwg=","ipv6_addr_in":"2a02:6ea0:c859:3::a03f","same_ip":true},{"hostname":"us-lax-wg-301","location":"us-lax","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"198.96.89.194","include_in_country":false,"weight":1,"public_key":"U4uhpKZm/G1i/qU6s0puSuI+UL4bNCWTuiZBJ8Hdi1Y=","ipv6_addr_in":"2607:fcd0:100:7c03::f001","same_ip":true},{"hostname":"us-lax-wg-302","location":"us-lax","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"204.152.216.98","include_in_country":false,"weight":1,"public_key":"Ey0LihLvJ0YnkMLXK+Kcb4SniJiqoavQuASdRRFASXw=","ipv6_addr_in":"2607:fcd0:100:7c01::b29f","same_ip":true},{"hostname":"us-lax-wg-303","location":"us-lax","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"204.152.216.114","include_in_country":false,"weight":1,"public_key":"AcExK2CiCHYWU6Sft49uYnLUhIZiId1M+ISzupOJznI=","ipv6_addr_in":"2607:fcd0:100:7c02::b30f","same_ip":true},{"hostname":"us-lax-wg-401","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.173.2","include_in_country":true,"weight":100,"public_key":"KX+59wAvZwSKv/MVHsFVQS1j9Loaol0c8oOI/BGf3Bk=","ipv6_addr_in":"2a0d:5600:8:4::d1f","same_ip":true},{"hostname":"us-lax-wg-402","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.173.66","include_in_country":true,"weight":100,"public_key":"EKZXvHlSDeqAjfC/m9aQR0oXfQ6Idgffa9L0DH5yaCo=","ipv6_addr_in":"2a0d:5600:8:6::d2f","same_ip":true},{"hostname":"us-lax-wg-403","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.173.130","include_in_country":true,"weight":100,"public_key":"mBqaWs6pti93U+1feyj6LRzzveNmeklancn3XuKoPWI=","ipv6_addr_in":"2a0d:5600:8:d::d3f","same_ip":true},{"hostname":"us-lax-wg-404","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.173.194","include_in_country":true,"weight":100,"public_key":"YGl+lj1tk08U9x9Z73zowUW3rk8i0nPmYkxGzNdE4VM=","ipv6_addr_in":"2a0d:5600:8:2f::f001","same_ip":true},{"hostname":"us-lax-wg-405","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.172.2","include_in_country":true,"weight":100,"public_key":"Pe86fNGUd+AIeaabsn7Hk4clQf1kJvxOXPykfVGjeho=","ipv6_addr_in":"2a0d:5600:8:37::f001","same_ip":true},{"hostname":"us-lax-wg-501","location":"us-lax","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"23.162.40.4","include_in_country":true,"weight":100,"public_key":"IHFvbxyz7qK6x811dNNf0rs1MFLaZwW9C3FNwOLz6hY=","ipv6_addr_in":"2602:fa19:4::f001","same_ip":true},{"hostname":"us-lax-wg-502","location":"us-lax","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"23.162.40.45","include_in_country":true,"weight":100,"public_key":"L3P0XU2RveHw0l845ME8X24xy3oOTMr9pTHkNo8Aw10=","ipv6_addr_in":"2602:fa19:4::f101","same_ip":true},{"hostname":"us-lax-wg-503","location":"us-lax","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"23.162.40.86","include_in_country":true,"weight":100,"public_key":"tzDBizpxIHNLPvVdW3pop65cwWNkL73Gam3DUxHDfns=","ipv6_addr_in":"2602:fa19:4::f201","same_ip":true},{"hostname":"us-mia-wg-001","location":"us-mia","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.142.219","include_in_country":true,"weight":5,"public_key":"FVEKAMJqaJU2AwWn5Mg9TK9IAfJc4XDUmSzEeC/VXGs=","ipv6_addr_in":"2a02:6ea0:cc1f:2::b62f","same_ip":true},{"hostname":"us-mia-wg-002","location":"us-mia","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.142.206","include_in_country":true,"weight":200,"public_key":"H5t7PsMDnUAHrR8D2Jt3Mh6N6w43WmCzrOHShlEU+zw=","ipv6_addr_in":"2a02:6ea0:cc1f:1::b61f","same_ip":true},{"hostname":"us-mia-wg-003","location":"us-mia","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"45.134.142.193","include_in_country":true,"weight":200,"public_key":"N/3F0QvCuiWWzCwaJmnPZO53LZrKn6sr7rItecrQSQY=","ipv6_addr_in":"2a02:6ea0:cc1f::f001","same_ip":true},{"hostname":"us-mia-wg-101","location":"us-mia","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.187.2","include_in_country":true,"weight":100,"public_key":"50/sEK7t3on/H2sunx+gzIjJI6E9/Y6gHOHQrvzsij4=","ipv6_addr_in":"2a0d:5600:6:104::a01f","same_ip":true},{"hostname":"us-mia-wg-102","location":"us-mia","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.187.66","include_in_country":true,"weight":100,"public_key":"sJw9LzH2sunqRes2FNi8l6+bd8jqFAiYFfUGTbCXlA4=","ipv6_addr_in":"2a0d:5600:6:105::f001","same_ip":true},{"hostname":"us-mia-wg-103","location":"us-mia","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.187.130","include_in_country":true,"weight":100,"public_key":"TpPDIhObMTeoMVx0MvSstQaIH1EfRYqW2vzGTB+ETVk=","ipv6_addr_in":"2a0d:5600:6:106::f001","same_ip":true},{"hostname":"us-mia-wg-301","location":"us-mia","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"173.44.63.66","include_in_country":false,"weight":10,"public_key":"nCr87vBNEwrERnkcDhWENNVIMaLF+C0p3h9nqwguO2g=","ipv6_addr_in":"2607:ff48:aa81:2602::b25f","same_ip":true},{"hostname":"us-mia-wg-302","location":"us-mia","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"104.129.41.194","include_in_country":true,"weight":10,"public_key":"voRd3Wi8W4kaEMIJMy7IBkpkAVxQkYF0VubbK1+zgR8=","ipv6_addr_in":"2607:ff48:aa81:2603::b26f","same_ip":true},{"hostname":"us-nyc-wg-301","location":"us-nyc","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"143.244.47.65","include_in_country":true,"weight":100,"public_key":"IzqkjVCdJYC1AShILfzebchTlKCqVCt/SMEXolaS3Uc=","ipv6_addr_in":"2a02:6ea0:c43f::f001","same_ip":true},{"hostname":"us-nyc-wg-302","location":"us-nyc","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"143.244.47.78","include_in_country":true,"weight":100,"public_key":"gH/fZJwc9iLv9fazk09J/DUWT2X7/LFXijRS15e2n34=","ipv6_addr_in":"2a02:6ea0:c43f:1::f001","same_ip":true},{"hostname":"us-nyc-wg-303","location":"us-nyc","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"143.244.47.91","include_in_country":true,"weight":100,"public_key":"KRO+RzrFV92Ah+qpHgAMKZH2jtjRlmJ4ayl0gletY3c=","ipv6_addr_in":"2a02:6ea0:c43f:2::b52f","same_ip":true},{"hostname":"us-nyc-wg-401","location":"us-nyc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.136.34","include_in_country":true,"weight":1,"public_key":"4oR0oc3cyktCoQ1eygZ/EZeCNeI6eQnQJNRuBmRne2Q=","ipv6_addr_in":"2607:9000:a000:12::f001","same_ip":true},{"hostname":"us-nyc-wg-402","location":"us-nyc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.136.66","include_in_country":true,"weight":1,"public_key":"/o79urfCcNSCTD4OCPNxn6qoWMchQ5Za6p6hf5cxmwE=","ipv6_addr_in":"2607:9000:a000:13::f001","same_ip":true},{"hostname":"us-nyc-wg-403","location":"us-nyc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.136.98","include_in_country":true,"weight":1,"public_key":"pFM95uwAFj62uYDkJXcAPYaPmy+nl+dd92ZLV9bWbHQ=","ipv6_addr_in":"2607:9000:a000:14::f001","same_ip":true},{"hostname":"us-nyc-wg-404","location":"us-nyc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.136.194","include_in_country":true,"weight":100,"public_key":"pCZ9NnIgAEwrDy4H/eGz8NvNcbAg7UGFTGYruyCfVwU=","ipv6_addr_in":"2607:9000:a000:17::f001","same_ip":true},{"hostname":"us-nyc-wg-501","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.165.2","include_in_country":true,"weight":100,"public_key":"FMNXnFgDHNTrT9o49U8bb3Z8J90LZzVJPpRzKtJM9W8=","ipv6_addr_in":"2a0d:5600:24:2b6::f001","same_ip":true},{"hostname":"us-nyc-wg-502","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.165.130","include_in_country":true,"weight":100,"public_key":"cmUR4g9aIFDa5Xnp4B6Zjyp20jwgTTMgBdhcdvDV0FM=","ipv6_addr_in":"2a0d:5600:24:2b8::f001","same_ip":true},{"hostname":"us-nyc-wg-503","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.165.194","include_in_country":true,"weight":100,"public_key":"czE6NJ8CccA5jnJkKoZGDpMXFqSudeVTzxU5scLP/H8=","ipv6_addr_in":"2a0d:5600:24:2b9::f001","same_ip":true},{"hostname":"us-nyc-wg-504","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.166.130","include_in_country":true,"weight":100,"public_key":"MVa5yuoYnjXJtSCeBsyvaemuaK4KFN1p78+37Nvm2m0=","ipv6_addr_in":"2a0d:5600:24:2c2::f001","same_ip":true},{"hostname":"us-nyc-wg-505","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.166.194","include_in_country":true,"weight":100,"public_key":"jrjogHbVDuPxyloBldvtB51TmebNJo+4rW2JFrN33iM=","ipv6_addr_in":"2a0d:5600:24:2c3::f001","same_ip":true},{"hostname":"us-nyc-wg-601","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.185.2","include_in_country":true,"weight":100,"public_key":"OKyEPafS1lnUTWqtVeWElkTzcmkvLi9dncBHbSyFrH8=","ipv6_addr_in":"2a0d:5600:24:136a::f001","same_ip":true},{"hostname":"us-nyc-wg-602","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.168.130","include_in_country":true,"weight":100,"public_key":"4Lg7yQlukAMp6EX+2Ap+q4O+QIV/OEZyybtFJmN9umw=","ipv6_addr_in":"2a0d:5600:24:1378::f001","same_ip":true},{"hostname":"us-nyc-wg-603","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.168.66","include_in_country":true,"weight":100,"public_key":"s3N8Xeh6khECbgRYPk9pp5slw2uE0deOxa9rSJ6bzwE=","ipv6_addr_in":"2a0d:5600:24:1377::f001","same_ip":true},{"hostname":"us-nyc-wg-604","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.171.66","include_in_country":true,"weight":100,"public_key":"FIcFPDjxfF24xBrv+W7Bcqb2wADSWd+HAWPKYo6xZEk=","ipv6_addr_in":"2a0d:5600:24:1372::f001","same_ip":true},{"hostname":"us-nyc-wg-605","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.171.130","include_in_country":true,"weight":100,"public_key":"78nFhfPEjrfOxBkUf2ylM7w6upYBEcHXm93sr8CMTE4=","ipv6_addr_in":"2a0d:5600:24:1374::f001","same_ip":true},{"hostname":"us-phx-wg-101","location":"us-phx","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.133.98","include_in_country":true,"weight":5,"public_key":"Tg5LXnudnxEjf6pp7+T0QKCU9K3jzwdA1/l0negOHBk=","ipv6_addr_in":"2607:9000:7000:14::103f","same_ip":true},{"hostname":"us-phx-wg-102","location":"us-phx","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.133.130","include_in_country":true,"weight":1,"public_key":"1BbuYcr+WcmgcUhZTJ48GxOjQW0k4iEYBnn1Axhm1yA=","ipv6_addr_in":"2607:9000:7000:15::b89f","same_ip":true},{"hostname":"us-phx-wg-103","location":"us-phx","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.133.162","include_in_country":true,"weight":5,"public_key":"aEJhNzQJYMH9VzB7bxhimyUFz3uo4mp1RD9VY3KAEWs=","ipv6_addr_in":"2607:9000:7000:16::f001","same_ip":true},{"hostname":"us-qas-wg-001","location":"us-qas","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.135.34","include_in_country":true,"weight":100,"public_key":"UKNLCimke54RqRdj6UFyIuBO6nv2VVpDT3vM9N25VyI=","ipv6_addr_in":"2607:9000:9000:12::b46f","same_ip":true},{"hostname":"us-qas-wg-002","location":"us-qas","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.135.66","include_in_country":true,"weight":100,"public_key":"UUCBSYnGq+zEDqA6Wyse3JXv8fZuqKEgavRZTnCXlBg=","ipv6_addr_in":"2607:9000:9000:13::b47f","same_ip":true},{"hostname":"us-qas-wg-003","location":"us-qas","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.135.98","include_in_country":true,"weight":100,"public_key":"0s0NdIzo+pq0OiHstZHqapYsdevGQGopQ5NM54g/9jo=","ipv6_addr_in":"2607:9000:9000:14::b48f","same_ip":true},{"hostname":"us-qas-wg-004","location":"us-qas","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.135.130","include_in_country":true,"weight":100,"public_key":"TvqnL6VkJbz0KrjtHnUYWvA7zRt9ysI64LjTOx2vmm4=","ipv6_addr_in":"2607:9000:9000:15::b49f","same_ip":true},{"hostname":"us-qas-wg-102","location":"us-qas","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"185.156.46.143","include_in_country":true,"weight":100,"public_key":"5hlEb3AjTzVIJyYWCYvJvbgA4p25Ltfp2cYnys90LQ0=","ipv6_addr_in":"2a02:6ea0:e206:2::a02f","same_ip":true},{"hostname":"us-qas-wg-103","location":"us-qas","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"185.156.46.156","include_in_country":true,"weight":100,"public_key":"oD9IFZsA5sync37K/sekVXaww76MwA3IvDRpR/irZWQ=","ipv6_addr_in":"2a02:6ea0:e206:3::a03f","same_ip":true},{"hostname":"us-rag-wg-101","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.82","include_in_country":true,"weight":5,"public_key":"tKUaUnY6dJhRx3zCMAFMa1I7baVt5QrpnmdRsW99MWk=","ipv6_addr_in":"2607:9000:4000:15::b83f","same_ip":true},{"hostname":"us-rag-wg-102","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.98","include_in_country":true,"weight":5,"public_key":"XT06PnP77El1DOWfg5Kq6GiPzzfvQbTFfWlHPws/TQ0=","ipv6_addr_in":"2607:9000:4000:16::b84f","same_ip":true},{"hostname":"us-rag-wg-103","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.114","include_in_country":true,"weight":5,"public_key":"4xCeK68I0TXZoy1e8VeQDCea/6Qeu57IAtCi8Lnllik=","ipv6_addr_in":"2607:9000:4000:17::b85f","same_ip":true},{"hostname":"us-rag-wg-104","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.130","include_in_country":true,"weight":5,"public_key":"zSuNvGa8Zk+jc2niP1s75CLTFD/1U1Fqc6ypfzO9mB0=","ipv6_addr_in":"2607:9000:4000:18::f001","same_ip":true},{"hostname":"us-rag-wg-105","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.146","include_in_country":true,"weight":5,"public_key":"XJDcYZ6peY1cfErhLQ0AqzGTxKuKXz5M//sFvEX8dAI=","ipv6_addr_in":"2607:9000:4000:19::f001","same_ip":true},{"hostname":"us-sea-wg-001","location":"us-sea","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.43.91","include_in_country":true,"weight":20,"public_key":"bZQF7VRDRK/JUJ8L6EFzF/zRw2tsqMRk6FesGtTgsC0=","ipv6_addr_in":"2a02:6ea0:d80b:3::b75f","same_ip":true},{"hostname":"us-sea-wg-002","location":"us-sea","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.43.78","include_in_country":true,"weight":20,"public_key":"Xt80FGN9eLy1vX3F29huj6oW2MnQt7ne3DMBpo525Qw=","ipv6_addr_in":"2a02:6ea0:d80b:2::f001","same_ip":true},{"hostname":"us-sea-wg-003","location":"us-sea","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"138.199.43.65","include_in_country":true,"weight":20,"public_key":"4ke8ZSsroiI6Sp23OBbMAU6yQmdF3xU2N8CyzQXE/Qw=","ipv6_addr_in":"2a02:6ea0:d80b:1::b73f","same_ip":true},{"hostname":"us-sea-wg-101","location":"us-sea","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.131.130","include_in_country":true,"weight":20,"public_key":"200em73iD9942d9hlHonAfNXGWwFQcicBVGHeHbdxVM=","ipv6_addr_in":"2607:9000:5000:15::b77f","same_ip":true},{"hostname":"us-sea-wg-102","location":"us-sea","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.131.162","include_in_country":true,"weight":5,"public_key":"YwwaW1/1vFJKp22Je7btEhVXTzTckxMF1qesHN4T3QA=","ipv6_addr_in":"2607:9000:5000:16::b78f","same_ip":true},{"hostname":"us-sea-wg-103","location":"us-sea","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.131.98","include_in_country":true,"weight":20,"public_key":"fU4oTJhFtwvmk0odRe9Jatc+DMh9gKz49WSzO0psCmU=","ipv6_addr_in":"2607:9000:5000:14::b03f","same_ip":true},{"hostname":"us-sea-wg-201","location":"us-sea","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"199.229.250.52","include_in_country":true,"weight":1,"public_key":"K+Xt/lYTSTavIW8RoQjzWI7tExy6sp1FqBi3n5pH5SI=","ipv6_addr_in":"2607:f7a0:c:4::c09f","same_ip":true},{"hostname":"us-sea-wg-202","location":"us-sea","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"199.229.250.53","include_in_country":true,"weight":1,"public_key":"t2x4A+F04hKfxIHMcY2RswaVyj3XHelTT8Q1FAwBIj4=","ipv6_addr_in":"2607:f7a0:c:4::c10f","same_ip":true},{"hostname":"us-sea-wg-203","location":"us-sea","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"199.229.250.54","include_in_country":true,"weight":1,"public_key":"eS44Rs1j3BotLKH8AV78KGZQtsMQKpjdYS9chXdxPnw=","ipv6_addr_in":"2607:f7a0:c:4::c11f","same_ip":true},{"hostname":"us-sea-wg-204","location":"us-sea","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"199.229.250.55","include_in_country":true,"weight":1,"public_key":"WyzaVvsFivIx7iC+bYbEV5OhtjSw3aqjU5sB3DltQxI=","ipv6_addr_in":"2607:f7a0:c:4::f301","same_ip":true},{"hostname":"us-sea-wg-205","location":"us-sea","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"199.229.250.56","include_in_country":true,"weight":1,"public_key":"vnD/2bCGqH4b6zZSRuLGSw9oN4NhQdTW9jlMaa2N1AU=","ipv6_addr_in":"2607:f7a0:c:4::f401","same_ip":true},{"hostname":"us-sea-wg-206","location":"us-sea","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"199.229.250.57","include_in_country":true,"weight":1,"public_key":"1TYUyuvJi+RQETmW3aKJDS5p9K7kutK+Qp4ooy92CBQ=","ipv6_addr_in":"2607:f7a0:c:4::f501","same_ip":true},{"hostname":"us-sea-wg-207","location":"us-sea","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"199.229.250.58","include_in_country":true,"weight":1,"public_key":"mdYjW/giLeamWPUuHxLAIcornNrH/2HQrixhBpQZmHA=","ipv6_addr_in":"2607:f7a0:c:4::f601","same_ip":true},{"hostname":"us-sea-wg-208","location":"us-sea","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"199.229.250.59","include_in_country":true,"weight":1,"public_key":"k4ah0qvHgn5IsalvehE7GPiDC4BOE9botvd+KITdtyg=","ipv6_addr_in":"2607:f7a0:c:4::f701","same_ip":true},{"hostname":"us-sea-wg-301","location":"us-sea","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"104.129.57.66","include_in_country":false,"weight":1,"public_key":"ekaodfDtCmMmHBPWT04FObtHi9uxCn9mI2NB6WAsS0U=","ipv6_addr_in":"2607:fcd0:cd00:a00::b27f","same_ip":true},{"hostname":"us-sea-wg-302","location":"us-sea","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"173.205.93.2","include_in_country":false,"weight":1,"public_key":"Plbre6XhYWgXzdAUD94/gqSy6C9z/nD40U2gIt+MAGQ=","ipv6_addr_in":"2607:fcd0:cd00:a01::b28f","same_ip":true},{"hostname":"us-sjc-wg-001","location":"us-sjc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.134.98","include_in_country":false,"weight":50,"public_key":"Ow25Pdtyqbv/Y0I0myNixjJ2iljsKcH04PWvtJqbmCk=","ipv6_addr_in":"2607:9000:8000:14::f001","same_ip":true},{"hostname":"us-sjc-wg-002","location":"us-sjc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.134.130","include_in_country":true,"weight":50,"public_key":"aOt3gFGc0a0UMAdcxhBWX9TCnEabe2s66MHzjXU50Tc=","ipv6_addr_in":"2607:9000:8000:15::b95f","same_ip":true},{"hostname":"us-sjc-wg-003","location":"us-sjc","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.134.162","include_in_country":true,"weight":50,"public_key":"Vim/OUBT3Bogv+FF623pAHXc/vmRwur2JKcNsLHQH1o=","ipv6_addr_in":"2607:9000:8000:16::b96f","same_ip":true},{"hostname":"us-sjc-wg-101","location":"us-sjc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.165.211","include_in_country":true,"weight":1,"public_key":"yohC6MIq62U+BmTdBjTFBQbj5jTaxRHtVdCp5AdDgAs=","ipv6_addr_in":"2607:f7a0:16:5::c01f","same_ip":true},{"hostname":"us-sjc-wg-102","location":"us-sjc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.165.212","include_in_country":true,"weight":1,"public_key":"wfFi5sBBThR9EK1US0dbwaOiuNMIBpBBhEif9EnUeCM=","ipv6_addr_in":"2607:f7a0:16:5::c02f","same_ip":true},{"hostname":"us-sjc-wg-103","location":"us-sjc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.165.213","include_in_country":true,"weight":1,"public_key":"5AsmDtBqLureV4JcG+dwFq35hUaAff4NzLCkJDkoWQQ=","ipv6_addr_in":"2607:f7a0:16:5::c03f","same_ip":true},{"hostname":"us-sjc-wg-104","location":"us-sjc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.165.214","include_in_country":true,"weight":1,"public_key":"fUjjvrtnbokobdzudzXPzCM6Fli28Tsg5kArztU0YnU=","ipv6_addr_in":"2607:f7a0:16:5::c04f","same_ip":true},{"hostname":"us-sjc-wg-105","location":"us-sjc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.165.215","include_in_country":true,"weight":1,"public_key":"m0PSpvahFXuYOtGZ9hFAMErzKW7vhwqyd82rw+yBHz0=","ipv6_addr_in":"2607:f7a0:16:5::f401","same_ip":true},{"hostname":"us-sjc-wg-106","location":"us-sjc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.165.216","include_in_country":true,"weight":1,"public_key":"9xV2ZXE1dVChbxu/ca4jfXoCnYFv8fbP/OCFySD6RjA=","ipv6_addr_in":"2607:f7a0:16:5::f501","same_ip":true},{"hostname":"us-sjc-wg-107","location":"us-sjc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.165.217","include_in_country":true,"weight":1,"public_key":"2p37fAPhw+2uPJ5pP5Iy8hgs7506k+8ITqPIzbaa4zQ=","ipv6_addr_in":"2607:f7a0:16:5::f601","same_ip":true},{"hostname":"us-sjc-wg-108","location":"us-sjc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.165.218","include_in_country":true,"weight":1,"public_key":"x9/CJ28JOHah+HPRKQpVuCLL3v3eMWj7Xa7dotpPX2c=","ipv6_addr_in":"2607:f7a0:16:5::f701","same_ip":true},{"hostname":"us-sjc-wg-301","location":"us-sjc","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"142.147.89.195","include_in_country":true,"weight":100,"public_key":"f3bMFNG3xcXRN/i0jHxo68CXFcNNlennuf1jdkPMEVM=","ipv6_addr_in":"2604:e8c0:7::b66f","same_ip":true},{"hostname":"us-sjc-wg-302","location":"us-sjc","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"142.147.89.210","include_in_country":true,"weight":100,"public_key":"8wVb4HUgmpQEa5a1Q8Ff1hTDTJVaHts487bksJVugEo=","ipv6_addr_in":"2604:e8c0:7::f001","same_ip":true},{"hostname":"us-sjc-wg-303","location":"us-sjc","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"142.147.89.225","include_in_country":true,"weight":100,"public_key":"2ZQTRk/3jT+ccfG3G/QoJV3NFC4CFHQwGBCSokOvBnA=","ipv6_addr_in":"2604:e8c0:7::b68f","same_ip":true},{"hostname":"us-slc-wg-101","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.147","include_in_country":true,"weight":1,"public_key":"dbsApGxL4oNd6CyjPrtiV6ep+C1HaFuYGd0DPCHMF2o=","ipv6_addr_in":"2606:2e00:0:b9::b34f","same_ip":true},{"hostname":"us-slc-wg-102","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.138","include_in_country":true,"weight":1,"public_key":"g6yfZKBIS6BtXdTb5yXXVmOkkQ1OBxxJS3H67mebclw=","ipv6_addr_in":"2606:2e00:0:b9::b35f","same_ip":true},{"hostname":"us-slc-wg-103","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.139","include_in_country":true,"weight":1,"public_key":"ioipHdOYhc4nVsQKghmJy/vvnMI38VLLFNZXWgxxOx8=","ipv6_addr_in":"2606:2e00:0:b9::b36f","same_ip":true},{"hostname":"us-slc-wg-104","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.140","include_in_country":true,"weight":1,"public_key":"8gcGDG4XVifgKgjpkiRSxI4QA0lhU1LGX7v7ZL4AXxE=","ipv6_addr_in":"2606:2e00:0:b9::b37f","same_ip":true},{"hostname":"us-slc-wg-105","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.141","include_in_country":true,"weight":1,"public_key":"vkbSMnaddVm4YWkuuf8rOSc45XTfpVLJEom0FaJWq2g=","ipv6_addr_in":"2606:2e00:0:b9::f401","same_ip":true},{"hostname":"us-slc-wg-106","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.142","include_in_country":true,"weight":1,"public_key":"abx3jjkKD+7abroGzeELm4Esa4bESJV72Fm9Tp+YqAE=","ipv6_addr_in":"2606:2e00:0:b9::f501","same_ip":true},{"hostname":"us-slc-wg-107","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.143","include_in_country":true,"weight":1,"public_key":"dJX3V47dAZWGc7BeJCvDfwSqdKRsfPUT9Lm7LzPs2CU=","ipv6_addr_in":"2606:2e00:0:b9::f601","same_ip":true},{"hostname":"us-slc-wg-108","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.144","include_in_country":true,"weight":1,"public_key":"/fbfBjrhWKRTgOPy+esHuoeFCJWGX+nCYgTo8uKTMCE=","ipv6_addr_in":"2606:2e00:0:b9::f701","same_ip":true},{"hostname":"us-slc-wg-109","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.145","include_in_country":true,"weight":1,"public_key":"dClWdBHZT7dwqXzIRzit6CIaJYAFtTL/yYZ8Knj8Cjk=","ipv6_addr_in":"2606:2e00:0:b9::f801","same_ip":true},{"hostname":"us-uyk-wg-101","location":"us-uyk","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"209.54.101.130","include_in_country":false,"weight":1,"public_key":"25c8tyAhFiHXwp71beltk/KmAn0fsXGEl6nnNQQjmHI=","ipv6_addr_in":"2607:fcd0:ccc0:1d02::b37f","same_ip":true},{"hostname":"us-uyk-wg-102","location":"us-uyk","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"104.223.118.34","include_in_country":false,"weight":1,"public_key":"fD/JDsMLFxEZ7awcJJB9h0mjfRlcEvwF8e7arB2fHhU=","ipv6_addr_in":"2607:fcd0:ccc0:1d03::b38f","same_ip":true},{"hostname":"us-uyk-wg-103","location":"us-uyk","active":true,"owned":false,"provider":"Quadranet","stboot":true,"ipv4_addr_in":"173.205.85.34","include_in_country":false,"weight":1,"public_key":"Tysz0Ii2m+DsyhcWoQWxsXUdJxu1lKln4F7ML+nWPXA=","ipv6_addr_in":"2607:fcd0:ccc0:1d05::c41f","same_ip":true},{"hostname":"za-jnb-wg-001","location":"za-jnb","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"154.47.30.130","include_in_country":true,"weight":100,"public_key":"5dOGXJ9JK/Bul0q57jsuvjNnc15gRpSO1rMbxkf4J2M=","ipv6_addr_in":"2a02:6ea0:f206::f001","same_ip":true},{"hostname":"za-jnb-wg-002","location":"za-jnb","active":true,"owned":false,"provider":"DataPacket","stboot":true,"ipv4_addr_in":"154.47.30.143","include_in_country":true,"weight":100,"public_key":"lTq6+yUYfYsXwBpj/u3LnYqpLhW8ZJXQQ19N/ybP2B8=","ipv6_addr_in":"2a02:6ea0:f207::f001","same_ip":true}],"port_ranges":[[53,53],[123,123],[4000,33433],[33565,51820],[52000,60000]],"ipv4_gateway":"10.64.0.1","ipv6_gateway":"fc00:bbbb:bbbb:bb01::1"},"bridge":{"relays":[{"hostname":"au-syd-br-001","location":"au-syd","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.141.154","include_in_country":true,"weight":100},{"hostname":"be-bru-br-001","location":"be-bru","active":false,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"37.120.218.170","include_in_country":true,"weight":100},{"hostname":"ca-mtr-br-001","location":"ca-mtr","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"217.138.213.18","include_in_country":true,"weight":100},{"hostname":"ca-tor-br-101","location":"ca-tor","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.44.140.226","include_in_country":true,"weight":100},{"hostname":"ch-zrh-br-001","location":"ch-zrh","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.127.117","include_in_country":true,"weight":100},{"hostname":"ch-zrh-br-301","location":"ch-zrh","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"91.193.4.210","include_in_country":true,"weight":100},{"hostname":"cz-prg-br-101","location":"cz-prg","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"217.138.199.106","include_in_country":true,"weight":100},{"hostname":"de-fra-br-001","location":"de-fra","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.155.117","include_in_country":true,"weight":100},{"hostname":"fi-hel-br-101","location":"fi-hel","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"193.138.7.132","include_in_country":true,"weight":100},{"hostname":"fr-par-br-001","location":"fr-par","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.32.126.117","include_in_country":false,"weight":100},{"hostname":"gb-lon-br-001","location":"gb-lon","active":false,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"141.98.252.66","include_in_country":true,"weight":100},{"hostname":"gb-mnc-br-001","location":"gb-mnc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"89.238.134.58","include_in_country":true,"weight":100},{"hostname":"hk-hkg-br-201","location":"hk-hkg","active":true,"owned":false,"provider":"xtom","stboot":true,"ipv4_addr_in":"103.125.233.210","include_in_country":true,"weight":100},{"hostname":"jp-tyo-br-201","location":"jp-tyo","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"185.242.4.34","include_in_country":true,"weight":100},{"hostname":"nl-ams-br-001","location":"nl-ams","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.134.116","include_in_country":true,"weight":100},{"hostname":"no-osl-br-001","location":"no-osl","active":false,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"91.90.44.10","include_in_country":false,"weight":100},{"hostname":"no-svg-br-001","location":"no-svg","active":true,"owned":true,"provider":"Blix","stboot":true,"ipv4_addr_in":"194.127.199.245","include_in_country":true,"weight":100},{"hostname":"pl-waw-br-001","location":"pl-waw","active":false,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"5.253.206.194","include_in_country":true,"weight":100},{"hostname":"se-got-br-001","location":"se-got","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.213.154.117","include_in_country":true,"weight":100},{"hostname":"se-mma-br-001","location":"se-mma","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"193.138.218.71","include_in_country":true,"weight":100},{"hostname":"se-sto-br-001","location":"se-sto","active":true,"owned":true,"provider":"31173","stboot":true,"ipv4_addr_in":"185.65.135.115","include_in_country":true,"weight":100},{"hostname":"sg-sin-br-101","location":"sg-sin","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.192.34","include_in_country":true,"weight":100},{"hostname":"us-atl-br-101","location":"us-atl","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"66.115.180.241","include_in_country":true,"weight":100},{"hostname":"us-chi-br-001","location":"us-chi","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"68.235.44.130","include_in_country":true,"weight":100},{"hostname":"us-dal-br-101","location":"us-dal","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"174.127.113.18","include_in_country":true,"weight":100},{"hostname":"us-lax-br-401","location":"us-lax","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"62.133.44.202","include_in_country":true,"weight":100},{"hostname":"us-mia-br-101","location":"us-mia","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"146.70.183.34","include_in_country":true,"weight":100},{"hostname":"us-nyc-br-501","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"212.103.48.226","include_in_country":true,"weight":100},{"hostname":"us-nyc-br-601","location":"us-nyc","active":true,"owned":false,"provider":"M247","stboot":true,"ipv4_addr_in":"38.132.121.146","include_in_country":true,"weight":100},{"hostname":"us-rag-br-101","location":"us-rag","active":true,"owned":false,"provider":"Tzulo","stboot":true,"ipv4_addr_in":"198.54.130.178","include_in_country":true,"weight":100},{"hostname":"us-slc-br-101","location":"us-slc","active":true,"owned":false,"provider":"100TB","stboot":true,"ipv4_addr_in":"69.4.234.146","include_in_country":false,"weight":100}],"shadowsocks":[{"protocol":"tcp","port":443,"cipher":"aes-256-gcm","password":"mullvad"},{"protocol":"udp","port":1234,"cipher":"aes-256-cfb","password":"mullvad"},{"protocol":"udp","port":1236,"cipher":"aes-256-gcm","password":"mullvad"}]}} \ No newline at end of file
diff --git a/ios/RelayCache/CachedRelays.swift b/ios/MullvadREST/Relay/CachedRelays.swift
index 499eb9cde3..f22b236e87 100644
--- a/ios/RelayCache/CachedRelays.swift
+++ b/ios/MullvadREST/Relay/CachedRelays.swift
@@ -7,7 +7,6 @@
//
import Foundation
-import MullvadREST
/// A struct that represents the relay cache on disk
public struct CachedRelays: Codable, Equatable {
diff --git a/ios/RelaySelector/Haversine.swift b/ios/MullvadREST/Relay/Haversine.swift
index 946b3ca2c3..946b3ca2c3 100644
--- a/ios/RelaySelector/Haversine.swift
+++ b/ios/MullvadREST/Relay/Haversine.swift
diff --git a/ios/RelaySelector/Midpoint.swift b/ios/MullvadREST/Relay/Midpoint.swift
index d01983a96f..d01983a96f 100644
--- a/ios/RelaySelector/Midpoint.swift
+++ b/ios/MullvadREST/Relay/Midpoint.swift
diff --git a/ios/RelayCache/RelayCache.swift b/ios/MullvadREST/Relay/RelayCache.swift
index ba7ed31cf1..6cc9ddc616 100644
--- a/ios/RelayCache/RelayCache.swift
+++ b/ios/MullvadREST/Relay/RelayCache.swift
@@ -7,7 +7,6 @@
//
import Foundation
-import MullvadREST
import MullvadTypes
public protocol RelayCacheProtocol {
diff --git a/ios/RelaySelector/RelaySelector.swift b/ios/MullvadREST/Relay/RelaySelector.swift
index 20a8496d0d..bc0378c217 100644
--- a/ios/RelaySelector/RelaySelector.swift
+++ b/ios/MullvadREST/Relay/RelaySelector.swift
@@ -7,7 +7,6 @@
//
import Foundation
-import MullvadREST
import MullvadTypes
private let defaultPort: UInt16 = 53
diff --git a/ios/MullvadREST/ExponentialBackoff.swift b/ios/MullvadREST/RetryStrategy/ExponentialBackoff.swift
index 5c94735eaa..57a54e07a9 100644
--- a/ios/MullvadREST/ExponentialBackoff.swift
+++ b/ios/MullvadREST/RetryStrategy/ExponentialBackoff.swift
@@ -32,22 +32,3 @@ struct ExponentialBackoff: IteratorProtocol {
return next
}
}
-
-struct Jittered<InnerIterator: IteratorProtocol>: IteratorProtocol
- where InnerIterator.Element == Duration {
- private var inner: InnerIterator
-
- init(_ inner: InnerIterator) {
- self.inner = inner
- }
-
- mutating func next() -> Duration? {
- guard let interval = inner.next() else { return nil }
-
- let jitter = Double.random(in: 0.0 ... 1.0)
- let millis = interval.milliseconds
- let millisWithJitter = millis.saturatingAddition(Int(Double(millis) * jitter))
-
- return .milliseconds(millisWithJitter)
- }
-}
diff --git a/ios/MullvadREST/RetryStrategy/Jittered.swift b/ios/MullvadREST/RetryStrategy/Jittered.swift
new file mode 100644
index 0000000000..271e088bbe
--- /dev/null
+++ b/ios/MullvadREST/RetryStrategy/Jittered.swift
@@ -0,0 +1,29 @@
+//
+// Jittered.swift
+// MullvadREST
+//
+// Created by Mojgan on 2023-12-08.
+// Copyright © 2023 Mullvad VPN AB. All rights reserved.
+//
+
+import Foundation
+import MullvadTypes
+
+struct Jittered<InnerIterator: IteratorProtocol>: IteratorProtocol
+ where InnerIterator.Element == Duration {
+ private var inner: InnerIterator
+
+ init(_ inner: InnerIterator) {
+ self.inner = inner
+ }
+
+ mutating func next() -> Duration? {
+ guard let interval = inner.next() else { return nil }
+
+ let jitter = Double.random(in: 0.0 ... 1.0)
+ let millis = interval.milliseconds
+ let millisWithJitter = millis.saturatingAddition(Int(Double(millis) * jitter))
+
+ return .milliseconds(millisWithJitter)
+ }
+}
diff --git a/ios/MullvadREST/RESTRetryStrategy.swift b/ios/MullvadREST/RetryStrategy/RetryStrategy.swift
index 2cd72ea53b..d7cd047b26 100644
--- a/ios/MullvadREST/RESTRetryStrategy.swift
+++ b/ios/MullvadREST/RetryStrategy/RetryStrategy.swift
@@ -1,5 +1,5 @@
//
-// RESTRetryStrategy.swift
+// RetryStrategy.swift
// MullvadREST
//
// Created by pronebird on 09/12/2021.
diff --git a/ios/MullvadTransport/URLSessionTransport.swift b/ios/MullvadREST/Transport/Direct/URLSessionTransport.swift
index 0061823085..fc5aee683b 100644
--- a/ios/MullvadTransport/URLSessionTransport.swift
+++ b/ios/MullvadREST/Transport/Direct/URLSessionTransport.swift
@@ -2,12 +2,11 @@
// URLSessionTransport.swift
// MullvadREST
//
-// Created by Sajad Vishkai on 2022-10-03.
-// Copyright © 2022 Mullvad VPN AB. All rights reserved.
+// Created by Mojgan on 2023-12-08.
+// Copyright © 2023 Mullvad VPN AB. All rights reserved.
//
import Foundation
-import MullvadREST
import MullvadTypes
extension URLSessionTask: Cancellable {}
@@ -18,6 +17,7 @@ public final class URLSessionTransport: RESTTransport {
}
public let urlSession: URLSession
+
public init(urlSession: URLSession) {
self.urlSession = urlSession
}
diff --git a/ios/MullvadREST/RESTTransport.swift b/ios/MullvadREST/Transport/RESTTransport.swift
index eb87b6db99..eb87b6db99 100644
--- a/ios/MullvadREST/RESTTransport.swift
+++ b/ios/MullvadREST/Transport/RESTTransport.swift
diff --git a/ios/MullvadREST/RESTTransportProvider.swift b/ios/MullvadREST/Transport/RESTTransportProvider.swift
index 5476338ece..5476338ece 100644
--- a/ios/MullvadREST/RESTTransportProvider.swift
+++ b/ios/MullvadREST/Transport/RESTTransportProvider.swift
diff --git a/ios/MullvadTransport/ShadowSocksProxy.swift b/ios/MullvadREST/Transport/Shadowsocks/ShadowSocksProxy.swift
index afcc32c428..afcc32c428 100644
--- a/ios/MullvadTransport/ShadowSocksProxy.swift
+++ b/ios/MullvadREST/Transport/Shadowsocks/ShadowSocksProxy.swift
diff --git a/ios/MullvadTransport/ShadowsocksConfiguration.swift b/ios/MullvadREST/Transport/Shadowsocks/ShadowsocksConfiguration.swift
index 0a145f0976..0a145f0976 100644
--- a/ios/MullvadTransport/ShadowsocksConfiguration.swift
+++ b/ios/MullvadREST/Transport/Shadowsocks/ShadowsocksConfiguration.swift
diff --git a/ios/MullvadTransport/ShadowsocksConfigurationCache.swift b/ios/MullvadREST/Transport/Shadowsocks/ShadowsocksConfigurationCache.swift
index 111215138e..b09f4afdf6 100644
--- a/ios/MullvadTransport/ShadowsocksConfigurationCache.swift
+++ b/ios/MullvadREST/Transport/Shadowsocks/ShadowsocksConfigurationCache.swift
@@ -21,7 +21,7 @@ public final class ShadowsocksConfigurationCache {
)
}
- /// Returns configration from memory cache if available, otherwise attempts to load it from disk cache before
+ /// Returns configuration from memory cache if available, otherwise attempts to load it from disk cache before
/// returning.
public func read() throws -> ShadowsocksConfiguration {
configurationLock.lock()
diff --git a/ios/MullvadTransport/URLSessionShadowsocksTransport.swift b/ios/MullvadREST/Transport/Shadowsocks/ShadowsocksTransport.swift
index ad587ba27c..c800a937ba 100644
--- a/ios/MullvadTransport/URLSessionShadowsocksTransport.swift
+++ b/ios/MullvadREST/Transport/Shadowsocks/ShadowsocksTransport.swift
@@ -7,10 +7,9 @@
//
import Foundation
-import MullvadREST
import MullvadTypes
-public final class URLSessionShadowsocksTransport: RESTTransport {
+public final class ShadowsocksTransport: RESTTransport {
/// The Shadowsocks proxy instance that proxies all the traffic it receives
private let shadowsocksProxy: ShadowsocksProxy
@@ -26,7 +25,7 @@ public final class URLSessionShadowsocksTransport: RESTTransport {
public init(
urlSession: URLSession,
- shadowsocksConfiguration: ShadowsocksConfiguration,
+ configuration: ShadowsocksConfiguration,
addressCache: REST.AddressCache
) {
self.urlSession = urlSession
@@ -35,10 +34,10 @@ public final class URLSessionShadowsocksTransport: RESTTransport {
shadowsocksProxy = ShadowsocksProxy(
forwardAddress: apiAddress.ip,
forwardPort: apiAddress.port,
- bridgeAddress: shadowsocksConfiguration.bridgeAddress,
- bridgePort: shadowsocksConfiguration.bridgePort,
- password: shadowsocksConfiguration.password,
- cipher: shadowsocksConfiguration.cipher
+ bridgeAddress: configuration.bridgeAddress,
+ bridgePort: configuration.bridgePort,
+ password: configuration.password,
+ cipher: configuration.cipher
)
}
diff --git a/ios/MullvadTransport/module.private.modulemap b/ios/MullvadREST/Transport/Shadowsocks/module.private.modulemap
index ed8bb99f2e..ed8bb99f2e 100644
--- a/ios/MullvadTransport/module.private.modulemap
+++ b/ios/MullvadREST/Transport/Shadowsocks/module.private.modulemap
diff --git a/ios/MullvadTransport/shadowsocks-proxy/.gitignore b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/.gitignore
index 2f7896d1d1..2f7896d1d1 100644
--- a/ios/MullvadTransport/shadowsocks-proxy/.gitignore
+++ b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/.gitignore
diff --git a/ios/MullvadTransport/shadowsocks-proxy/Cargo.toml b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/Cargo.toml
index d4f4623c8b..d4f4623c8b 100644
--- a/ios/MullvadTransport/shadowsocks-proxy/Cargo.toml
+++ b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/Cargo.toml
diff --git a/ios/MullvadTransport/shadowsocks-proxy/build.rs b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/build.rs
index 7154b2d785..7154b2d785 100644
--- a/ios/MullvadTransport/shadowsocks-proxy/build.rs
+++ b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/build.rs
diff --git a/ios/MullvadTransport/shadowsocks-proxy/include/shadowsocks.h b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/include/shadowsocks.h
index 1a0a856d8d..1a0a856d8d 100644
--- a/ios/MullvadTransport/shadowsocks-proxy/include/shadowsocks.h
+++ b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/include/shadowsocks.h
diff --git a/ios/MullvadTransport/shadowsocks-proxy/src/bin/run.rs b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/bin/run.rs
index 1b096a5335..1b096a5335 100644
--- a/ios/MullvadTransport/shadowsocks-proxy/src/bin/run.rs
+++ b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/bin/run.rs
diff --git a/ios/MullvadTransport/shadowsocks-proxy/src/bin/run_unsafe.rs b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/bin/run_unsafe.rs
index 805d1147a4..805d1147a4 100644
--- a/ios/MullvadTransport/shadowsocks-proxy/src/bin/run_unsafe.rs
+++ b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/bin/run_unsafe.rs
diff --git a/ios/MullvadTransport/shadowsocks-proxy/src/ffi.rs b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/ffi.rs
index be3ecf8fa0..be3ecf8fa0 100644
--- a/ios/MullvadTransport/shadowsocks-proxy/src/ffi.rs
+++ b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/ffi.rs
diff --git a/ios/MullvadTransport/shadowsocks-proxy/src/lib.rs b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/lib.rs
index 5b32627d5c..5b32627d5c 100644
--- a/ios/MullvadTransport/shadowsocks-proxy/src/lib.rs
+++ b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks-proxy/src/lib.rs
diff --git a/ios/MullvadREST/Transport/Shadowsocks/shadowsocks.h b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks.h
new file mode 100644
index 0000000000..1a0a856d8d
--- /dev/null
+++ b/ios/MullvadREST/Transport/Shadowsocks/shadowsocks.h
@@ -0,0 +1,36 @@
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+typedef struct ProxyHandle {
+ void *context;
+ uint16_t port;
+} ProxyHandle;
+
+/**
+ * # Safety
+ * `addr`, `password`, `cipher` must be valid for the lifetime of this function call and they must
+ * be backed by the amount of bytes as stored in the respective `*_len` parameters.
+ *
+ * `proxy_config` must be pointing to a valid memory region for the size of a `ProxyHandle`
+ * instance.
+ */
+int32_t start_shadowsocks_proxy(const uint8_t *forward_address,
+ uintptr_t forward_address_len,
+ uint16_t forward_port,
+ const uint8_t *addr,
+ uintptr_t addr_len,
+ uint16_t port,
+ const uint8_t *password,
+ uintptr_t password_len,
+ const uint8_t *cipher,
+ uintptr_t cipher_len,
+ struct ProxyHandle *proxy_config);
+
+/**
+ * # Safety
+ * `proxy_config` must be pointing to a valid instance of a `ProxyInstance`, as instantiated by
+ * `start_shadowsocks_proxy`.
+ */
+int32_t stop_shadowsocks_proxy(struct ProxyHandle *proxy_config);
diff --git a/ios/MullvadTransport/TransportProvider.swift b/ios/MullvadREST/Transport/TransportProvider.swift
index 88c3e1fc8a..65ff2b3209 100644
--- a/ios/MullvadTransport/TransportProvider.swift
+++ b/ios/MullvadREST/Transport/TransportProvider.swift
@@ -8,10 +8,7 @@
import Foundation
import Logging
-import MullvadREST
import MullvadTypes
-import RelayCache
-import RelaySelector
public final class TransportProvider: RESTTransportProvider {
private let urlSessionTransport: URLSessionTransport
@@ -69,12 +66,11 @@ public final class TransportProvider: RESTTransportProvider {
let shadowsocksConfiguration = try shadowsocksConfiguration()
let shadowsocksURLSession = urlSessionTransport.urlSession
- let shadowsocksTransport = URLSessionShadowsocksTransport(
+ let shadowsocksTransport = ShadowsocksTransport(
urlSession: shadowsocksURLSession,
- shadowsocksConfiguration: shadowsocksConfiguration,
+ configuration: shadowsocksConfiguration,
addressCache: addressCache
)
-
return shadowsocksTransport
} catch {
logger.error(error: error, message: "Failed to produce shadowsocks configuration.")
diff --git a/ios/MullvadREST/RESTTransportStrategy.swift b/ios/MullvadREST/Transport/TransportStrategy.swift
index d63b8c8833..d857a3406b 100644
--- a/ios/MullvadREST/RESTTransportStrategy.swift
+++ b/ios/MullvadREST/Transport/TransportStrategy.swift
@@ -1,5 +1,5 @@
//
-// RESTTransportStrategy.swift
+// TransportStrategy.swift
// MullvadREST
//
// Created by Marco Nikic on 2023-04-27.
diff --git a/ios/MullvadREST/URLSessionTransport.swift b/ios/MullvadREST/URLSessionTransport.swift
deleted file mode 100644
index c5b4cf6a67..0000000000
--- a/ios/MullvadREST/URLSessionTransport.swift
+++ /dev/null
@@ -1,89 +0,0 @@
-//
-// URLSessionTransport.swift
-// MullvadREST
-//
-// Created by Sajad Vishkai on 2022-10-03.
-// Copyright © 2022 Mullvad VPN AB. All rights reserved.
-//
-
-import Foundation
-import MullvadTypes
-
-extension URLSessionTask: Cancellable {}
-
-extension REST {
- public final class URLSessionTransport: RESTTransport {
- public var name: String {
- "url-session"
- }
-
- public let urlSession: URLSession
-
- public init(urlSession: URLSession) {
- self.urlSession = urlSession
- }
-
- public func sendRequest(
- _ request: URLRequest,
- completion: @escaping (Data?, URLResponse?, Swift.Error?) -> Void
- ) -> Cancellable {
- let dataTask = urlSession.dataTask(with: request, completionHandler: completion)
- dataTask.resume()
- return dataTask
- }
- }
-
- public final class URLSessionShadowSocksTransport: RESTTransport {
- /// The Shadowsocks proxy instance that proxies all the traffic it receives
- private let shadowSocksProxy: ShadowsocksProxy
- /// The IPv4 representation of the loopback address used by `shadowSocksProxy`
- private let localhost = "127.0.0.1"
-
- /// The `URLSession` used to send requests via `shadowSocksProxy`
- public let urlSession: URLSession
-
- public var name: String {
- "shadow-socks-url-session"
- }
-
- public init(
- urlSession: URLSession,
- shadowSocksConfiguration: ServerShadowsocks,
- shadowSocksBridgeRelay: BridgeRelay,
- addressCache: REST.AddressCache
- ) {
- self.urlSession = urlSession
- let apiAddress = addressCache.getCurrentEndpoint()
-
- shadowSocksProxy = ShadowsocksProxy(
- forwardAddress: apiAddress.ip,
- forwardPort: apiAddress.port,
- bridgeAddress: shadowSocksBridgeRelay.ipv4AddrIn,
- bridgePort: shadowSocksConfiguration.port,
- password: shadowSocksConfiguration.password,
- cipher: shadowSocksConfiguration.cipher
- )
- }
-
- public func sendRequest(
- _ request: URLRequest,
- completion: @escaping (Data?, URLResponse?, Swift.Error?) -> Void
- ) -> Cancellable {
- // Start the Shadowsocks proxy in order to get a local port
- shadowSocksProxy.start()
-
- // Copy the URL request and rewrite the host and port to point to the Shadowsocks proxy instance
- var urlRequestCopy = request
- urlRequestCopy.url = request.url.flatMap { url in
- var components = URLComponents(url: url, resolvingAgainstBaseURL: false)
- components?.host = localhost
- components?.port = Int(shadowSocksProxy.localPort())
- return components?.url
- }
-
- let dataTask = urlSession.dataTask(with: urlRequestCopy, completionHandler: completion)
- dataTask.resume()
- return dataTask
- }
- }
-}
diff --git a/ios/MullvadTransport/Info.plist b/ios/MullvadTransport/Info.plist
deleted file mode 100644
index 0c67376eba..0000000000
--- a/ios/MullvadTransport/Info.plist
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict/>
-</plist>
diff --git a/ios/MullvadTransport/MullvadTransport.h b/ios/MullvadTransport/MullvadTransport.h
deleted file mode 100644
index cd1e9b50a0..0000000000
--- a/ios/MullvadTransport/MullvadTransport.h
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// MullvadTransport.h
-// MullvadTransport
-//
-// Created by Marco Nikic on 2023-05-25.
-// Copyright © 2023 Mullvad VPN AB. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-//! Project version number for MullvadTransport.
-FOUNDATION_EXPORT double MullvadTransportVersionNumber;
-
-//! Project version string for MullvadTransport.
-FOUNDATION_EXPORT const unsigned char MullvadTransportVersionString[];
-
-// In this header, you should import all the public headers of your framework using statements like #import <MullvadTransport/PublicHeader.h>
-
-
diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj
index d009ee6201..6eed2f7b93 100644
--- a/ios/MullvadVPN.xcodeproj/project.pbxproj
+++ b/ios/MullvadVPN.xcodeproj/project.pbxproj
@@ -7,17 +7,10 @@
objects = {
/* Begin PBXBuildFile section */
- 01F1FF1E29F0627D007083C3 /* libshadowsocks_proxy.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 01F1FF1D29F0627D007083C3 /* libshadowsocks_proxy.a */; };
062B45A328FD4CA700746E77 /* le_root_cert.cer in Resources */ = {isa = PBXBuildFile; fileRef = 06799AB428F98CE700ACD94E /* le_root_cert.cer */; };
062B45BC28FD8C3B00746E77 /* RESTDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 062B45BB28FD8C3B00746E77 /* RESTDefaults.swift */; };
063687BA28EB234F00BE7161 /* PacketTunnelTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063687B928EB234F00BE7161 /* PacketTunnelTransport.swift */; };
063F026628FFE11C001FA09F /* RESTCreateApplePaymentResponse+Localization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67828F83CA50033DD93 /* RESTCreateApplePaymentResponse+Localization.swift */; };
- 063F02762902B63F001FA09F /* RelayCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 063F02752902B63F001FA09F /* RelayCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 063F02792902B63F001FA09F /* RelayCache.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 063F02732902B63F001FA09F /* RelayCache.framework */; };
- 063F027A2902B63F001FA09F /* RelayCache.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 063F02732902B63F001FA09F /* RelayCache.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- 063F027E2902B6EB001FA09F /* RelayCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5820675A26E6576800655B05 /* RelayCache.swift */; };
- 063F027F2902B6EB001FA09F /* CachedRelays.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585DA87626B024A600B8C587 /* CachedRelays.swift */; };
- 063F028F2902BD8C001FA09F /* relays.json in Resources */ = {isa = PBXBuildFile; fileRef = 58F3C0A524A50155003E76BE /* relays.json */; };
06799ACE28F98E1D00ACD94E /* MullvadREST.h in Headers */ = {isa = PBXBuildFile; fileRef = 06799ABE28F98E1D00ACD94E /* MullvadREST.h */; settings = {ATTRIBUTES = (Public, ); }; };
06799AD128F98E1D00ACD94E /* MullvadREST.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06799ABC28F98E1D00ACD94E /* MullvadREST.framework */; };
06799AD228F98E1D00ACD94E /* MullvadREST.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 06799ABC28F98E1D00ACD94E /* MullvadREST.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
@@ -36,7 +29,7 @@
06799AE728F98E4800ACD94E /* RESTURLSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE66528F83CA30033DD93 /* RESTURLSession.swift */; };
06799AEA28F98E4800ACD94E /* RESTProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE66E28F83CA40033DD93 /* RESTProxy.swift */; };
06799AEC28F98E4800ACD94E /* RESTTaskIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67528F83CA40033DD93 /* RESTTaskIdentifier.swift */; };
- 06799AEF28F98E4800ACD94E /* RESTRetryStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67628F83CA40033DD93 /* RESTRetryStrategy.swift */; };
+ 06799AEF28F98E4800ACD94E /* RetryStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67628F83CA40033DD93 /* RetryStrategy.swift */; };
06799AF028F98E4800ACD94E /* REST.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67B28F83CA50033DD93 /* REST.swift */; };
06799AF128F98E4800ACD94E /* RESTAPIProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67328F83CA40033DD93 /* RESTAPIProxy.swift */; };
06799AF228F98E4800ACD94E /* RESTAccessTokenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67228F83CA40033DD93 /* RESTAccessTokenManager.swift */; };
@@ -68,8 +61,6 @@
5820676426E771DB00655B05 /* TunnelManagerErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5820676326E771DB00655B05 /* TunnelManagerErrors.swift */; };
5820EDA9288FE064006BF4E4 /* DeviceManagementInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5820EDA8288FE064006BF4E4 /* DeviceManagementInteractor.swift */; };
5820EDAB288FF0D2006BF4E4 /* DeviceRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5820EDAA288FF0D2006BF4E4 /* DeviceRowView.swift */; };
- 5822C0042A3724A800A3A5FB /* ShadowsocksConfigurationCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9467E8A2A2E0317000DC21F /* ShadowsocksConfigurationCache.swift */; };
- 5822C0052A3724A800A3A5FB /* ShadowsocksConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9467E872A2DCD57000DC21F /* ShadowsocksConfiguration.swift */; };
58238CB92AD57EC700768310 /* MullvadREST.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06799ABC28F98E1D00ACD94E /* MullvadREST.framework */; };
5823FA5426CE49F700283BF8 /* TunnelObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5823FA5326CE49F600283BF8 /* TunnelObserver.swift */; };
582403822A827E1500163DE8 /* RelaySelectorWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 582403812A827E1500163DE8 /* RelaySelectorWrapper.swift */; };
@@ -107,7 +98,6 @@
584D26C4270C855B004EA533 /* PreferencesDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 584D26C3270C855A004EA533 /* PreferencesDataSource.swift */; };
584D26C6270C8741004EA533 /* SettingsDNSTextCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 584D26C5270C8741004EA533 /* SettingsDNSTextCell.swift */; };
584EBDBD2747C98F00A0C9FD /* NSAttributedString+Markdown.swift in Sources */ = {isa = PBXBuildFile; fileRef = 584EBDBC2747C98F00A0C9FD /* NSAttributedString+Markdown.swift */; };
- 584F99202902CBDD001F858D /* libRelaySelector.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5898D29829017DAC00EB5EBA /* libRelaySelector.a */; };
5859A55529CD9DD900F66591 /* changes.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5859A55429CD9DD800F66591 /* changes.txt */; };
585A02E92A4B283000C6CAFF /* TCPUnsafeListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585A02E82A4B283000C6CAFF /* TCPUnsafeListener.swift */; };
585A02EB2A4B285800C6CAFF /* UDPConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585A02EA2A4B285800C6CAFF /* UDPConnection.swift */; };
@@ -135,7 +125,6 @@
58695AA72A4B109F00328DB3 /* TunnelObfuscation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5840231F2A406BF5007B27AC /* TunnelObfuscation.framework */; };
586A0DCB2A20E359006C731C /* MullvadTypes.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58D223D5294C8E5E0029F5F8 /* MullvadTypes.framework */; };
586A0DD12A20E371006C731C /* WireGuardKitTypes in Frameworks */ = {isa = PBXBuildFile; productRef = 586A0DD02A20E371006C731C /* WireGuardKitTypes */; };
- 586A0DD42A20E4A9006C731C /* MullvadREST.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06799ABC28F98E1D00ACD94E /* MullvadREST.framework */; };
586A950C290125EE007BAF2B /* AlertPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58B9EB122488ED2100095626 /* AlertPresenter.swift */; };
586A950E290125F3007BAF2B /* ProductsRequestOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5846226426E0D9630035F7C2 /* ProductsRequestOperation.swift */; };
586A950F29012BEE007BAF2B /* AddressCacheTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06AC114028F841390037AF9A /* AddressCacheTracker.swift */; };
@@ -193,10 +182,6 @@
5896AE84246D5889005B36CB /* CustomDateComponentsFormatting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5896AE83246D5889005B36CB /* CustomDateComponentsFormatting.swift */; };
5896CEF226972DEB00B0FAE8 /* AccountContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5896CEF126972DEB00B0FAE8 /* AccountContentView.swift */; };
5897F1742913EAF800AF5695 /* ExponentialBackoff.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5897F1732913EAF800AF5695 /* ExponentialBackoff.swift */; };
- 5898D29F29017DD000EB5EBA /* RelaySelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58781CD422AFBA39009B9D8E /* RelaySelector.swift */; };
- 5898D2A22901801000EB5EBA /* MullvadREST.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06799ABC28F98E1D00ACD94E /* MullvadREST.framework */; platformFilter = ios; };
- 5898D2A92901844E00EB5EBA /* libRelaySelector.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5898D29829017DAC00EB5EBA /* libRelaySelector.a */; };
- 5898D2AB2901845400EB5EBA /* libRelaySelector.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5898D29829017DAC00EB5EBA /* libRelaySelector.a */; };
589A455C28E094BF00565204 /* OperationSmokeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58DF5B7E2852778600E92647 /* OperationSmokeTests.swift */; };
589A455D28E094BF00565204 /* OperationObserverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 583E1E292848DF67004838B3 /* OperationObserverTests.swift */; };
589A455F28E094BF00565204 /* OperationConditionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 580CBFB72848D503007878F0 /* OperationConditionTests.swift */; };
@@ -356,7 +341,6 @@
58DF28A52417CB4B00E836B0 /* StorePaymentManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58DF28A42417CB4B00E836B0 /* StorePaymentManager.swift */; };
58E0729F28814ACC008902F8 /* WireGuardLogLevel+Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E0729E28814ACC008902F8 /* WireGuardLogLevel+Logging.swift */; };
58E0A98827C8F46300FE6BDD /* Tunnel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E0A98727C8F46300FE6BDD /* Tunnel.swift */; };
- 58E0E2842A3718CE002E3420 /* URLSessionShadowsocksTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E0E2832A3718CE002E3420 /* URLSessionShadowsocksTransport.swift */; };
58E11188292FA11F009FCA84 /* SettingsMigrationUIHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E11187292FA11F009FCA84 /* SettingsMigrationUIHandler.swift */; };
58E20771274672CA00DE5D77 /* LaunchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E20770274672CA00DE5D77 /* LaunchViewController.swift */; };
58E25F812837BBBB002CFB2C /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E25F802837BBBB002CFB2C /* SceneDelegate.swift */; };
@@ -511,26 +495,18 @@
A917352129FAAA5200D5DCFD /* TransportStrategyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A917352029FAAA5200D5DCFD /* TransportStrategyTests.swift */; };
A91D78E32B03BDF200FCD5D3 /* TunnelObfuscation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5840231F2A406BF5007B27AC /* TunnelObfuscation.framework */; };
A91D78E42B03C01600FCD5D3 /* MullvadSettings.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58B2FDD32AA71D2A003EB5C6 /* MullvadSettings.framework */; };
- A93D13782A1F60A6001EB0B1 /* shadowsocks.h in Headers */ = {isa = PBXBuildFile; fileRef = 586F2BE129F6916F009E6924 /* shadowsocks.h */; settings = {ATTRIBUTES = (Private, ); }; };
A94D691A2ABAD66700413DD4 /* WireGuardKitTypes in Frameworks */ = {isa = PBXBuildFile; productRef = 58FE25E22AA72AE9003D1918 /* WireGuardKitTypes */; };
A94D691B2ABAD66700413DD4 /* WireGuardKitTypes in Frameworks */ = {isa = PBXBuildFile; productRef = 58FE25E72AA7399D003D1918 /* WireGuardKitTypes */; };
- A95F86B72A1F53BA00245DAC /* URLSessionTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67C28F83CA50033DD93 /* URLSessionTransport.swift */; };
- A95F86B82A1F547000245DAC /* ShadowsocksProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F1FF1B29F06124007083C3 /* ShadowsocksProxy.swift */; };
A97D25AE2B0BB18100946B2D /* ProtocolObfuscator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A97D25AD2B0BB18100946B2D /* ProtocolObfuscator.swift */; };
A97D25B02B0BB5C400946B2D /* ProtocolObfuscationStub.swift in Sources */ = {isa = PBXBuildFile; fileRef = A97D25AF2B0BB5C400946B2D /* ProtocolObfuscationStub.swift */; };
A97D25B22B0CB02D00946B2D /* ProtocolObfuscatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A97D25B12B0CB02D00946B2D /* ProtocolObfuscatorTests.swift */; };
A97D25B42B0CB59300946B2D /* TunnelObfuscationStub.swift in Sources */ = {isa = PBXBuildFile; fileRef = A97D25B32B0CB59300946B2D /* TunnelObfuscationStub.swift */; };
A97D30172AE6B5E90045C0E4 /* StoredWgKeyData.swift in Sources */ = {isa = PBXBuildFile; fileRef = A97D30162AE6B5E90045C0E4 /* StoredWgKeyData.swift */; };
- A97F1F442A1F4E1A00ECEFDE /* MullvadTransport.h in Headers */ = {isa = PBXBuildFile; fileRef = A97F1F432A1F4E1A00ECEFDE /* MullvadTransport.h */; settings = {ATTRIBUTES = (Public, ); }; };
- A97F1F472A1F4E1A00ECEFDE /* MullvadTransport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */; };
- A97F1F482A1F4E1A00ECEFDE /* MullvadTransport.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
A97FF5502A0D2FFC00900996 /* NSFileCoordinator+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A97FF54F2A0D2FFC00900996 /* NSFileCoordinator+Extensions.swift */; };
A988A3E22AFE54AC0008D2C7 /* AccountExpiry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6F2FA62AFBB9AE006D0856 /* AccountExpiry.swift */; };
- A988DF212ADD293D00D807EF /* RESTTransportStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9A1DE782AD5708E0073F689 /* RESTTransportStrategy.swift */; };
- A988DF242ADD307200D807EF /* libRelaySelector.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5898D29829017DAC00EB5EBA /* libRelaySelector.a */; };
A988DF272ADE86ED00D807EF /* WireGuardObfuscationSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = A988DF252ADE86ED00D807EF /* WireGuardObfuscationSettings.swift */; };
A988DF2A2ADE880300D807EF /* TunnelSettingsV3.swift in Sources */ = {isa = PBXBuildFile; fileRef = A988DF282ADE880300D807EF /* TunnelSettingsV3.swift */; };
- A9A1DE792AD5708E0073F689 /* RESTTransportStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9A1DE782AD5708E0073F689 /* RESTTransportStrategy.swift */; };
+ A9A1DE792AD5708E0073F689 /* TransportStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9A1DE782AD5708E0073F689 /* TransportStrategy.swift */; };
A9A5F9E12ACB05160083449F /* AddressCacheTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06AC114028F841390037AF9A /* AddressCacheTracker.swift */; };
A9A5F9E22ACB05160083449F /* BackgroundTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58C76A0A2A338E4300100D75 /* BackgroundTask.swift */; };
A9A5F9E32ACB05160083449F /* AccountDataThrottling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587988C628A2A01F00E3DF54 /* AccountDataThrottling.swift */; };
@@ -629,7 +605,6 @@
A9A5FA422ACB05D90083449F /* DeviceStateAccessorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 580810E42A30E13A00B74552 /* DeviceStateAccessorProtocol.swift */; };
A9A5FA432ACB05F20083449F /* UIColor+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587CBFE222807F530028DED3 /* UIColor+Helpers.swift */; };
A9A8A8EB2A262AB30086D569 /* FileCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9A8A8EA2A262AB30086D569 /* FileCache.swift */; };
- A9B2CF722A1F64CD0013CC6C /* MullvadREST.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06799ABC28F98E1D00ACD94E /* MullvadREST.framework */; };
A9B6AC182ADE8F4300F7802A /* MigrationManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9B6AC172ADE8F4300F7802A /* MigrationManagerTests.swift */; };
A9B6AC1A2ADE8FBB00F7802A /* InMemorySettingsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9B6AC192ADE8FBB00F7802A /* InMemorySettingsStore.swift */; };
A9B6AC1B2ADEA3AD00F7802A /* MemoryCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58BDEB9C2A98F69E00F578F2 /* MemoryCache.swift */; };
@@ -637,18 +612,12 @@
A9C342C32ACC3EE90045F00E /* RelayCacheTracker+Stubs.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C342C22ACC3EE90045F00E /* RelayCacheTracker+Stubs.swift */; };
A9C342C52ACC42130045F00E /* ServerRelaysResponse+Stubs.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C342C42ACC42130045F00E /* ServerRelaysResponse+Stubs.swift */; };
A9D99B9A2A1F7C3200DE27D3 /* RESTTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06FAE67D28F83CA50033DD93 /* RESTTransport.swift */; };
- A9D99BA02A1F7F3A00DE27D3 /* TransportProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9D99B9F2A1F7F3A00DE27D3 /* TransportProvider.swift */; };
- A9D99BA52A1F808900DE27D3 /* RelayCache.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 063F02732902B63F001FA09F /* RelayCache.framework */; };
- A9D99BA62A1F809C00DE27D3 /* libRelaySelector.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5898D29829017DAC00EB5EBA /* libRelaySelector.a */; };
- A9D99BA92A1F81B700DE27D3 /* MullvadTransport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */; };
A9E031782ACB09930095D843 /* UIApplication+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9E031762ACB08950095D843 /* UIApplication+Extensions.swift */; };
A9E0317A2ACB0AE70095D843 /* UIApplication+Stubs.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9E031792ACB0AE70095D843 /* UIApplication+Stubs.swift */; };
A9E0317C2ACBFC7E0095D843 /* TunnelStore+Stubs.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9E0317B2ACBFC7E0095D843 /* TunnelStore+Stubs.swift */; };
A9E0317F2ACC331C0095D843 /* TunnelStatusBlockObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9E0317D2ACC32920095D843 /* TunnelStatusBlockObserver.swift */; };
A9E034642ABB302000E59A5A /* UIEdgeInsets+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9E034632ABB302000E59A5A /* UIEdgeInsets+Extensions.swift */; };
- A9EC20E62A5C488D0040D56E /* Haversine.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9EC20E52A5C488D0040D56E /* Haversine.swift */; };
A9EC20F02A5D79ED0040D56E /* TunnelObfuscation.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 5840231F2A406BF5007B27AC /* TunnelObfuscation.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- A9EC20F42A5D96030040D56E /* Midpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9EC20F32A5D96030040D56E /* Midpoint.swift */; };
E1187ABC289BBB850024E748 /* OutOfTimeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1187ABA289BBB850024E748 /* OutOfTimeViewController.swift */; };
E1187ABD289BBB850024E748 /* OutOfTimeContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1187ABB289BBB850024E748 /* OutOfTimeContentView.swift */; };
E158B360285381C60002F069 /* String+AccountFormatting.swift in Sources */ = {isa = PBXBuildFile; fileRef = E158B35F285381C60002F069 /* String+AccountFormatting.swift */; };
@@ -656,8 +625,16 @@
F028A56A2A34D4E700C0CAA3 /* RedeemVoucherViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028A5692A34D4E700C0CAA3 /* RedeemVoucherViewController.swift */; };
F028A56C2A34D8E600C0CAA3 /* AddCreditSucceededViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028A56B2A34D8E600C0CAA3 /* AddCreditSucceededViewController.swift */; };
F03580252A13842C00E5DAFD /* IncreasedHitButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F03580242A13842C00E5DAFD /* IncreasedHitButton.swift */; };
+ F04F95A12B21D24400431E08 /* shadowsocks.h in Headers */ = {isa = PBXBuildFile; fileRef = F04F95A02B21D24400431E08 /* shadowsocks.h */; settings = {ATTRIBUTES = (Private, ); }; };
F04FBE612A8379EE009278D7 /* AppPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04FBE602A8379EE009278D7 /* AppPreferences.swift */; };
+ F05F39942B21C6C6006E60A7 /* relays.json in Resources */ = {isa = PBXBuildFile; fileRef = 58F3C0A524A50155003E76BE /* relays.json */; };
+ F05F39972B21C735006E60A7 /* RelayCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5820675A26E6576800655B05 /* RelayCache.swift */; };
+ F05F39982B21C73C006E60A7 /* CachedRelays.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585DA87626B024A600B8C587 /* CachedRelays.swift */; };
+ F06045E62B231EB700B2D37A /* URLSessionTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = F06045E52B231EB700B2D37A /* URLSessionTransport.swift */; };
+ F06045EA2B23217E00B2D37A /* ShadowsocksTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = F06045E92B23217E00B2D37A /* ShadowsocksTransport.swift */; };
+ F06045EC2B2322A500B2D37A /* Jittered.swift in Sources */ = {isa = PBXBuildFile; fileRef = F06045EB2B2322A500B2D37A /* Jittered.swift */; };
F07BF2622A26279100042943 /* RedeemVoucherOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F07BF2612A26279100042943 /* RedeemVoucherOperation.swift */; };
+ F07C9D952B220C77006F1C5E /* libshadowsocks_proxy.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 01F1FF1D29F0627D007083C3 /* libshadowsocks_proxy.a */; };
F07CFF2029F2720E008C0343 /* RegisteredDeviceInAppNotificationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F07CFF1F29F2720E008C0343 /* RegisteredDeviceInAppNotificationProvider.swift */; };
F09A297B2A9F8A9B00EA3B6F /* LogoutDialogueView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F09A29782A9F8A9B00EA3B6F /* LogoutDialogueView.swift */; };
F09A297C2A9F8A9B00EA3B6F /* VoucherTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = F09A29792A9F8A9B00EA3B6F /* VoucherTextField.swift */; };
@@ -680,6 +657,13 @@
F0DA87472A9CB9A2006044F1 /* AccountExpiryRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DA87462A9CB9A2006044F1 /* AccountExpiryRow.swift */; };
F0DA87492A9CBA9F006044F1 /* AccountDeviceRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DA87482A9CBA9F006044F1 /* AccountDeviceRow.swift */; };
F0DA874B2A9CBACB006044F1 /* AccountNumberRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DA874A2A9CBACB006044F1 /* AccountNumberRow.swift */; };
+ F0DDE4142B220458006B57A7 /* ShadowSocksProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DDE40F2B220458006B57A7 /* ShadowSocksProxy.swift */; };
+ F0DDE4152B220458006B57A7 /* ShadowsocksConfigurationCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DDE4102B220458006B57A7 /* ShadowsocksConfigurationCache.swift */; };
+ F0DDE4162B220458006B57A7 /* TransportProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DDE4112B220458006B57A7 /* TransportProvider.swift */; };
+ F0DDE4182B220458006B57A7 /* ShadowsocksConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DDE4132B220458006B57A7 /* ShadowsocksConfiguration.swift */; };
+ F0DDE42A2B220A15006B57A7 /* Haversine.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DDE4272B220A15006B57A7 /* Haversine.swift */; };
+ F0DDE42B2B220A15006B57A7 /* RelaySelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DDE4282B220A15006B57A7 /* RelaySelector.swift */; };
+ F0DDE42C2B220A15006B57A7 /* Midpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DDE4292B220A15006B57A7 /* Midpoint.swift */; };
F0E3618B2A4ADD2F00AEEF2B /* WelcomeContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0E3618A2A4ADD2F00AEEF2B /* WelcomeContentView.swift */; };
F0E8CC032A4C753B007ED3B4 /* WelcomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0E8CC022A4C753B007ED3B4 /* WelcomeViewController.swift */; };
F0E8CC0A2A4EE127007ED3B4 /* SetupAccountCompletedContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0E8CC092A4EE127007ED3B4 /* SetupAccountCompletedContentView.swift */; };
@@ -694,27 +678,6 @@
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
- 063F02772902B63F001FA09F /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 58CE5E58224146200008646E /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 063F02722902B63F001FA09F;
- remoteInfo = RelayCache;
- };
- 063F02812902B6F8001FA09F /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 58CE5E58224146200008646E /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 06799ABB28F98E1D00ACD94E;
- remoteInfo = MullvadREST;
- };
- 063F028B2902B83C001FA09F /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 58CE5E58224146200008646E /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 063F02722902B63F001FA09F;
- remoteInfo = RelayCache;
- };
06410DF9292C4ABC00AFC18C /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 58CE5E58224146200008646E /* Project object */;
@@ -750,13 +713,6 @@
remoteGlobalIDString = 5840231E2A406BF5007B27AC;
remoteInfo = TunnelObfuscation;
};
- 586A0DD62A20E4A9006C731C /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 58CE5E58224146200008646E /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 06799ABB28F98E1D00ACD94E;
- remoteInfo = MullvadREST;
- };
58B2FDD72AA71D2A003EB5C6 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 58CE5E58224146200008646E /* Project object */;
@@ -890,20 +846,6 @@
remoteGlobalIDString = 58D223D4294C8E5E0029F5F8;
remoteInfo = MullvadTypes;
};
- 58D2242D294C94830029F5F8 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 58CE5E58224146200008646E /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 5898D29729017DAC00EB5EBA;
- remoteInfo = RelaySelector;
- };
- 58D22431294C94890029F5F8 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 58CE5E58224146200008646E /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 5898D29729017DAC00EB5EBA;
- remoteInfo = RelaySelector;
- };
58EED36D29FBEF040000CBAF /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 58CE5E58224146200008646E /* Project object */;
@@ -1002,55 +944,20 @@
remoteGlobalIDString = 5840231E2A406BF5007B27AC;
remoteInfo = TunnelObfuscation;
};
- A97F1F452A1F4E1A00ECEFDE /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 58CE5E58224146200008646E /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A97F1F402A1F4E1A00ECEFDE;
- remoteInfo = MullvadTransport;
- };
- A988DF222ADD305300D807EF /* PBXContainerItemProxy */ = {
+ A9EC20F12A5D79ED0040D56E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 58CE5E58224146200008646E /* Project object */;
proxyType = 1;
- remoteGlobalIDString = 5898D29729017DAC00EB5EBA;
- remoteInfo = RelaySelector;
+ remoteGlobalIDString = 5840231E2A406BF5007B27AC;
+ remoteInfo = TunnelObfuscation;
};
- A9B2CF702A1F64B20013CC6C /* PBXContainerItemProxy */ = {
+ F04F959E2B21D02700431E08 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 58CE5E58224146200008646E /* Project object */;
proxyType = 1;
remoteGlobalIDString = 06799ABB28F98E1D00ACD94E;
remoteInfo = MullvadREST;
};
- A9D99BA12A1F807700DE27D3 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 58CE5E58224146200008646E /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 063F02722902B63F001FA09F;
- remoteInfo = RelayCache;
- };
- A9D99BA32A1F807A00DE27D3 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 58CE5E58224146200008646E /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 5898D29729017DAC00EB5EBA;
- remoteInfo = RelaySelector;
- };
- A9D99BA72A1F81B100DE27D3 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 58CE5E58224146200008646E /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A97F1F402A1F4E1A00ECEFDE;
- remoteInfo = MullvadTransport;
- };
- A9EC20F12A5D79ED0040D56E /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 58CE5E58224146200008646E /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 5840231E2A406BF5007B27AC;
- remoteInfo = TunnelObfuscation;
- };
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
@@ -1067,10 +974,8 @@
7ABCA5B42A9349F20044A708 /* Routing.framework in Embed Frameworks */,
06799AD228F98E1D00ACD94E /* MullvadREST.framework in Embed Frameworks */,
58D223CD294C8BCB0029F5F8 /* Operations.framework in Embed Frameworks */,
- A97F1F482A1F4E1A00ECEFDE /* MullvadTransport.framework in Embed Frameworks */,
58C7A44A2A863F490060C66F /* PacketTunnelCore.framework in Embed Frameworks */,
58F0974F2A20C31100DA2DAD /* WireGuardKitTypes in Embed Frameworks */,
- 063F027A2902B63F001FA09F /* RelayCache.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
@@ -1104,15 +1009,6 @@
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
- 5898D29629017DAC00EB5EBA /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "include/$(PRODUCT_NAME)";
- dstSubfolderSpec = 16;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
58CE5E85224146470008646E /* Embed Foundation Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -1157,13 +1053,10 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 01F1FF1B29F06124007083C3 /* ShadowsocksProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShadowsocksProxy.swift; sourceTree = "<group>"; };
01F1FF1D29F0627D007083C3 /* libshadowsocks_proxy.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libshadowsocks_proxy.a; path = ../target/debug/libshadowsocks_proxy.a; sourceTree = "<group>"; };
062B45BB28FD8C3B00746E77 /* RESTDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RESTDefaults.swift; sourceTree = "<group>"; };
063687AF28EB083800BE7161 /* ProxyURLRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProxyURLRequest.swift; sourceTree = "<group>"; };
063687B928EB234F00BE7161 /* PacketTunnelTransport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketTunnelTransport.swift; sourceTree = "<group>"; };
- 063F02732902B63F001FA09F /* RelayCache.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RelayCache.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- 063F02752902B63F001FA09F /* RelayCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RelayCache.h; sourceTree = "<group>"; };
06410DFD292CE18F00AFC18C /* KeychainSettingsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainSettingsStore.swift; sourceTree = "<group>"; };
06410E03292D0F7100AFC18C /* SettingsParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsParser.swift; sourceTree = "<group>"; };
06410E06292D108E00AFC18C /* SettingsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsStore.swift; sourceTree = "<group>"; };
@@ -1192,13 +1085,12 @@
06FAE67328F83CA40033DD93 /* RESTAPIProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTAPIProxy.swift; sourceTree = "<group>"; };
06FAE67428F83CA40033DD93 /* RESTRequestHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTRequestHandler.swift; sourceTree = "<group>"; };
06FAE67528F83CA40033DD93 /* RESTTaskIdentifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTTaskIdentifier.swift; sourceTree = "<group>"; };
- 06FAE67628F83CA40033DD93 /* RESTRetryStrategy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTRetryStrategy.swift; sourceTree = "<group>"; };
+ 06FAE67628F83CA40033DD93 /* RetryStrategy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RetryStrategy.swift; sourceTree = "<group>"; };
06FAE67728F83CA40033DD93 /* ServerRelaysResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerRelaysResponse.swift; sourceTree = "<group>"; };
06FAE67828F83CA50033DD93 /* RESTCreateApplePaymentResponse+Localization.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "RESTCreateApplePaymentResponse+Localization.swift"; sourceTree = "<group>"; };
06FAE67928F83CA50033DD93 /* RESTAuthorization.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTAuthorization.swift; sourceTree = "<group>"; };
06FAE67A28F83CA50033DD93 /* RESTDevicesProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTDevicesProxy.swift; sourceTree = "<group>"; };
06FAE67B28F83CA50033DD93 /* REST.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = REST.swift; sourceTree = "<group>"; };
- 06FAE67C28F83CA50033DD93 /* URLSessionTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLSessionTransport.swift; sourceTree = "<group>"; };
06FAE67D28F83CA50033DD93 /* RESTTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTTransport.swift; sourceTree = "<group>"; };
5802EBC42A8E44AC00E5CE4C /* AppRoutes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppRoutes.swift; sourceTree = "<group>"; };
5802EBC62A8E457A00E5CE4C /* AppRouteProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppRouteProtocol.swift; sourceTree = "<group>"; };
@@ -1340,7 +1232,6 @@
586E54FA27A2DF6D0029B88B /* SendTunnelProviderMessageOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendTunnelProviderMessageOperation.swift; sourceTree = "<group>"; };
586E7A2C2A987689006DAB1B /* SettingsReaderProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsReaderProtocol.swift; sourceTree = "<group>"; };
586E8DB72AAF4AC4007BF3DA /* Task+Duration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Task+Duration.swift"; sourceTree = "<group>"; };
- 586F2BE129F6916F009E6924 /* shadowsocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = shadowsocks.h; path = "shadowsocks-proxy/include/shadowsocks.h"; sourceTree = "<group>"; };
5871167E2910035700D41AAC /* PreferencesInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesInteractor.swift; sourceTree = "<group>"; };
5871FB95254ADE4E0051A0A4 /* ConsolidatedApplicationLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConsolidatedApplicationLog.swift; sourceTree = "<group>"; };
5871FB9F254C26BF0051A0A4 /* NSRegularExpression+IPAddress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSRegularExpression+IPAddress.swift"; sourceTree = "<group>"; };
@@ -1349,7 +1240,6 @@
5875960926F371FC00BF6711 /* Tunnel+Messaging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Tunnel+Messaging.swift"; sourceTree = "<group>"; };
5877F94D2A0A59AA0052D9E9 /* NotificationResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationResponse.swift; sourceTree = "<group>"; };
58781CC822AE7CA8009B9D8E /* RelayConstraints.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayConstraints.swift; sourceTree = "<group>"; };
- 58781CD422AFBA39009B9D8E /* RelaySelector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelaySelector.swift; sourceTree = "<group>"; };
5878A26E2907E7E00096FC88 /* ProblemReportInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProblemReportInteractor.swift; sourceTree = "<group>"; };
5878A27029091CF20096FC88 /* AccountInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountInteractor.swift; sourceTree = "<group>"; };
5878A27229091D6D0096FC88 /* TunnelBlockObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelBlockObserver.swift; sourceTree = "<group>"; };
@@ -1398,7 +1288,6 @@
5896AE85246D6AD8005B36CB /* CustomDateComponentsFormattingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomDateComponentsFormattingTests.swift; sourceTree = "<group>"; };
5896CEF126972DEB00B0FAE8 /* AccountContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountContentView.swift; sourceTree = "<group>"; };
5897F1732913EAF800AF5695 /* ExponentialBackoff.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExponentialBackoff.swift; sourceTree = "<group>"; };
- 5898D29829017DAC00EB5EBA /* libRelaySelector.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRelaySelector.a; sourceTree = BUILT_PRODUCTS_DIR; };
5898D2A7290182B000EB5EBA /* TunnelProviderReply.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelProviderReply.swift; sourceTree = "<group>"; };
5898D2AD290185D200EB5EBA /* ProxyURLResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProxyURLResponse.swift; sourceTree = "<group>"; };
5898D2AF2902A67C00EB5EBA /* RelayLocation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayLocation.swift; sourceTree = "<group>"; };
@@ -1497,7 +1386,6 @@
58E07298288031D5008902F8 /* WireGuardAdapterError+Localization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WireGuardAdapterError+Localization.swift"; sourceTree = "<group>"; };
58E0729E28814ACC008902F8 /* WireGuardLogLevel+Logging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WireGuardLogLevel+Logging.swift"; sourceTree = "<group>"; };
58E0A98727C8F46300FE6BDD /* Tunnel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tunnel.swift; sourceTree = "<group>"; };
- 58E0E2832A3718CE002E3420 /* URLSessionShadowsocksTransport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLSessionShadowsocksTransport.swift; sourceTree = "<group>"; };
58E11187292FA11F009FCA84 /* SettingsMigrationUIHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsMigrationUIHandler.swift; sourceTree = "<group>"; };
58E20770274672CA00DE5D77 /* LaunchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchViewController.swift; sourceTree = "<group>"; };
58E25F802837BBBB002CFB2C /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
@@ -1639,19 +1527,15 @@
A92ECC272A7802AB0052F1B1 /* StoredDeviceData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoredDeviceData.swift; sourceTree = "<group>"; };
A92ECC2B2A7803A50052F1B1 /* DeviceState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceState.swift; sourceTree = "<group>"; };
A9467E7E2A29DEFE000DC21F /* RelayCacheTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayCacheTests.swift; sourceTree = "<group>"; };
- A9467E872A2DCD57000DC21F /* ShadowsocksConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShadowsocksConfiguration.swift; sourceTree = "<group>"; };
- A9467E8A2A2E0317000DC21F /* ShadowsocksConfigurationCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShadowsocksConfigurationCache.swift; sourceTree = "<group>"; };
A97D25AD2B0BB18100946B2D /* ProtocolObfuscator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProtocolObfuscator.swift; sourceTree = "<group>"; };
A97D25AF2B0BB5C400946B2D /* ProtocolObfuscationStub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProtocolObfuscationStub.swift; sourceTree = "<group>"; };
A97D25B12B0CB02D00946B2D /* ProtocolObfuscatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProtocolObfuscatorTests.swift; sourceTree = "<group>"; };
A97D25B32B0CB59300946B2D /* TunnelObfuscationStub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelObfuscationStub.swift; sourceTree = "<group>"; };
A97D30162AE6B5E90045C0E4 /* StoredWgKeyData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoredWgKeyData.swift; sourceTree = "<group>"; };
- A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MullvadTransport.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- A97F1F432A1F4E1A00ECEFDE /* MullvadTransport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MullvadTransport.h; sourceTree = "<group>"; };
A97FF54F2A0D2FFC00900996 /* NSFileCoordinator+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSFileCoordinator+Extensions.swift"; sourceTree = "<group>"; };
A988DF252ADE86ED00D807EF /* WireGuardObfuscationSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WireGuardObfuscationSettings.swift; sourceTree = "<group>"; };
A988DF282ADE880300D807EF /* TunnelSettingsV3.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelSettingsV3.swift; sourceTree = "<group>"; };
- A9A1DE782AD5708E0073F689 /* RESTTransportStrategy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTTransportStrategy.swift; sourceTree = "<group>"; };
+ A9A1DE782AD5708E0073F689 /* TransportStrategy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransportStrategy.swift; sourceTree = "<group>"; };
A9A5F9A12ACB003D0083449F /* TunnelManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelManagerTests.swift; sourceTree = "<group>"; };
A9A8A8EA2A262AB30086D569 /* FileCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileCache.swift; sourceTree = "<group>"; };
A9B6AC172ADE8F4300F7802A /* MigrationManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrationManagerTests.swift; sourceTree = "<group>"; };
@@ -1660,15 +1544,12 @@
A9C342C42ACC42130045F00E /* ServerRelaysResponse+Stubs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ServerRelaysResponse+Stubs.swift"; sourceTree = "<group>"; };
A9CF11FC2A0518E7001D9565 /* AddressCacheTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddressCacheTests.swift; sourceTree = "<group>"; };
A9D96B192A8247C100A5C673 /* MigrationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrationManager.swift; sourceTree = "<group>"; };
- A9D99B9F2A1F7F3A00DE27D3 /* TransportProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransportProvider.swift; sourceTree = "<group>"; };
A9E031762ACB08950095D843 /* UIApplication+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIApplication+Extensions.swift"; sourceTree = "<group>"; };
A9E031792ACB0AE70095D843 /* UIApplication+Stubs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIApplication+Stubs.swift"; sourceTree = "<group>"; };
A9E0317B2ACBFC7E0095D843 /* TunnelStore+Stubs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TunnelStore+Stubs.swift"; sourceTree = "<group>"; };
A9E0317D2ACC32920095D843 /* TunnelStatusBlockObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelStatusBlockObserver.swift; sourceTree = "<group>"; };
A9E034632ABB302000E59A5A /* UIEdgeInsets+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIEdgeInsets+Extensions.swift"; sourceTree = "<group>"; };
- A9EC20E52A5C488D0040D56E /* Haversine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Haversine.swift; sourceTree = "<group>"; };
A9EC20E72A5D3A8C0040D56E /* CoordinatesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoordinatesTests.swift; sourceTree = "<group>"; };
- A9EC20F32A5D96030040D56E /* Midpoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Midpoint.swift; sourceTree = "<group>"; };
A9F360332AAB626300F53531 /* VPNConnectionProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNConnectionProtocol.swift; sourceTree = "<group>"; };
E1187ABA289BBB850024E748 /* OutOfTimeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutOfTimeViewController.swift; sourceTree = "<group>"; };
E1187ABB289BBB850024E748 /* OutOfTimeContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutOfTimeContentView.swift; sourceTree = "<group>"; };
@@ -1677,7 +1558,11 @@
F028A5692A34D4E700C0CAA3 /* RedeemVoucherViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RedeemVoucherViewController.swift; sourceTree = "<group>"; };
F028A56B2A34D8E600C0CAA3 /* AddCreditSucceededViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddCreditSucceededViewController.swift; sourceTree = "<group>"; };
F03580242A13842C00E5DAFD /* IncreasedHitButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IncreasedHitButton.swift; sourceTree = "<group>"; };
+ F04F95A02B21D24400431E08 /* shadowsocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shadowsocks.h; sourceTree = "<group>"; };
F04FBE602A8379EE009278D7 /* AppPreferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPreferences.swift; sourceTree = "<group>"; };
+ F06045E52B231EB700B2D37A /* URLSessionTransport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLSessionTransport.swift; sourceTree = "<group>"; };
+ F06045E92B23217E00B2D37A /* ShadowsocksTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShadowsocksTransport.swift; sourceTree = "<group>"; };
+ F06045EB2B2322A500B2D37A /* Jittered.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Jittered.swift; sourceTree = "<group>"; };
F07BF2572A26112D00042943 /* InputTextFormatterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InputTextFormatterTests.swift; sourceTree = "<group>"; };
F07BF2612A26279100042943 /* RedeemVoucherOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RedeemVoucherOperation.swift; sourceTree = "<group>"; };
F07CFF1F29F2720E008C0343 /* RegisteredDeviceInAppNotificationProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegisteredDeviceInAppNotificationProvider.swift; sourceTree = "<group>"; };
@@ -1699,6 +1584,13 @@
F0DA87462A9CB9A2006044F1 /* AccountExpiryRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountExpiryRow.swift; sourceTree = "<group>"; };
F0DA87482A9CBA9F006044F1 /* AccountDeviceRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountDeviceRow.swift; sourceTree = "<group>"; };
F0DA874A2A9CBACB006044F1 /* AccountNumberRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountNumberRow.swift; sourceTree = "<group>"; };
+ F0DDE40F2B220458006B57A7 /* ShadowSocksProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShadowSocksProxy.swift; sourceTree = "<group>"; };
+ F0DDE4102B220458006B57A7 /* ShadowsocksConfigurationCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShadowsocksConfigurationCache.swift; sourceTree = "<group>"; };
+ F0DDE4112B220458006B57A7 /* TransportProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransportProvider.swift; sourceTree = "<group>"; };
+ F0DDE4132B220458006B57A7 /* ShadowsocksConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShadowsocksConfiguration.swift; sourceTree = "<group>"; };
+ F0DDE4272B220A15006B57A7 /* Haversine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Haversine.swift; sourceTree = "<group>"; };
+ F0DDE4282B220A15006B57A7 /* RelaySelector.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RelaySelector.swift; sourceTree = "<group>"; };
+ F0DDE4292B220A15006B57A7 /* Midpoint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Midpoint.swift; sourceTree = "<group>"; };
F0E3618A2A4ADD2F00AEEF2B /* WelcomeContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeContentView.swift; sourceTree = "<group>"; };
F0E8CC022A4C753B007ED3B4 /* WelcomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeViewController.swift; sourceTree = "<group>"; };
F0E8CC092A4EE127007ED3B4 /* SetupAccountCompletedContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetupAccountCompletedContentView.swift; sourceTree = "<group>"; };
@@ -1713,14 +1605,6 @@
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
- 063F02702902B63F001FA09F /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 586A0DD42A20E4A9006C731C /* MullvadREST.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
06799AB928F98E1D00ACD94E /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
@@ -1729,6 +1613,7 @@
586A0DD12A20E371006C731C /* WireGuardKitTypes in Frameworks */,
58D2241D294C91D20029F5F8 /* MullvadLogging.framework in Frameworks */,
58D223DC294C8EB90029F5F8 /* MullvadTypes.framework in Frameworks */,
+ F07C9D952B220C77006F1C5E /* libshadowsocks_proxy.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1749,14 +1634,6 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
- 5898D29529017DAC00EB5EBA /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 5898D2A22901801000EB5EBA /* MullvadREST.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
589A454F28E094B300565204 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
@@ -1769,7 +1646,6 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 584F99202902CBDD001F858D /* libRelaySelector.a in Frameworks */,
58915D6E2A26037A0066445B /* WireGuardKitTypes in Frameworks */,
588E4EAE28FEEDD8008046E3 /* MullvadREST.framework in Frameworks */,
);
@@ -1802,7 +1678,6 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- A988DF242ADD307200D807EF /* libRelaySelector.a in Frameworks */,
A94D691B2ABAD66700413DD4 /* WireGuardKitTypes in Frameworks */,
58C7A43E2A863F470060C66F /* PacketTunnelCore.framework in Frameworks */,
);
@@ -1814,14 +1689,11 @@
files = (
58F0974E2A20C31100DA2DAD /* WireGuardKitTypes in Frameworks */,
58C7A4492A863F490060C66F /* PacketTunnelCore.framework in Frameworks */,
- 5898D2A92901844E00EB5EBA /* libRelaySelector.a in Frameworks */,
58D223F9294C8FF00029F5F8 /* MullvadLogging.framework in Frameworks */,
58D223E6294C8F120029F5F8 /* MullvadTypes.framework in Frameworks */,
7ABCA5B32A9349F20044A708 /* Routing.framework in Frameworks */,
58D223CC294C8BCB0029F5F8 /* Operations.framework in Frameworks */,
06799AD128F98E1D00ACD94E /* MullvadREST.framework in Frameworks */,
- 063F02792902B63F001FA09F /* RelayCache.framework in Frameworks */,
- A97F1F472A1F4E1A00ECEFDE /* MullvadTransport.framework in Frameworks */,
58B2FDD92AA71D2A003EB5C6 /* MullvadSettings.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -1833,8 +1705,6 @@
589C6A7D2A45B06800DAD3EF /* TunnelObfuscation.framework in Frameworks */,
58FE25C62AA72779003D1918 /* PacketTunnelCore.framework in Frameworks */,
58FE25CE2AA72802003D1918 /* MullvadSettings.framework in Frameworks */,
- A9D99BA92A1F81B700DE27D3 /* MullvadTransport.framework in Frameworks */,
- 5898D2AB2901845400EB5EBA /* libRelaySelector.a in Frameworks */,
58D223EA294C8F3C0029F5F8 /* MullvadTypes.framework in Frameworks */,
58D223C6294C8B970029F5F8 /* Operations.framework in Frameworks */,
58153071294CBE8B00D1702E /* MullvadREST.framework in Frameworks */,
@@ -1899,17 +1769,6 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
- A97F1F3E2A1F4E1A00ECEFDE /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- A9D99BA62A1F809C00DE27D3 /* libRelaySelector.a in Frameworks */,
- A9D99BA52A1F808900DE27D3 /* RelayCache.framework in Frameworks */,
- A9B2CF722A1F64CD0013CC6C /* MullvadREST.framework in Frameworks */,
- 01F1FF1E29F0627D007083C3 /* libshadowsocks_proxy.a in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
@@ -1917,24 +1776,6 @@
isa = PBXGroup;
children = (
06799AB428F98CE700ACD94E /* le_root_cert.cer */,
- );
- path = Assets;
- sourceTree = "<group>";
- };
- 063F02742902B63F001FA09F /* RelayCache */ = {
- isa = PBXGroup;
- children = (
- 063F028E2902BD0F001FA09F /* Assets */,
- 063F02752902B63F001FA09F /* RelayCache.h */,
- 585DA87626B024A600B8C587 /* CachedRelays.swift */,
- 5820675A26E6576800655B05 /* RelayCache.swift */,
- );
- path = RelayCache;
- sourceTree = "<group>";
- };
- 063F028E2902BD0F001FA09F /* Assets */ = {
- isa = PBXGroup;
- children = (
58F3C0A524A50155003E76BE /* relays.json */,
);
path = Assets;
@@ -1943,37 +1784,14 @@
06799ABD28F98E1D00ACD94E /* MullvadREST */ = {
isa = PBXGroup;
children = (
- 06AC114128F8413A0037AF9A /* AddressCache.swift */,
+ F06045F02B2324DA00B2D37A /* ApiHandlers */,
062B45A228FD4C0F00746E77 /* Assets */,
- 5897F1732913EAF800AF5695 /* ExponentialBackoff.swift */,
- 06FAE67128F83CA40033DD93 /* HTTP.swift */,
582FFA82290A84E700895745 /* Info.plist */,
06799ABE28F98E1D00ACD94E /* MullvadREST.h */,
+ F0DC779F2B2222D20087F09D /* Relay */,
06FAE67B28F83CA50033DD93 /* REST.swift */,
- 06FAE67228F83CA40033DD93 /* RESTAccessTokenManager.swift */,
- 06FAE66828F83CA30033DD93 /* RESTAccountsProxy.swift */,
- 06FAE67328F83CA40033DD93 /* RESTAPIProxy.swift */,
- 06FAE67028F83CA40033DD93 /* RESTAuthenticationProxy.swift */,
- 06FAE67928F83CA50033DD93 /* RESTAuthorization.swift */,
- 06FAE66C28F83CA40033DD93 /* RESTCoding.swift */,
- 062B45BB28FD8C3B00746E77 /* RESTDefaults.swift */,
- 06FAE67A28F83CA50033DD93 /* RESTDevicesProxy.swift */,
- 06FAE66928F83CA30033DD93 /* RESTError.swift */,
- 06FAE66F28F83CA40033DD93 /* RESTNetworkOperation.swift */,
- 06FAE66E28F83CA40033DD93 /* RESTProxy.swift */,
- 06FAE66728F83CA30033DD93 /* RESTProxyFactory.swift */,
- 589E76BF2A9378F100E502F3 /* RESTRequestExecutor.swift */,
- 06FAE66A28F83CA30033DD93 /* RESTRequestFactory.swift */,
- 06FAE67428F83CA40033DD93 /* RESTRequestHandler.swift */,
- 06FAE66628F83CA30033DD93 /* RESTResponseHandler.swift */,
- 06FAE67628F83CA40033DD93 /* RESTRetryStrategy.swift */,
- 06FAE67528F83CA40033DD93 /* RESTTaskIdentifier.swift */,
- 06FAE67D28F83CA50033DD93 /* RESTTransport.swift */,
- 58E7BA182A975DF70068EC3A /* RESTTransportProvider.swift */,
- A9A1DE782AD5708E0073F689 /* RESTTransportStrategy.swift */,
- 06FAE66528F83CA30033DD93 /* RESTURLSession.swift */,
- 06FAE67728F83CA40033DD93 /* ServerRelaysResponse.swift */,
- 06FAE66B28F83CA30033DD93 /* SSLPinningURLSessionDelegate.swift */,
+ F0DC77A12B2313330087F09D /* RetryStrategy */,
+ F0DC77A02B2223290087F09D /* Transport */,
);
path = MullvadREST;
sourceTree = "<group>";
@@ -2501,16 +2319,6 @@
path = DeviceCheck;
sourceTree = "<group>";
};
- 5898D29929017DAC00EB5EBA /* RelaySelector */ = {
- isa = PBXGroup;
- children = (
- A9EC20E52A5C488D0040D56E /* Haversine.swift */,
- A9EC20F32A5D96030040D56E /* Midpoint.swift */,
- 58781CD422AFBA39009B9D8E /* RelaySelector.swift */,
- );
- path = RelaySelector;
- sourceTree = "<group>";
- };
589A454A28DDF59B00565204 /* Shared */ = {
isa = PBXGroup;
children = (
@@ -2755,12 +2563,9 @@
06799ABD28F98E1D00ACD94E /* MullvadREST */,
58FBFBE7291622580020E046 /* MullvadRESTTests */,
58B2FDD42AA71D2A003EB5C6 /* MullvadSettings */,
- 063F02742902B63F001FA09F /* RelayCache */,
- 5898D29929017DAC00EB5EBA /* RelaySelector */,
58D223A6294C8A490029F5F8 /* Operations */,
589A455328E094B300565204 /* OperationsTests */,
58CE5E7A224146470008646E /* PacketTunnel */,
- A97F1F422A1F4E1A00ECEFDE /* MullvadTransport */,
584023202A406BF5007B27AC /* TunnelObfuscation */,
58695A9E2A4ADA9200328DB3 /* TunnelObfuscationTests */,
7A83C3FC2A55B39500DFB83A /* TestPlans */,
@@ -2783,13 +2588,10 @@
58D0C79323F1CE7000FE9BA7 /* MullvadVPNScreenshots.xctest */,
589A455228E094B300565204 /* OperationsTests.xctest */,
06799ABC28F98E1D00ACD94E /* MullvadREST.framework */,
- 063F02732902B63F001FA09F /* RelayCache.framework */,
- 5898D29829017DAC00EB5EBA /* libRelaySelector.a */,
58FBFBE6291622580020E046 /* MullvadRESTTests.xctest */,
58D223A5294C8A480029F5F8 /* Operations.framework */,
58D223D5294C8E5E0029F5F8 /* MullvadTypes.framework */,
58D223F3294C8FF00029F5F8 /* MullvadLogging.framework */,
- A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */,
5840231F2A406BF5007B27AC /* TunnelObfuscation.framework */,
58695A9D2A4ADA9100328DB3 /* TunnelObfuscationTests.xctest */,
58C7A4362A863F440060C66F /* PacketTunnelCore.framework */,
@@ -3066,21 +2868,6 @@
path = RelayFilter;
sourceTree = "<group>";
};
- A97F1F422A1F4E1A00ECEFDE /* MullvadTransport */ = {
- isa = PBXGroup;
- children = (
- A97F1F432A1F4E1A00ECEFDE /* MullvadTransport.h */,
- 586F2BE129F6916F009E6924 /* shadowsocks.h */,
- 06FAE67C28F83CA50033DD93 /* URLSessionTransport.swift */,
- 58E0E2832A3718CE002E3420 /* URLSessionShadowsocksTransport.swift */,
- 01F1FF1B29F06124007083C3 /* ShadowsocksProxy.swift */,
- A9D99B9F2A1F7F3A00DE27D3 /* TransportProvider.swift */,
- A9467E872A2DCD57000DC21F /* ShadowsocksConfiguration.swift */,
- A9467E8A2A2E0317000DC21F /* ShadowsocksConfigurationCache.swift */,
- );
- path = MullvadTransport;
- sourceTree = "<group>";
- };
F028A5472A336E1900C0CAA3 /* RedeemVoucher */ = {
isa = PBXGroup;
children = (
@@ -3095,6 +2882,35 @@
path = RedeemVoucher;
sourceTree = "<group>";
};
+ F06045F02B2324DA00B2D37A /* ApiHandlers */ = {
+ isa = PBXGroup;
+ children = (
+ 06AC114128F8413A0037AF9A /* AddressCache.swift */,
+ 06FAE67128F83CA40033DD93 /* HTTP.swift */,
+ 06FAE67228F83CA40033DD93 /* RESTAccessTokenManager.swift */,
+ 06FAE66828F83CA30033DD93 /* RESTAccountsProxy.swift */,
+ 06FAE67328F83CA40033DD93 /* RESTAPIProxy.swift */,
+ 06FAE67028F83CA40033DD93 /* RESTAuthenticationProxy.swift */,
+ 06FAE67928F83CA50033DD93 /* RESTAuthorization.swift */,
+ 06FAE66C28F83CA40033DD93 /* RESTCoding.swift */,
+ 062B45BB28FD8C3B00746E77 /* RESTDefaults.swift */,
+ 06FAE67A28F83CA50033DD93 /* RESTDevicesProxy.swift */,
+ 06FAE66928F83CA30033DD93 /* RESTError.swift */,
+ 06FAE66F28F83CA40033DD93 /* RESTNetworkOperation.swift */,
+ 06FAE66E28F83CA40033DD93 /* RESTProxy.swift */,
+ 06FAE66728F83CA30033DD93 /* RESTProxyFactory.swift */,
+ 589E76BF2A9378F100E502F3 /* RESTRequestExecutor.swift */,
+ 06FAE66A28F83CA30033DD93 /* RESTRequestFactory.swift */,
+ 06FAE67428F83CA40033DD93 /* RESTRequestHandler.swift */,
+ 06FAE66628F83CA30033DD93 /* RESTResponseHandler.swift */,
+ 06FAE67528F83CA40033DD93 /* RESTTaskIdentifier.swift */,
+ 06FAE66528F83CA30033DD93 /* RESTURLSession.swift */,
+ 06FAE67728F83CA40033DD93 /* ServerRelaysResponse.swift */,
+ 06FAE66B28F83CA30033DD93 /* SSLPinningURLSessionDelegate.swift */,
+ );
+ path = ApiHandlers;
+ sourceTree = "<group>";
+ };
F09D04B82AE94F27003D4F89 /* GeneralAPIs */ = {
isa = PBXGroup;
children = (
@@ -3104,6 +2920,61 @@
path = GeneralAPIs;
sourceTree = "<group>";
};
+ F0DC779F2B2222D20087F09D /* Relay */ = {
+ isa = PBXGroup;
+ children = (
+ 585DA87626B024A600B8C587 /* CachedRelays.swift */,
+ F0DDE4272B220A15006B57A7 /* Haversine.swift */,
+ F0DDE4292B220A15006B57A7 /* Midpoint.swift */,
+ 5820675A26E6576800655B05 /* RelayCache.swift */,
+ F0DDE4282B220A15006B57A7 /* RelaySelector.swift */,
+ );
+ path = Relay;
+ sourceTree = "<group>";
+ };
+ F0DC77A02B2223290087F09D /* Transport */ = {
+ isa = PBXGroup;
+ children = (
+ F0DC77A32B2315800087F09D /* Direct */,
+ 06FAE67D28F83CA50033DD93 /* RESTTransport.swift */,
+ 58E7BA182A975DF70068EC3A /* RESTTransportProvider.swift */,
+ F0DC77A22B2314EF0087F09D /* Shadowsocks */,
+ F0DDE4112B220458006B57A7 /* TransportProvider.swift */,
+ A9A1DE782AD5708E0073F689 /* TransportStrategy.swift */,
+ );
+ path = Transport;
+ sourceTree = "<group>";
+ };
+ F0DC77A12B2313330087F09D /* RetryStrategy */ = {
+ isa = PBXGroup;
+ children = (
+ 5897F1732913EAF800AF5695 /* ExponentialBackoff.swift */,
+ F06045EB2B2322A500B2D37A /* Jittered.swift */,
+ 06FAE67628F83CA40033DD93 /* RetryStrategy.swift */,
+ );
+ path = RetryStrategy;
+ sourceTree = "<group>";
+ };
+ F0DC77A22B2314EF0087F09D /* Shadowsocks */ = {
+ isa = PBXGroup;
+ children = (
+ F04F95A02B21D24400431E08 /* shadowsocks.h */,
+ F0DDE4132B220458006B57A7 /* ShadowsocksConfiguration.swift */,
+ F0DDE4102B220458006B57A7 /* ShadowsocksConfigurationCache.swift */,
+ F0DDE40F2B220458006B57A7 /* ShadowSocksProxy.swift */,
+ F06045E92B23217E00B2D37A /* ShadowsocksTransport.swift */,
+ );
+ path = Shadowsocks;
+ sourceTree = "<group>";
+ };
+ F0DC77A32B2315800087F09D /* Direct */ = {
+ isa = PBXGroup;
+ children = (
+ F06045E52B231EB700B2D37A /* URLSessionTransport.swift */,
+ );
+ path = Direct;
+ sourceTree = "<group>";
+ };
F0E361892A4ADCF500AEEF2B /* Welcome */ = {
isa = PBXGroup;
children = (
@@ -3156,18 +3027,11 @@
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
- 063F026E2902B63F001FA09F /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 063F02762902B63F001FA09F /* RelayCache.h in Headers */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
06799AB728F98E1D00ACD94E /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
+ F04F95A12B21D24400431E08 /* shadowsocks.h in Headers */,
06799ACE28F98E1D00ACD94E /* MullvadREST.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -3231,15 +3095,6 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
- A97F1F3C2A1F4E1A00ECEFDE /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- files = (
- A97F1F442A1F4E1A00ECEFDE /* MullvadTransport.h in Headers */,
- A93D13782A1F60A6001EB0B1 /* shadowsocks.h in Headers */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
/* End PBXHeadersBuildPhase section */
/* Begin PBXLegacyTarget section */
@@ -3260,33 +3115,12 @@
/* End PBXLegacyTarget section */
/* Begin PBXNativeTarget section */
- 063F02722902B63F001FA09F /* RelayCache */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 063F027D2902B63F001FA09F /* Build configuration list for PBXNativeTarget "RelayCache" */;
- buildPhases = (
- 063F028D2902BC8E001FA09F /* Run prebuild script */,
- 063F026E2902B63F001FA09F /* Headers */,
- 063F026F2902B63F001FA09F /* Sources */,
- 063F02702902B63F001FA09F /* Frameworks */,
- 063F02712902B63F001FA09F /* Resources */,
- );
- buildRules = (
- );
- dependencies = (
- 063F02822902B6F8001FA09F /* PBXTargetDependency */,
- 586A0DD72A20E4A9006C731C /* PBXTargetDependency */,
- );
- name = RelayCache;
- packageProductDependencies = (
- );
- productName = RelayCache;
- productReference = 063F02732902B63F001FA09F /* RelayCache.framework */;
- productType = "com.apple.product-type.framework";
- };
06799ABB28F98E1D00ACD94E /* MullvadREST */ = {
isa = PBXNativeTarget;
buildConfigurationList = 06799AD328F98E1D00ACD94E /* Build configuration list for PBXNativeTarget "MullvadREST" */;
buildPhases = (
+ F05F39962B21C704006E60A7 /* Prebuild relays */,
+ F0ACE1F32B21CB9A0045C1B8 /* Build Shadowsocks */,
06799AB728F98E1D00ACD94E /* Headers */,
06799AB828F98E1D00ACD94E /* Sources */,
06799AB928F98E1D00ACD94E /* Frameworks */,
@@ -3322,6 +3156,7 @@
buildRules = (
);
dependencies = (
+ F04F959F2B21D02700431E08 /* PBXTargetDependency */,
A91614D32B108F4D00F416EB /* PBXTargetDependency */,
);
name = TunnelObfuscation;
@@ -3347,23 +3182,6 @@
productReference = 58695A9D2A4ADA9100328DB3 /* TunnelObfuscationTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
- 5898D29729017DAC00EB5EBA /* RelaySelector */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 5898D29C29017DAC00EB5EBA /* Build configuration list for PBXNativeTarget "RelaySelector" */;
- buildPhases = (
- 5898D29429017DAC00EB5EBA /* Sources */,
- 5898D29529017DAC00EB5EBA /* Frameworks */,
- 5898D29629017DAC00EB5EBA /* CopyFiles */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = RelaySelector;
- productName = MullvadRelaySelector;
- productReference = 5898D29829017DAC00EB5EBA /* libRelaySelector.a */;
- productType = "com.apple.product-type.library.static";
- };
589A455128E094B300565204 /* OperationsTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 589A455928E094B300565204 /* Build configuration list for PBXNativeTarget "OperationsTests" */;
@@ -3462,7 +3280,6 @@
buildRules = (
);
dependencies = (
- A988DF232ADD305300D807EF /* PBXTargetDependency */,
58C7A4402A863F470060C66F /* PBXTargetDependency */,
58C7A4722A864B860060C66F /* PBXTargetDependency */,
);
@@ -3488,14 +3305,11 @@
buildRules = (
);
dependencies = (
- 58D2242E294C94830029F5F8 /* PBXTargetDependency */,
58D223E9294C8F120029F5F8 /* PBXTargetDependency */,
58D223F8294C8FF00029F5F8 /* PBXTargetDependency */,
06799AD028F98E1D00ACD94E /* PBXTargetDependency */,
58D223CF294C8BCB0029F5F8 /* PBXTargetDependency */,
- 063F02782902B63F001FA09F /* PBXTargetDependency */,
58CE5E80224146470008646E /* PBXTargetDependency */,
- A97F1F462A1F4E1A00ECEFDE /* PBXTargetDependency */,
A9EC20F22A5D79ED0040D56E /* PBXTargetDependency */,
58C7A4482A863F490060C66F /* PBXTargetDependency */,
7ABCA5B62A9349F20044A708 /* PBXTargetDependency */,
@@ -3521,13 +3335,10 @@
buildRules = (
);
dependencies = (
- A9D99BA82A1F81B100DE27D3 /* PBXTargetDependency */,
- 58D22432294C94890029F5F8 /* PBXTargetDependency */,
58D223ED294C8F3D0029F5F8 /* PBXTargetDependency */,
58D22425294C921B0029F5F8 /* PBXTargetDependency */,
062B45A628FD4FD500746E77 /* PBXTargetDependency */,
58D223C9294C8B970029F5F8 /* PBXTargetDependency */,
- 063F028C2902B83C001FA09F /* PBXTargetDependency */,
58FBDAA222A52A6800EB69A3 /* PBXTargetDependency */,
58153074294CBE8B00D1702E /* PBXTargetDependency */,
58FE25C92AA72779003D1918 /* PBXTargetDependency */,
@@ -3680,28 +3491,6 @@
productReference = 7A88DCD72A8FABBE00D2FF0E /* RoutingTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
- A97F1F402A1F4E1A00ECEFDE /* MullvadTransport */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = A97F1F4B2A1F4E1A00ECEFDE /* Build configuration list for PBXNativeTarget "MullvadTransport" */;
- buildPhases = (
- A95F86B92A1F54F800245DAC /* ShellScript */,
- A97F1F3C2A1F4E1A00ECEFDE /* Headers */,
- A97F1F3D2A1F4E1A00ECEFDE /* Sources */,
- A97F1F3E2A1F4E1A00ECEFDE /* Frameworks */,
- A97F1F3F2A1F4E1A00ECEFDE /* Resources */,
- );
- buildRules = (
- );
- dependencies = (
- A9D99BA42A1F807A00DE27D3 /* PBXTargetDependency */,
- A9D99BA22A1F807700DE27D3 /* PBXTargetDependency */,
- A9B2CF712A1F64B20013CC6C /* PBXTargetDependency */,
- );
- name = MullvadTransport;
- productName = MullvadTransport;
- productReference = A97F1F412A1F4E1A00ECEFDE /* MullvadTransport.framework */;
- productType = "com.apple.product-type.framework";
- };
/* End PBXNativeTarget section */
/* Begin PBXProject section */
@@ -3713,9 +3502,6 @@
LastUpgradeCheck = 1430;
ORGANIZATIONNAME = "Mullvad VPN AB";
TargetAttributes = {
- 063F02722902B63F001FA09F = {
- CreatedOnToolsVersion = 14.0.1;
- };
06799ABB28F98E1D00ACD94E = {
CreatedOnToolsVersion = 14.0.1;
};
@@ -3726,9 +3512,6 @@
58695A9C2A4ADA9100328DB3 = {
CreatedOnToolsVersion = 14.3.1;
};
- 5898D29729017DAC00EB5EBA = {
- CreatedOnToolsVersion = 14.1;
- };
589A455128E094B300565204 = {
CreatedOnToolsVersion = 14.0.1;
};
@@ -3790,9 +3573,6 @@
7A88DCD62A8FABBE00D2FF0E = {
CreatedOnToolsVersion = 14.3.1;
};
- A97F1F402A1F4E1A00ECEFDE = {
- CreatedOnToolsVersion = 14.3;
- };
};
};
buildConfigurationList = 58CE5E5B224146200008646E /* Build configuration list for PBXProject "MullvadVPN" */;
@@ -3821,11 +3601,8 @@
589A455128E094B300565204 /* OperationsTests */,
06799ABB28F98E1D00ACD94E /* MullvadREST */,
58FBFBE5291622580020E046 /* MullvadRESTTests */,
- 063F02722902B63F001FA09F /* RelayCache */,
- 5898D29729017DAC00EB5EBA /* RelaySelector */,
58D223D4294C8E5E0029F5F8 /* MullvadTypes */,
58D223F2294C8FF00029F5F8 /* MullvadLogging */,
- A97F1F402A1F4E1A00ECEFDE /* MullvadTransport */,
5840231E2A406BF5007B27AC /* TunnelObfuscation */,
58695A9C2A4ADA9100328DB3 /* TunnelObfuscationTests */,
58C7A4352A863F440060C66F /* PacketTunnelCore */,
@@ -3838,19 +3615,12 @@
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
- 063F02712902B63F001FA09F /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 063F028F2902BD8C001FA09F /* relays.json in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
06799ABA28F98E1D00ACD94E /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
062B45A328FD4CA700746E77 /* le_root_cert.cer in Resources */,
+ F05F39942B21C6C6006E60A7 /* relays.json in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -3959,17 +3729,10 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
- A97F1F3F2A1F4E1A00ECEFDE /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
- 063F028D2902BC8E001FA09F /* Run prebuild script */ = {
+ 580E3F212A9860F20061809D /* Run SwiftLint */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
@@ -3979,16 +3742,16 @@
);
inputPaths = (
);
- name = "Run prebuild script";
+ name = "Run SwiftLint";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "exec > $PROJECT_DIR/relays-prebuild.log 2>&1\n\n$PROJECT_DIR/relays-prebuild.sh\n";
+ shellScript = "if [[ \"$(uname -m)\" == arm64 ]]; then\n export PATH=\"/opt/homebrew/bin:$PATH\"\nfi\n\nif which swiftlint > /dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n";
};
- 580E3F212A9860F20061809D /* Run SwiftLint */ = {
+ 580E3F222A9861990061809D /* Run SwiftLint */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
@@ -4005,46 +3768,46 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "if [[ \"$(uname -m)\" == arm64 ]]; then\n export PATH=\"/opt/homebrew/bin:$PATH\"\nfi\n\nif which swiftlint > /dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n";
+ shellScript = "if [[ \"$(uname -m)\" == arm64 ]]; then\n export PATH=\"/opt/homebrew/bin:$PATH\"\nfi\n\nif which swiftlint > /dev/null; then\n swiftlint PacketTunnel/**/*.swift\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n";
};
- 580E3F222A9861990061809D /* Run SwiftLint */ = {
+ 584023262A406C01007B27AC /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
- buildActionMask = 2147483647;
+ buildActionMask = 12;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
- name = "Run SwiftLint";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "if [[ \"$(uname -m)\" == arm64 ]]; then\n export PATH=\"/opt/homebrew/bin:$PATH\"\nfi\n\nif which swiftlint > /dev/null; then\n swiftlint PacketTunnel/**/*.swift\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n";
+ shellScript = "CARGO_TARGET_DIR=${PROJECT_DIR}/../target bash ${PROJECT_DIR}/build-rust-library.sh tunnel-obfuscator-proxy\n";
};
- 584023262A406C01007B27AC /* ShellScript */ = {
+ F05F39962B21C704006E60A7 /* Prebuild relays */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
- buildActionMask = 12;
+ buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
+ name = "Prebuild relays";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "CARGO_TARGET_DIR=${PROJECT_DIR}/../target bash ${PROJECT_DIR}/build-rust-library.sh tunnel-obfuscator-proxy\n";
+ shellScript = "exec > $PROJECT_DIR/relays-prebuild.log 2>&1\n\n$PROJECT_DIR/relays-prebuild.sh\n";
};
- A95F86B92A1F54F800245DAC /* ShellScript */ = {
+ F0ACE1F32B21CB9A0045C1B8 /* Build Shadowsocks */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
@@ -4054,6 +3817,7 @@
);
inputPaths = (
);
+ name = "Build Shadowsocks";
outputFileListPaths = (
);
outputPaths = (
@@ -4065,39 +3829,42 @@
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
- 063F026F2902B63F001FA09F /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 063F027E2902B6EB001FA09F /* RelayCache.swift in Sources */,
- 063F027F2902B6EB001FA09F /* CachedRelays.swift in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
06799AB828F98E1D00ACD94E /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ F05F39982B21C73C006E60A7 /* CachedRelays.swift in Sources */,
+ F05F39972B21C735006E60A7 /* RelayCache.swift in Sources */,
06799AE728F98E4800ACD94E /* RESTURLSession.swift in Sources */,
06799AF428F98E4800ACD94E /* RESTAuthorization.swift in Sources */,
06799AE228F98E4800ACD94E /* RESTRequestFactory.swift in Sources */,
06799AEC28F98E4800ACD94E /* RESTTaskIdentifier.swift in Sources */,
58E7BA192A975DF70068EC3A /* RESTTransportProvider.swift in Sources */,
06799ADE28F98E4800ACD94E /* RESTRequestHandler.swift in Sources */,
- 06799AEF28F98E4800ACD94E /* RESTRetryStrategy.swift in Sources */,
+ F0DDE4162B220458006B57A7 /* TransportProvider.swift in Sources */,
+ 06799AEF28F98E4800ACD94E /* RetryStrategy.swift in Sources */,
06799AE128F98E4800ACD94E /* SSLPinningURLSessionDelegate.swift in Sources */,
- A9A1DE792AD5708E0073F689 /* RESTTransportStrategy.swift in Sources */,
+ A9A1DE792AD5708E0073F689 /* TransportStrategy.swift in Sources */,
+ F06045EC2B2322A500B2D37A /* Jittered.swift in Sources */,
+ F0DDE4152B220458006B57A7 /* ShadowsocksConfigurationCache.swift in Sources */,
06799AEA28F98E4800ACD94E /* RESTProxy.swift in Sources */,
06799ADD28F98E4800ACD94E /* RESTError.swift in Sources */,
06799ADB28F98E4800ACD94E /* RESTProxyFactory.swift in Sources */,
+ F0DDE4182B220458006B57A7 /* ShadowsocksConfiguration.swift in Sources */,
06799AF228F98E4800ACD94E /* RESTAccessTokenManager.swift in Sources */,
06799AF328F98E4800ACD94E /* RESTAuthenticationProxy.swift in Sources */,
+ F0DDE4142B220458006B57A7 /* ShadowSocksProxy.swift in Sources */,
+ F06045E62B231EB700B2D37A /* URLSessionTransport.swift in Sources */,
06799AE628F98E4800ACD94E /* ServerRelaysResponse.swift in Sources */,
+ F0DDE42B2B220A15006B57A7 /* RelaySelector.swift in Sources */,
+ F0DDE42C2B220A15006B57A7 /* Midpoint.swift in Sources */,
06799AF128F98E4800ACD94E /* RESTAPIProxy.swift in Sources */,
+ F0DDE42A2B220A15006B57A7 /* Haversine.swift in Sources */,
589E76C02A9378F100E502F3 /* RESTRequestExecutor.swift in Sources */,
06799AE528F98E4800ACD94E /* HTTP.swift in Sources */,
A9D99B9A2A1F7C3200DE27D3 /* RESTTransport.swift in Sources */,
06799AE028F98E4800ACD94E /* RESTCoding.swift in Sources */,
+ F06045EA2B23217E00B2D37A /* ShadowsocksTransport.swift in Sources */,
06799AFC28F98EE300ACD94E /* AddressCache.swift in Sources */,
06799AF028F98E4800ACD94E /* REST.swift in Sources */,
06799ADF28F98E4800ACD94E /* RESTDevicesProxy.swift in Sources */,
@@ -4128,16 +3895,6 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
- 5898D29429017DAC00EB5EBA /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 5898D29F29017DD000EB5EBA /* RelaySelector.swift in Sources */,
- A9EC20E62A5C488D0040D56E /* Haversine.swift in Sources */,
- A9EC20F42A5D96030040D56E /* Midpoint.swift in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
589A454E28E094B300565204 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -4752,7 +4509,6 @@
buildActionMask = 2147483647;
files = (
58B465702A98C53300467203 /* RequestExecutorTests.swift in Sources */,
- A988DF212ADD293D00D807EF /* RESTTransportStrategy.swift in Sources */,
A917352129FAAA5200D5DCFD /* TransportStrategyTests.swift in Sources */,
58FBFBE9291622580020E046 /* ExponentialBackoffTests.swift in Sources */,
58BDEB9D2A98F69E00F578F2 /* MemoryCache.swift in Sources */,
@@ -4784,19 +4540,6 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
- A97F1F3D2A1F4E1A00ECEFDE /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 5822C0052A3724A800A3A5FB /* ShadowsocksConfiguration.swift in Sources */,
- A95F86B82A1F547000245DAC /* ShadowsocksProxy.swift in Sources */,
- A95F86B72A1F53BA00245DAC /* URLSessionTransport.swift in Sources */,
- 5822C0042A3724A800A3A5FB /* ShadowsocksConfigurationCache.swift in Sources */,
- A9D99BA02A1F7F3A00DE27D3 /* TransportProvider.swift in Sources */,
- 58E0E2842A3718CE002E3420 /* URLSessionShadowsocksTransport.swift in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
@@ -4805,21 +4548,6 @@
target = 06799ABB28F98E1D00ACD94E /* MullvadREST */;
targetProxy = 58D2239E294C89B50029F5F8 /* PBXContainerItemProxy */;
};
- 063F02782902B63F001FA09F /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 063F02722902B63F001FA09F /* RelayCache */;
- targetProxy = 063F02772902B63F001FA09F /* PBXContainerItemProxy */;
- };
- 063F02822902B6F8001FA09F /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 06799ABB28F98E1D00ACD94E /* MullvadREST */;
- targetProxy = 063F02812902B6F8001FA09F /* PBXContainerItemProxy */;
- };
- 063F028C2902B83C001FA09F /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 063F02722902B63F001FA09F /* RelayCache */;
- targetProxy = 063F028B2902B83C001FA09F /* PBXContainerItemProxy */;
- };
06410DFA292C4ABC00AFC18C /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 58CE5E5F224146200008646E /* MullvadVPN */;
@@ -4850,11 +4578,6 @@
target = 5840231E2A406BF5007B27AC /* TunnelObfuscation */;
targetProxy = 58695AA22A4ADA9200328DB3 /* PBXContainerItemProxy */;
};
- 586A0DD72A20E4A9006C731C /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 06799ABB28F98E1D00ACD94E /* MullvadREST */;
- targetProxy = 586A0DD62A20E4A9006C731C /* PBXContainerItemProxy */;
- };
58B2FDD82AA71D2A003EB5C6 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 58B2FDD22AA71D2A003EB5C6 /* MullvadSettings */;
@@ -4947,16 +4670,6 @@
target = 58D223D4294C8E5E0029F5F8 /* MullvadTypes */;
targetProxy = 58D22428294C92750029F5F8 /* PBXContainerItemProxy */;
};
- 58D2242E294C94830029F5F8 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 5898D29729017DAC00EB5EBA /* RelaySelector */;
- targetProxy = 58D2242D294C94830029F5F8 /* PBXContainerItemProxy */;
- };
- 58D22432294C94890029F5F8 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 5898D29729017DAC00EB5EBA /* RelaySelector */;
- targetProxy = 58D22431294C94890029F5F8 /* PBXContainerItemProxy */;
- };
58EED36E29FBEF040000CBAF /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 58D223D4294C8E5E0029F5F8 /* MullvadTypes */;
@@ -5027,41 +4740,16 @@
target = 5840231E2A406BF5007B27AC /* TunnelObfuscation */;
targetProxy = A91D78E12B03BDE500FCD5D3 /* PBXContainerItemProxy */;
};
- A97F1F462A1F4E1A00ECEFDE /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A97F1F402A1F4E1A00ECEFDE /* MullvadTransport */;
- targetProxy = A97F1F452A1F4E1A00ECEFDE /* PBXContainerItemProxy */;
- };
- A988DF232ADD305300D807EF /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 5898D29729017DAC00EB5EBA /* RelaySelector */;
- targetProxy = A988DF222ADD305300D807EF /* PBXContainerItemProxy */;
- };
- A9B2CF712A1F64B20013CC6C /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 06799ABB28F98E1D00ACD94E /* MullvadREST */;
- targetProxy = A9B2CF702A1F64B20013CC6C /* PBXContainerItemProxy */;
- };
- A9D99BA22A1F807700DE27D3 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 063F02722902B63F001FA09F /* RelayCache */;
- targetProxy = A9D99BA12A1F807700DE27D3 /* PBXContainerItemProxy */;
- };
- A9D99BA42A1F807A00DE27D3 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 5898D29729017DAC00EB5EBA /* RelaySelector */;
- targetProxy = A9D99BA32A1F807A00DE27D3 /* PBXContainerItemProxy */;
- };
- A9D99BA82A1F81B100DE27D3 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A97F1F402A1F4E1A00ECEFDE /* MullvadTransport */;
- targetProxy = A9D99BA72A1F81B100DE27D3 /* PBXContainerItemProxy */;
- };
A9EC20F22A5D79ED0040D56E /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 5840231E2A406BF5007B27AC /* TunnelObfuscation */;
targetProxy = A9EC20F12A5D79ED0040D56E /* PBXContainerItemProxy */;
};
+ F04F959F2B21D02700431E08 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 06799ABB28F98E1D00ACD94E /* MullvadREST */;
+ targetProxy = F04F959E2B21D02700431E08 /* PBXContainerItemProxy */;
+ };
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
@@ -5076,78 +4764,6 @@
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
- 063F027B2902B63F001FA09F /* Debug */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
- buildSettings = {
- APPLICATION_EXTENSION_API_ONLY = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
- CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
- CODE_SIGN_IDENTITY = "";
- DEFINES_MODULE = YES;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 4;
- DYLIB_INSTALL_NAME_BASE = "@rpath";
- ENABLE_MODULE_VERIFIER = YES;
- GENERATE_INFOPLIST_FILE = YES;
- INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Mullvad VPN AB. All rights reserved.";
- INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- "@loader_path/Frameworks",
- );
- MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
- MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20";
- PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).RelayCache";
- PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
- SKIP_INSTALL = YES;
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
- SWIFT_EMIT_LOC_STRINGS = YES;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = "1,2";
- VERSION_INFO_PREFIX = "";
- };
- name = Debug;
- };
- 063F027C2902B63F001FA09F /* Release */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
- buildSettings = {
- APPLICATION_EXTENSION_API_ONLY = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
- CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
- CODE_SIGN_IDENTITY = "";
- DEFINES_MODULE = YES;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 4;
- DYLIB_INSTALL_NAME_BASE = "@rpath";
- ENABLE_MODULE_VERIFIER = YES;
- GENERATE_INFOPLIST_FILE = YES;
- INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Mullvad VPN AB. All rights reserved.";
- INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- "@loader_path/Frameworks",
- );
- MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
- MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20";
- PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).RelayCache";
- PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
- SKIP_INSTALL = YES;
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
- SWIFT_EMIT_LOC_STRINGS = YES;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = "1,2";
- VERSION_INFO_PREFIX = "";
- };
- name = Release;
- };
06799AD428F98E1D00ACD94E /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
@@ -5160,7 +4776,7 @@
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 4;
DYLIB_INSTALL_NAME_BASE = "@rpath";
- ENABLE_MODULE_VERIFIER = YES;
+ ENABLE_MODULE_VERIFIER = NO;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = MullvadREST/Info.plist;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Mullvad VPN AB. All rights reserved.";
@@ -5170,6 +4786,10 @@
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
+ "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios/debug";
+ "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios-sim/debug";
+ "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]" = "$(PROJECT_DIR)/../target/x86_64-apple-ios/debug";
+ MODULEMAP_PRIVATE_FILE = $PROJECT_DIR/MullvadREST/Transport/Shadowsocks/module.private.modulemap;
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20";
PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).MullvadREST";
@@ -5196,7 +4816,7 @@
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 4;
DYLIB_INSTALL_NAME_BASE = "@rpath";
- ENABLE_MODULE_VERIFIER = YES;
+ ENABLE_MODULE_VERIFIER = NO;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = MullvadREST/Info.plist;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Mullvad VPN AB. All rights reserved.";
@@ -5206,6 +4826,10 @@
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
+ "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios/release";
+ "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios-sim/release";
+ "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]" = "$(PROJECT_DIR)/../target/x86_64-apple-ios/release";
+ MODULEMAP_PRIVATE_FILE = $PROJECT_DIR/MullvadREST/Transport/Shadowsocks/module.private.modulemap;
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20";
PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).MullvadREST";
@@ -5343,34 +4967,6 @@
};
name = Release;
};
- 5898D29D29017DAC00EB5EBA /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- APPLICATION_EXTENSION_API_ONLY = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
- CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
- OTHER_LDFLAGS = "-ObjC";
- PRODUCT_NAME = "$(TARGET_NAME)";
- SKIP_INSTALL = YES;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = "1,2";
- };
- name = Debug;
- };
- 5898D29E29017DAC00EB5EBA /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- APPLICATION_EXTENSION_API_ONLY = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
- CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
- OTHER_LDFLAGS = "-ObjC";
- PRODUCT_NAME = "$(TARGET_NAME)";
- SKIP_INSTALL = YES;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = "1,2";
- };
- name = Release;
- };
589A455A28E094B300565204 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
@@ -5596,7 +5192,6 @@
58C7A44F2A863F4A0060C66F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic;
@@ -5618,7 +5213,6 @@
58C7A4502A863F4A0060C66F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic;
@@ -6279,112 +5873,9 @@
};
name = Release;
};
- A97F1F492A1F4E1A00ECEFDE /* Debug */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
- buildSettings = {
- APPLICATION_EXTENSION_API_ONLY = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
- CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
- CODE_SIGN_IDENTITY = "";
- CODE_SIGN_STYLE = Manual;
- CURRENT_PROJECT_VERSION = 1;
- DEFINES_MODULE = YES;
- DEVELOPMENT_TEAM = "";
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- DYLIB_INSTALL_NAME_BASE = "@rpath";
- ENABLE_MODULE_VERIFIER = NO;
- GENERATE_INFOPLIST_FILE = YES;
- INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2023 Mullvad VPN AB. All rights reserved.";
- INFOPLIST_OTHER_PREPROCESSOR_FLAGS = MullvadTransport/Info.plist;
- INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- "@loader_path/Frameworks",
- );
- "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios/debug";
- "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios-sim/debug";
- "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]" = "$(PROJECT_DIR)/../target/x86_64-apple-ios/debug";
- MARKETING_VERSION = 2023.2;
- MODULEMAP_PRIVATE_FILE = $PROJECT_DIR/MullvadTransport/module.private.modulemap;
- MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
- MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20";
- PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).MullvadTransport";
- PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
- PROVISIONING_PROFILE_SPECIFIER = "";
- SKIP_INSTALL = YES;
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
- SWIFT_EMIT_LOC_STRINGS = YES;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = "1,2";
- VERSIONING_SYSTEM = "apple-generic";
- VERSION_INFO_PREFIX = "";
- };
- name = Debug;
- };
- A97F1F4A2A1F4E1A00ECEFDE /* Release */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
- buildSettings = {
- APPLICATION_EXTENSION_API_ONLY = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
- CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
- CODE_SIGN_IDENTITY = "";
- CODE_SIGN_STYLE = Manual;
- CURRENT_PROJECT_VERSION = 1;
- DEFINES_MODULE = YES;
- DEVELOPMENT_TEAM = "";
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- DYLIB_INSTALL_NAME_BASE = "@rpath";
- ENABLE_MODULE_VERIFIER = NO;
- GENERATE_INFOPLIST_FILE = YES;
- INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2023 Mullvad VPN AB. All rights reserved.";
- INFOPLIST_OTHER_PREPROCESSOR_FLAGS = MullvadTransport/Info.plist;
- INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- "@loader_path/Frameworks",
- );
- "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios/release";
- "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/../target/aarch64-apple-ios-sim/release";
- "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]" = "$(PROJECT_DIR)/../target/x86_64-apple-ios/release";
- MARKETING_VERSION = 2023.2;
- MODULEMAP_PRIVATE_FILE = $PROJECT_DIR/MullvadTransport/module.private.modulemap;
- MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
- MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20";
- PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).MullvadTransport";
- PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
- PROVISIONING_PROFILE_SPECIFIER = "";
- SKIP_INSTALL = YES;
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
- SWIFT_EMIT_LOC_STRINGS = YES;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = "1,2";
- VERSIONING_SYSTEM = "apple-generic";
- VERSION_INFO_PREFIX = "";
- };
- name = Release;
- };
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
- 063F027D2902B63F001FA09F /* Build configuration list for PBXNativeTarget "RelayCache" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 063F027B2902B63F001FA09F /* Debug */,
- 063F027C2902B63F001FA09F /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
06799AD328F98E1D00ACD94E /* Build configuration list for PBXNativeTarget "MullvadREST" */ = {
isa = XCConfigurationList;
buildConfigurations = (
@@ -6412,15 +5903,6 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- 5898D29C29017DAC00EB5EBA /* Build configuration list for PBXNativeTarget "RelaySelector" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 5898D29D29017DAC00EB5EBA /* Debug */,
- 5898D29E29017DAC00EB5EBA /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
589A455928E094B300565204 /* Build configuration list for PBXNativeTarget "OperationsTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
@@ -6565,15 +6047,6 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- A97F1F4B2A1F4E1A00ECEFDE /* Build configuration list for PBXNativeTarget "MullvadTransport" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- A97F1F492A1F4E1A00ECEFDE /* Debug */,
- A97F1F4A2A1F4E1A00ECEFDE /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
diff --git a/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadTransport.xcscheme b/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadTransport.xcscheme
deleted file mode 100644
index ede26eb6d4..0000000000
--- a/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadTransport.xcscheme
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
- LastUpgradeVersion = "1430"
- version = "1.7">
- <BuildAction
- parallelizeBuildables = "YES"
- buildImplicitDependencies = "YES">
- <BuildActionEntries>
- <BuildActionEntry
- buildForTesting = "YES"
- buildForRunning = "YES"
- buildForProfiling = "YES"
- buildForArchiving = "YES"
- buildForAnalyzing = "YES">
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "A97F1F402A1F4E1A00ECEFDE"
- BuildableName = "MullvadTransport.framework"
- BlueprintName = "MullvadTransport"
- ReferencedContainer = "container:MullvadVPN.xcodeproj">
- </BuildableReference>
- </BuildActionEntry>
- </BuildActionEntries>
- </BuildAction>
- <TestAction
- buildConfiguration = "Debug"
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
- shouldUseLaunchSchemeArgsEnv = "YES">
- <TestPlans>
- <TestPlanReference
- reference = "container:TestPlans/MullvadVPNApp.xctestplan"
- default = "YES">
- </TestPlanReference>
- <TestPlanReference
- reference = "container:TestPlans/MullvadVPNCI.xctestplan">
- </TestPlanReference>
- </TestPlans>
- </TestAction>
- <LaunchAction
- buildConfiguration = "Debug"
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
- launchStyle = "0"
- useCustomWorkingDirectory = "NO"
- ignoresPersistentStateOnLaunch = "NO"
- debugDocumentVersioning = "YES"
- debugServiceExtension = "internal"
- allowLocationSimulation = "YES">
- </LaunchAction>
- <ProfileAction
- buildConfiguration = "Release"
- shouldUseLaunchSchemeArgsEnv = "YES"
- savedToolIdentifier = ""
- useCustomWorkingDirectory = "NO"
- debugDocumentVersioning = "YES">
- <MacroExpansion>
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "A97F1F402A1F4E1A00ECEFDE"
- BuildableName = "MullvadTransport.framework"
- BlueprintName = "MullvadTransport"
- ReferencedContainer = "container:MullvadVPN.xcodeproj">
- </BuildableReference>
- </MacroExpansion>
- </ProfileAction>
- <AnalyzeAction
- buildConfiguration = "Debug">
- </AnalyzeAction>
- <ArchiveAction
- buildConfiguration = "Release"
- revealArchiveInOrganizer = "YES">
- </ArchiveAction>
-</Scheme>
diff --git a/ios/MullvadVPN/AppDelegate.swift b/ios/MullvadVPN/AppDelegate.swift
index ec1ae45900..2a7e869888 100644
--- a/ios/MullvadVPN/AppDelegate.swift
+++ b/ios/MullvadVPN/AppDelegate.swift
@@ -10,10 +10,8 @@ import BackgroundTasks
import MullvadLogging
import MullvadREST
import MullvadSettings
-import MullvadTransport
import MullvadTypes
import Operations
-import RelayCache
import StoreKit
import UIKit
import UserNotifications
diff --git a/ios/MullvadVPN/Coordinators/ApplicationCoordinator.swift b/ios/MullvadVPN/Coordinators/ApplicationCoordinator.swift
index eb2e8be7b7..077214fc39 100644
--- a/ios/MullvadVPN/Coordinators/ApplicationCoordinator.swift
+++ b/ios/MullvadVPN/Coordinators/ApplicationCoordinator.swift
@@ -10,7 +10,6 @@ import Combine
import MullvadREST
import MullvadSettings
import MullvadTypes
-import RelayCache
import Routing
import UIKit
diff --git a/ios/MullvadVPN/Coordinators/RelayFilterCoordinator.swift b/ios/MullvadVPN/Coordinators/RelayFilterCoordinator.swift
index 742e82bc05..deb57141e4 100644
--- a/ios/MullvadVPN/Coordinators/RelayFilterCoordinator.swift
+++ b/ios/MullvadVPN/Coordinators/RelayFilterCoordinator.swift
@@ -6,8 +6,8 @@
// Copyright © 2023 Mullvad VPN AB. All rights reserved.
//
+import MullvadREST
import MullvadTypes
-import RelayCache
import Routing
import UIKit
diff --git a/ios/MullvadVPN/Coordinators/SelectLocationCoordinator.swift b/ios/MullvadVPN/Coordinators/SelectLocationCoordinator.swift
index 92a4dbb150..59cb2a644a 100644
--- a/ios/MullvadVPN/Coordinators/SelectLocationCoordinator.swift
+++ b/ios/MullvadVPN/Coordinators/SelectLocationCoordinator.swift
@@ -6,8 +6,8 @@
// Copyright © 2023 Mullvad VPN AB. All rights reserved.
//
+import MullvadREST
import MullvadTypes
-import RelayCache
import Routing
import UIKit
diff --git a/ios/MullvadVPN/RelayCacheTracker/RelayCacheTracker.swift b/ios/MullvadVPN/RelayCacheTracker/RelayCacheTracker.swift
index 7f17a5b8da..eb9050318f 100644
--- a/ios/MullvadVPN/RelayCacheTracker/RelayCacheTracker.swift
+++ b/ios/MullvadVPN/RelayCacheTracker/RelayCacheTracker.swift
@@ -11,7 +11,6 @@ import MullvadLogging
import MullvadREST
import MullvadTypes
import Operations
-import RelayCache
import UIKit
protocol RelayCacheTrackerProtocol {
diff --git a/ios/MullvadVPN/RelayCacheTracker/RelayCacheTrackerObserver.swift b/ios/MullvadVPN/RelayCacheTracker/RelayCacheTrackerObserver.swift
index fcb38b55d6..802e293f1a 100644
--- a/ios/MullvadVPN/RelayCacheTracker/RelayCacheTrackerObserver.swift
+++ b/ios/MullvadVPN/RelayCacheTracker/RelayCacheTrackerObserver.swift
@@ -7,7 +7,7 @@
//
import Foundation
-import RelayCache
+import MullvadREST
protocol RelayCacheTrackerObserver: AnyObject {
func relayCacheTracker(
diff --git a/ios/MullvadVPN/SceneDelegate.swift b/ios/MullvadVPN/SceneDelegate.swift
index d09d147a92..0719559d70 100644
--- a/ios/MullvadVPN/SceneDelegate.swift
+++ b/ios/MullvadVPN/SceneDelegate.swift
@@ -11,7 +11,6 @@ import MullvadREST
import MullvadSettings
import MullvadTypes
import Operations
-import RelayCache
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate, SettingsMigrationUIHandler {
diff --git a/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift b/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift
index 86e4d83030..93e17e7af9 100644
--- a/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift
+++ b/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift
@@ -12,12 +12,9 @@ import Foundation
import MullvadLogging
import MullvadREST
import MullvadSettings
-import MullvadTransport
import MullvadTypes
import NetworkExtension
import PacketTunnelCore
-import RelayCache
-import RelaySelector
final class SimulatorTunnelProviderHost: SimulatorTunnelProviderDelegate {
private var observedState: ObservedState = .disconnected
diff --git a/ios/MullvadVPN/TransportMonitor/PacketTunnelTransport.swift b/ios/MullvadVPN/TransportMonitor/PacketTunnelTransport.swift
index 15af753a6a..713fc4f54d 100644
--- a/ios/MullvadVPN/TransportMonitor/PacketTunnelTransport.swift
+++ b/ios/MullvadVPN/TransportMonitor/PacketTunnelTransport.swift
@@ -8,7 +8,6 @@
import Foundation
import MullvadREST
-import MullvadTransport
import MullvadTypes
import Operations
import PacketTunnelCore
diff --git a/ios/MullvadVPN/TransportMonitor/TransportMonitor.swift b/ios/MullvadVPN/TransportMonitor/TransportMonitor.swift
index a89a02977c..c2bbcfb735 100644
--- a/ios/MullvadVPN/TransportMonitor/TransportMonitor.swift
+++ b/ios/MullvadVPN/TransportMonitor/TransportMonitor.swift
@@ -9,10 +9,7 @@
import Foundation
import MullvadLogging
import MullvadREST
-import MullvadTransport
import MullvadTypes
-import RelayCache
-import RelaySelector
final class TransportMonitor: RESTTransportProvider {
private let tunnelManager: TunnelManager
diff --git a/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift b/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift
index 5f4aa8ec51..9474a0a481 100644
--- a/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift
+++ b/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift
@@ -8,11 +8,10 @@
import Foundation
import MullvadLogging
+import MullvadREST
import NetworkExtension
import Operations
import PacketTunnelCore
-import RelayCache
-import RelaySelector
class StartTunnelOperation: ResultOperation<Void> {
typealias EncodeErrorHandler = (Error) -> Void
diff --git a/ios/MullvadVPN/TunnelManager/Tunnel+Messaging.swift b/ios/MullvadVPN/TunnelManager/Tunnel+Messaging.swift
index a553b0d0af..5299a281cc 100644
--- a/ios/MullvadVPN/TunnelManager/Tunnel+Messaging.swift
+++ b/ios/MullvadVPN/TunnelManager/Tunnel+Messaging.swift
@@ -11,7 +11,6 @@ import MullvadREST
import MullvadTypes
import Operations
import PacketTunnelCore
-import RelaySelector
/// Shared operation queue used for IPC requests.
private let operationQueue = AsyncOperationQueue()
diff --git a/ios/MullvadVPN/TunnelManager/TunnelManager.swift b/ios/MullvadVPN/TunnelManager/TunnelManager.swift
index c6c4b73234..960cfd2a8a 100644
--- a/ios/MullvadVPN/TunnelManager/TunnelManager.swift
+++ b/ios/MullvadVPN/TunnelManager/TunnelManager.swift
@@ -14,8 +14,6 @@ import MullvadTypes
import NetworkExtension
import Operations
import PacketTunnelCore
-import RelayCache
-import RelaySelector
import StoreKit
import UIKit
import WireGuardKitTypes
diff --git a/ios/MullvadVPN/View controllers/Preferences/PreferencesInteractor.swift b/ios/MullvadVPN/View controllers/Preferences/PreferencesInteractor.swift
index 7b52ba795d..96958f2674 100644
--- a/ios/MullvadVPN/View controllers/Preferences/PreferencesInteractor.swift
+++ b/ios/MullvadVPN/View controllers/Preferences/PreferencesInteractor.swift
@@ -7,8 +7,8 @@
//
import Foundation
+import MullvadREST
import MullvadSettings
-import RelayCache
final class PreferencesInteractor {
private let tunnelManager: TunnelManager
diff --git a/ios/MullvadVPN/View controllers/RelayFilter/RelayFilterDataSource.swift b/ios/MullvadVPN/View controllers/RelayFilter/RelayFilterDataSource.swift
index 8c74b0559c..3d0653f569 100644
--- a/ios/MullvadVPN/View controllers/RelayFilter/RelayFilterDataSource.swift
+++ b/ios/MullvadVPN/View controllers/RelayFilter/RelayFilterDataSource.swift
@@ -9,7 +9,6 @@
import Combine
import MullvadREST
import MullvadTypes
-import RelayCache
import UIKit
final class RelayFilterDataSource: UITableViewDiffableDataSource<
diff --git a/ios/MullvadVPN/View controllers/RelayFilter/RelayFilterViewController.swift b/ios/MullvadVPN/View controllers/RelayFilter/RelayFilterViewController.swift
index f9c19c96a7..8728a4761b 100644
--- a/ios/MullvadVPN/View controllers/RelayFilter/RelayFilterViewController.swift
+++ b/ios/MullvadVPN/View controllers/RelayFilter/RelayFilterViewController.swift
@@ -7,8 +7,8 @@
//
import Combine
+import MullvadREST
import MullvadTypes
-import RelayCache
import UIKit
class RelayFilterViewController: UIViewController {
diff --git a/ios/MullvadVPN/View controllers/SelectLocation/LocationDataSource.swift b/ios/MullvadVPN/View controllers/SelectLocation/LocationDataSource.swift
index a5032402f2..e3891d214d 100644
--- a/ios/MullvadVPN/View controllers/SelectLocation/LocationDataSource.swift
+++ b/ios/MullvadVPN/View controllers/SelectLocation/LocationDataSource.swift
@@ -8,7 +8,6 @@
import MullvadREST
import MullvadTypes
-import RelaySelector
import UIKit
protocol LocationDataSourceItemProtocol {
diff --git a/ios/MullvadVPN/View controllers/SelectLocation/SelectLocationViewController.swift b/ios/MullvadVPN/View controllers/SelectLocation/SelectLocationViewController.swift
index f1bb9dce4e..b19fef0df6 100644
--- a/ios/MullvadVPN/View controllers/SelectLocation/SelectLocationViewController.swift
+++ b/ios/MullvadVPN/View controllers/SelectLocation/SelectLocationViewController.swift
@@ -7,8 +7,8 @@
//
import MullvadLogging
+import MullvadREST
import MullvadTypes
-import RelayCache
import UIKit
final class SelectLocationViewController: UIViewController {
diff --git a/ios/MullvadVPN/View controllers/Settings/SettingsInteractorFactory.swift b/ios/MullvadVPN/View controllers/Settings/SettingsInteractorFactory.swift
index 3454516808..af9faeb52e 100644
--- a/ios/MullvadVPN/View controllers/Settings/SettingsInteractorFactory.swift
+++ b/ios/MullvadVPN/View controllers/Settings/SettingsInteractorFactory.swift
@@ -8,7 +8,6 @@
import Foundation
import MullvadREST
-import RelayCache
final class SettingsInteractorFactory {
private let storePaymentManager: StorePaymentManager
diff --git a/ios/MullvadVPNTests/CoordinatesTests.swift b/ios/MullvadVPNTests/CoordinatesTests.swift
index 6466537ca2..816b511794 100644
--- a/ios/MullvadVPNTests/CoordinatesTests.swift
+++ b/ios/MullvadVPNTests/CoordinatesTests.swift
@@ -7,7 +7,7 @@
//
import CoreLocation
-@testable import RelaySelector
+@testable import MullvadREST
import XCTest
final class CoordinatesTests: XCTestCase {
diff --git a/ios/MullvadVPNTests/RelayCacheTests.swift b/ios/MullvadVPNTests/RelayCacheTests.swift
index 03899e543b..153f4738ee 100644
--- a/ios/MullvadVPNTests/RelayCacheTests.swift
+++ b/ios/MullvadVPNTests/RelayCacheTests.swift
@@ -7,8 +7,6 @@
//
@testable import MullvadREST
-import MullvadTransport
-@testable import RelayCache
import XCTest
final class RelayCacheTests: XCTestCase {
diff --git a/ios/MullvadVPNTests/RelayCacheTracker+Stubs.swift b/ios/MullvadVPNTests/RelayCacheTracker+Stubs.swift
index ef6fcd9ab6..4adcccecec 100644
--- a/ios/MullvadVPNTests/RelayCacheTracker+Stubs.swift
+++ b/ios/MullvadVPNTests/RelayCacheTracker+Stubs.swift
@@ -7,8 +7,8 @@
//
import Foundation
+@testable import MullvadREST
@testable import MullvadTypes
-@testable import RelayCache
struct RelayCacheTrackerStub: RelayCacheTrackerProtocol {
func startPeriodicUpdates() {}
diff --git a/ios/MullvadVPNTests/RelaySelectorTests.swift b/ios/MullvadVPNTests/RelaySelectorTests.swift
index e3ec34e1f4..68bfadfd4c 100644
--- a/ios/MullvadVPNTests/RelaySelectorTests.swift
+++ b/ios/MullvadVPNTests/RelaySelectorTests.swift
@@ -9,7 +9,6 @@
@testable import MullvadREST
import MullvadTypes
import Network
-import RelaySelector
import XCTest
private let portRanges: [[UInt16]] = [[4000, 4001], [5000, 5001]]
diff --git a/ios/PacketTunnel/PacketTunnelProvider/BlockedStateErrorMapper.swift b/ios/PacketTunnel/PacketTunnelProvider/BlockedStateErrorMapper.swift
index decf72b1bc..5038839fa5 100644
--- a/ios/PacketTunnel/PacketTunnelProvider/BlockedStateErrorMapper.swift
+++ b/ios/PacketTunnel/PacketTunnelProvider/BlockedStateErrorMapper.swift
@@ -11,7 +11,6 @@ import MullvadREST
import MullvadSettings
import MullvadTypes
import PacketTunnelCore
-import RelaySelector
import WireGuardKit
/**
diff --git a/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift b/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift
index 25f37358e2..cd3ccc8bd1 100644
--- a/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift
+++ b/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift
@@ -9,11 +9,9 @@
import Foundation
import MullvadLogging
import MullvadREST
-import MullvadTransport
import MullvadTypes
import NetworkExtension
import PacketTunnelCore
-import RelayCache
import TunnelObfuscation
class PacketTunnelProvider: NEPacketTunnelProvider {
diff --git a/ios/PacketTunnel/PacketTunnelProvider/RelaySelectorWrapper.swift b/ios/PacketTunnel/PacketTunnelProvider/RelaySelectorWrapper.swift
index cedeb1ea7b..5127e0a55b 100644
--- a/ios/PacketTunnel/PacketTunnelProvider/RelaySelectorWrapper.swift
+++ b/ios/PacketTunnel/PacketTunnelProvider/RelaySelectorWrapper.swift
@@ -7,10 +7,9 @@
//
import Foundation
+import MullvadREST
import MullvadTypes
import PacketTunnelCore
-import RelayCache
-import RelaySelector
struct RelaySelectorWrapper: RelaySelectorProtocol {
let relayCache: RelayCache
diff --git a/ios/PacketTunnelCoreTests/AppMessageHandlerTests.swift b/ios/PacketTunnelCoreTests/AppMessageHandlerTests.swift
index 79562eec28..21291f6334 100644
--- a/ios/PacketTunnelCoreTests/AppMessageHandlerTests.swift
+++ b/ios/PacketTunnelCoreTests/AppMessageHandlerTests.swift
@@ -10,7 +10,6 @@ import Combine
@testable import MullvadREST
import MullvadTypes
import PacketTunnelCore
-import RelaySelector
import XCTest
final class AppMessageHandlerTests: XCTestCase {
diff --git a/ios/PacketTunnelCoreTests/PacketTunnelActorTests.swift b/ios/PacketTunnelCoreTests/PacketTunnelActorTests.swift
index dccadc3442..b80d92df95 100644
--- a/ios/PacketTunnelCoreTests/PacketTunnelActorTests.swift
+++ b/ios/PacketTunnelCoreTests/PacketTunnelActorTests.swift
@@ -7,11 +7,11 @@
//
import Combine
+@testable import MullvadREST
@testable import MullvadSettings
import MullvadTypes
import Network
@testable import PacketTunnelCore
-@testable import RelaySelector
import WireGuardKitTypes
import XCTest
diff --git a/ios/RelayCache/Assets/.gitkeep b/ios/RelayCache/Assets/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
--- a/ios/RelayCache/Assets/.gitkeep
+++ /dev/null
diff --git a/ios/RelayCache/RelayCache.h b/ios/RelayCache/RelayCache.h
deleted file mode 100644
index abe3d1b983..0000000000
--- a/ios/RelayCache/RelayCache.h
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// RelayCache.h
-// RelayCache
-//
-// Created by Sajad Vishkai on 2022-10-21.
-// Copyright © 2022 Mullvad VPN AB. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-//! Project version number for RelayCache.
-FOUNDATION_EXPORT double RelayCacheVersionNumber;
-
-//! Project version string for RelayCache.
-FOUNDATION_EXPORT const unsigned char RelayCacheVersionString[];
-
-// In this header, you should import all the public headers of your framework using statements like #import <RelayCache/PublicHeader.h>
-
-
diff --git a/ios/relays-prebuild.sh b/ios/relays-prebuild.sh
index caef0efe4a..1ed8b9cf40 100755
--- a/ios/relays-prebuild.sh
+++ b/ios/relays-prebuild.sh
@@ -5,7 +5,7 @@ if [ -z "$PROJECT_DIR" ]; then
exit 1
fi
-RELAYS_FILE="$PROJECT_DIR/RelayCache/Assets/relays.json"
+RELAYS_FILE="$PROJECT_DIR/MullvadREST/Assets/relays.json"
if [ $CONFIGURATION == "Release" ]; then
echo "Remove relays file"